From ca5d60d267051b4b75e22763ad8eda06f0501451 Mon Sep 17 00:00:00 2001
From: Sean Hall <r.sean.hall@gmail.com>
Date: Wed, 2 Dec 2020 22:38:23 -0600
Subject: WIXFEAT:4626,5386 - Add more BA events.

OnBeginMsiTransactionBegin, OnBeginMsiTransactionComplete, OnCommitMsiTransactionBegin, OnCommitMsiTransactionComplete, OnRollbackMsiTransactionBegin, OnRollbackMsiTransactionComplete, OnPauseAutomaticUpdatesBegin, OnPauseAutomaticUpdatesComplete, OnSystemRestorePointBegin, OnSystemRestorePointComplete
---
 src/WixToolset.Mba.Core/BootstrapperApplication.cs | 278 ++++++++++++++++++++-
 src/WixToolset.Mba.Core/EventArgs.cs               | 191 +++++++++++++-
 .../IBootstrapperApplication.cs                    |  64 ++++-
 .../IDefaultBootstrapperApplication.cs             |  15 +-
 src/balutil/balutil.vcxproj                        |   8 +-
 src/balutil/inc/BAFunctions.h                      |  10 +
 src/balutil/inc/BalBaseBAFunctions.h               |  73 ++++++
 src/balutil/inc/BalBaseBAFunctionsProc.h           |  10 +
 src/balutil/inc/BalBaseBootstrapperApplication.h   |  75 ++++++
 .../inc/BalBaseBootstrapperApplicationProc.h       | 119 +++++++++
 src/balutil/inc/IBootstrapperApplication.h         |  43 ++++
 src/balutil/packages.config                        |   4 +-
 src/bextutil/bextutil.vcxproj                      |   8 +-
 src/bextutil/packages.config                       |   4 +-
 src/mbanative/mbanative.vcxproj                    |   8 +-
 src/mbanative/packages.config                      |   4 +-
 src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj   |   8 +-
 src/test/BalUtilUnitTest/packages.config           |   4 +-
 src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj |   8 +-
 src/test/BextUtilUnitTest/packages.config          |   4 +-
 20 files changed, 893 insertions(+), 45 deletions(-)

(limited to 'src')

diff --git a/src/WixToolset.Mba.Core/BootstrapperApplication.cs b/src/WixToolset.Mba.Core/BootstrapperApplication.cs
index 472c553a..2d527427 100644
--- a/src/WixToolset.Mba.Core/BootstrapperApplication.cs
+++ b/src/WixToolset.Mba.Core/BootstrapperApplication.cs
@@ -320,12 +320,62 @@ namespace WixToolset.Mba.Core
         /// <summary>
         /// Fired when the engine is about to launch the preapproved executable.
         /// </summary>
-        public event EventHandler<LaunchApprovedExeBeginArgs> LaunchApprovedExeBegin;
+        public event EventHandler<LaunchApprovedExeBeginEventArgs> LaunchApprovedExeBegin;
 
         /// <summary>
         /// Fired when the engine has completed launching the preapproved executable.
         /// </summary>
-        public event EventHandler<LaunchApprovedExeCompleteArgs> LaunchApprovedExeComplete;
+        public event EventHandler<LaunchApprovedExeCompleteEventArgs> LaunchApprovedExeComplete;
+
+        /// <summary>
+        /// Fired when the engine is about to begin an MSI transaction.
+        /// </summary>
+        public event EventHandler<BeginMsiTransactionBeginEventArgs> BeginMsiTransactionBegin;
+
+        /// <summary>
+        /// Fired when the engine has completed beginning an MSI transaction.
+        /// </summary>
+        public event EventHandler<BeginMsiTransactionCompleteEventArgs> BeginMsiTransactionComplete;
+
+        /// <summary>
+        /// Fired when the engine is about to commit an MSI transaction.
+        /// </summary>
+        public event EventHandler<CommitMsiTransactionBeginEventArgs> CommitMsiTransactionBegin;
+
+        /// <summary>
+        /// Fired when the engine has completed comitting an MSI transaction.
+        /// </summary>
+        public event EventHandler<CommitMsiTransactionCompleteEventArgs> CommitMsiTransactionComplete;
+
+        /// <summary>
+        /// Fired when the engine is about to rollback an MSI transaction.
+        /// </summary>
+        public event EventHandler<RollbackMsiTransactionBeginEventArgs> RollbackMsiTransactionBegin;
+
+        /// <summary>
+        /// Fired when the engine has completed rolling back an MSI transaction.
+        /// </summary>
+        public event EventHandler<RollbackMsiTransactionCompleteEventArgs> RollbackMsiTransactionComplete;
+
+        /// <summary>
+        /// Fired when the engine is about to pause Windows automatic updates.
+        /// </summary>
+        public event EventHandler<PauseAutomaticUpdatesBeginEventArgs> PauseAutomaticUpdatesBegin;
+
+        /// <summary>
+        /// Fired when the engine has completed pausing Windows automatic updates.
+        /// </summary>
+        public event EventHandler<PauseAutomaticUpdatesCompleteEventArgs> PauseAutomaticUpdatesComplete;
+
+        /// <summary>
+        /// Fired when the engine is about to take a system restore point.
+        /// </summary>
+        public event EventHandler<SystemRestorePointBeginEventArgs> SystemRestorePointBegin;
+
+        /// <summary>
+        /// Fired when the engine has completed taking a system restore point.
+        /// </summary>
+        public event EventHandler<SystemRestorePointCompleteEventArgs> SystemRestorePointComplete;
 
         /// <summary>
         /// Entry point that is called when the bootstrapper application is ready to run.
@@ -1071,9 +1121,9 @@ namespace WixToolset.Mba.Core
         /// Called by the engine before trying to launch the preapproved executable.
         /// </summary>
         /// <param name="args">Additional arguments for this event.</param>
-        protected virtual void OnLaunchApprovedExeBegin(LaunchApprovedExeBeginArgs args)
+        protected virtual void OnLaunchApprovedExeBegin(LaunchApprovedExeBeginEventArgs args)
         {
-            EventHandler<LaunchApprovedExeBeginArgs> handler = this.LaunchApprovedExeBegin;
+            EventHandler<LaunchApprovedExeBeginEventArgs> handler = this.LaunchApprovedExeBegin;
             if (null != handler)
             {
                 handler(this, args);
@@ -1084,9 +1134,139 @@ namespace WixToolset.Mba.Core
         /// Called by the engine after trying to launch the preapproved executable.
         /// </summary>
         /// <param name="args">Additional arguments for this event.</param>
-        protected virtual void OnLaunchApprovedExeComplete(LaunchApprovedExeCompleteArgs args)
+        protected virtual void OnLaunchApprovedExeComplete(LaunchApprovedExeCompleteEventArgs args)
+        {
+            EventHandler<LaunchApprovedExeCompleteEventArgs> handler = this.LaunchApprovedExeComplete;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine before beginning an MSI transaction.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnBeginMsiTransactionBegin(BeginMsiTransactionBeginEventArgs args)
+        {
+            EventHandler<BeginMsiTransactionBeginEventArgs> handler = this.BeginMsiTransactionBegin;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine after beginning an MSI transaction.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnBeginMsiTransactionComplete(BeginMsiTransactionCompleteEventArgs args)
+        {
+            EventHandler<BeginMsiTransactionCompleteEventArgs> handler = this.BeginMsiTransactionComplete;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine before committing an MSI transaction.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnCommitMsiTransactionBegin(CommitMsiTransactionBeginEventArgs args)
+        {
+            EventHandler<CommitMsiTransactionBeginEventArgs> handler = this.CommitMsiTransactionBegin;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine after committing an MSI transaction.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnCommitMsiTransactionComplete(CommitMsiTransactionCompleteEventArgs args)
+        {
+            EventHandler<CommitMsiTransactionCompleteEventArgs> handler = this.CommitMsiTransactionComplete;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine before rolling back an MSI transaction.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnRollbackMsiTransactionBegin(RollbackMsiTransactionBeginEventArgs args)
+        {
+            EventHandler<RollbackMsiTransactionBeginEventArgs> handler = this.RollbackMsiTransactionBegin;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine after rolling back an MSI transaction.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnRollbackMsiTransactionComplete(RollbackMsiTransactionCompleteEventArgs args)
+        {
+            EventHandler<RollbackMsiTransactionCompleteEventArgs> handler = this.RollbackMsiTransactionComplete;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine before pausing Windows automatic updates.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnPauseAutomaticUpdatesBegin(PauseAutomaticUpdatesBeginEventArgs args)
+        {
+            EventHandler<PauseAutomaticUpdatesBeginEventArgs> handler = this.PauseAutomaticUpdatesBegin;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine after pausing Windows automatic updates.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnPauseAutomaticUpdatesComplete(PauseAutomaticUpdatesCompleteEventArgs args)
+        {
+            EventHandler<PauseAutomaticUpdatesCompleteEventArgs> handler = this.PauseAutomaticUpdatesComplete;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine before taking a system restore point.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnSystemRestorePointBegin(SystemRestorePointBeginEventArgs args)
         {
-            EventHandler<LaunchApprovedExeCompleteArgs> handler = this.LaunchApprovedExeComplete;
+            EventHandler<SystemRestorePointBeginEventArgs> handler = this.SystemRestorePointBegin;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
+        /// <summary>
+        /// Called by the engine after taking a system restore point.
+        /// </summary>
+        /// <param name="args">Additional arguments for this event.</param>
+        protected virtual void OnSystemRestorePointComplete(SystemRestorePointCompleteEventArgs args)
+        {
+            EventHandler<SystemRestorePointCompleteEventArgs> handler = this.SystemRestorePointComplete;
             if (null != handler)
             {
                 handler(this, args);
@@ -1588,7 +1768,7 @@ namespace WixToolset.Mba.Core
 
         int IBootstrapperApplication.OnLaunchApprovedExeBegin(ref bool fCancel)
         {
-            LaunchApprovedExeBeginArgs args = new LaunchApprovedExeBeginArgs(fCancel);
+            LaunchApprovedExeBeginEventArgs args = new LaunchApprovedExeBeginEventArgs(fCancel);
             this.OnLaunchApprovedExeBegin(args);
 
             fCancel = args.Cancel;
@@ -1597,12 +1777,94 @@ namespace WixToolset.Mba.Core
 
         int IBootstrapperApplication.OnLaunchApprovedExeComplete(int hrStatus, int processId)
         {
-            LaunchApprovedExeCompleteArgs args = new LaunchApprovedExeCompleteArgs(hrStatus, processId);
+            LaunchApprovedExeCompleteEventArgs args = new LaunchApprovedExeCompleteEventArgs(hrStatus, processId);
             this.OnLaunchApprovedExeComplete(args);
 
             return args.HResult;
         }
 
+        int IBootstrapperApplication.OnBeginMsiTransactionBegin(string transactionId, ref bool fCancel)
+        {
+            BeginMsiTransactionBeginEventArgs args = new BeginMsiTransactionBeginEventArgs(transactionId, fCancel);
+            this.OnBeginMsiTransactionBegin(args);
+
+            fCancel = args.Cancel;
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnBeginMsiTransactionComplete(string transactionId, int hrStatus)
+        {
+            BeginMsiTransactionCompleteEventArgs args = new BeginMsiTransactionCompleteEventArgs(transactionId, hrStatus);
+            this.OnBeginMsiTransactionComplete(args);
+
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnCommitMsiTransactionBegin(string transactionId, ref bool fCancel)
+        {
+            CommitMsiTransactionBeginEventArgs args = new CommitMsiTransactionBeginEventArgs(transactionId, fCancel);
+            this.OnCommitMsiTransactionBegin(args);
+
+            fCancel = args.Cancel;
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnCommitMsiTransactionComplete(string transactionId, int hrStatus)
+        {
+            CommitMsiTransactionCompleteEventArgs args = new CommitMsiTransactionCompleteEventArgs(transactionId, hrStatus);
+            this.OnCommitMsiTransactionComplete(args);
+
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnRollbackMsiTransactionBegin(string transactionId)
+        {
+            RollbackMsiTransactionBeginEventArgs args = new RollbackMsiTransactionBeginEventArgs(transactionId);
+            this.OnRollbackMsiTransactionBegin(args);
+
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnRollbackMsiTransactionComplete(string transactionId, int hrStatus)
+        {
+            RollbackMsiTransactionCompleteEventArgs args = new RollbackMsiTransactionCompleteEventArgs(transactionId, hrStatus);
+            this.OnRollbackMsiTransactionComplete(args);
+
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnPauseAutomaticUpdatesBegin()
+        {
+            PauseAutomaticUpdatesBeginEventArgs args = new PauseAutomaticUpdatesBeginEventArgs();
+            this.OnPauseAutomaticUpdatesBegin(args);
+
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnPauseAutomaticUpdatesComplete(int hrStatus)
+        {
+            PauseAutomaticUpdatesCompleteEventArgs args = new PauseAutomaticUpdatesCompleteEventArgs(hrStatus);
+            this.OnPauseAutomaticUpdatesComplete(args);
+
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnSystemRestorePointBegin()
+        {
+            SystemRestorePointBeginEventArgs args = new SystemRestorePointBeginEventArgs();
+            this.OnSystemRestorePointBegin(args);
+
+            return args.HResult;
+        }
+
+        int IBootstrapperApplication.OnSystemRestorePointComplete(int hrStatus)
+        {
+            SystemRestorePointCompleteEventArgs args = new SystemRestorePointCompleteEventArgs(hrStatus);
+            this.OnSystemRestorePointComplete(args);
+
+            return args.HResult;
+        }
+
         int IBootstrapperApplication.BAProc(int message, IntPtr pvArgs, IntPtr pvResults, IntPtr pvContext)
         {
             switch (message)
diff --git a/src/WixToolset.Mba.Core/EventArgs.cs b/src/WixToolset.Mba.Core/EventArgs.cs
index 71bd15e1..b52b893a 100644
--- a/src/WixToolset.Mba.Core/EventArgs.cs
+++ b/src/WixToolset.Mba.Core/EventArgs.cs
@@ -1948,9 +1948,9 @@ namespace WixToolset.Mba.Core
     /// Additional arguments passed by the engine before it tries to launch the preapproved executable.
     /// </summary>
     [Serializable]
-    public class LaunchApprovedExeBeginArgs : CancellableHResultEventArgs
+    public class LaunchApprovedExeBeginEventArgs : CancellableHResultEventArgs
     {
-        public LaunchApprovedExeBeginArgs(bool cancelRecommendation)
+        public LaunchApprovedExeBeginEventArgs(bool cancelRecommendation)
             : base(cancelRecommendation)
         {
         }
@@ -1960,11 +1960,11 @@ namespace WixToolset.Mba.Core
     /// Additional arguments passed by the engine after it finished trying to launch the preapproved executable.
     /// </summary>
     [Serializable]
-    public class LaunchApprovedExeCompleteArgs : StatusEventArgs
+    public class LaunchApprovedExeCompleteEventArgs : StatusEventArgs
     {
         private int processId;
 
-        public LaunchApprovedExeCompleteArgs(int hrStatus, int processId)
+        public LaunchApprovedExeCompleteEventArgs(int hrStatus, int processId)
             : base(hrStatus)
         {
             this.processId = processId;
@@ -1979,4 +1979,187 @@ namespace WixToolset.Mba.Core
             get { return this.processId; }
         }
     }
+
+    /// <summary>
+    /// Additional arguments passed by the engine before beginning an MSI transaction.
+    /// </summary>
+    [Serializable]
+    public class BeginMsiTransactionBeginEventArgs : CancellableHResultEventArgs
+    {
+        private string transactionId;
+
+        public BeginMsiTransactionBeginEventArgs(string transactionId, bool cancelRecommendation)
+            : base(cancelRecommendation)
+        {
+            this.transactionId = transactionId;
+        }
+
+        /// <summary>
+        /// Gets the MSI transaction Id.
+        /// </summary>
+        public string TransactionId
+        {
+            get { return this.transactionId; }
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine after beginning an MSI transaction.
+    /// </summary>
+    [Serializable]
+    public class BeginMsiTransactionCompleteEventArgs : StatusEventArgs
+    {
+        private string transactionId;
+
+        public BeginMsiTransactionCompleteEventArgs(string transactionId, int hrStatus)
+            : base(hrStatus)
+        {
+            this.transactionId = transactionId;
+        }
+
+        /// <summary>
+        /// Gets the MSI transaction Id.
+        /// </summary>
+        public string TransactionId
+        {
+            get { return this.transactionId; }
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine before committing an MSI transaction.
+    /// </summary>
+    [Serializable]
+    public class CommitMsiTransactionBeginEventArgs : CancellableHResultEventArgs
+    {
+        private string transactionId;
+
+        public CommitMsiTransactionBeginEventArgs(string transactionId, bool cancelRecommendation)
+            : base(cancelRecommendation)
+        {
+            this.transactionId = transactionId;
+        }
+
+        /// <summary>
+        /// Gets the MSI transaction Id.
+        /// </summary>
+        public string TransactionId
+        {
+            get { return this.transactionId; }
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine after committing an MSI transaction.
+    /// </summary>
+    [Serializable]
+    public class CommitMsiTransactionCompleteEventArgs : StatusEventArgs
+    {
+        private string transactionId;
+
+        public CommitMsiTransactionCompleteEventArgs(string transactionId, int hrStatus)
+            : base(hrStatus)
+        {
+            this.transactionId = transactionId;
+        }
+
+        /// <summary>
+        /// Gets the MSI transaction Id.
+        /// </summary>
+        public string TransactionId
+        {
+            get { return this.transactionId; }
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine before rolling back an MSI transaction.
+    /// </summary>
+    [Serializable]
+    public class RollbackMsiTransactionBeginEventArgs : HResultEventArgs
+    {
+        private string transactionId;
+
+        public RollbackMsiTransactionBeginEventArgs(string transactionId)
+        {
+            this.transactionId = transactionId;
+        }
+
+        /// <summary>
+        /// Gets the MSI transaction Id.
+        /// </summary>
+        public string TransactionId
+        {
+            get { return this.transactionId; }
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine after rolling back an MSI transaction.
+    /// </summary>
+    [Serializable]
+    public class RollbackMsiTransactionCompleteEventArgs : StatusEventArgs
+    {
+        private string transactionId;
+
+        public RollbackMsiTransactionCompleteEventArgs(string transactionId, int hrStatus)
+            : base(hrStatus)
+        {
+            this.transactionId = transactionId;
+        }
+
+        /// <summary>
+        /// Gets the MSI transaction Id.
+        /// </summary>
+        public string TransactionId
+        {
+            get { return this.transactionId; }
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine before pausing Windows automatic updates.
+    /// </summary>
+    [Serializable]
+    public class PauseAutomaticUpdatesBeginEventArgs : HResultEventArgs
+    {
+        public PauseAutomaticUpdatesBeginEventArgs()
+        {
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine after pausing Windows automatic updates.
+    /// </summary>
+    [Serializable]
+    public class PauseAutomaticUpdatesCompleteEventArgs : StatusEventArgs
+    {
+        public PauseAutomaticUpdatesCompleteEventArgs(int hrStatus)
+            : base(hrStatus)
+        {
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine before taking a system restore point.
+    /// </summary>
+    [Serializable]
+    public class SystemRestorePointBeginEventArgs : HResultEventArgs
+    {
+        public SystemRestorePointBeginEventArgs()
+        {
+        }
+    }
+
+    /// <summary>
+    /// Additional arguments passed by the engine after taking a system restore point.
+    /// </summary>
+    [Serializable]
+    public class SystemRestorePointCompleteEventArgs : StatusEventArgs
+    {
+        public SystemRestorePointCompleteEventArgs(int hrStatus)
+            : base(hrStatus)
+        {
+        }
+    }
 }
diff --git a/src/WixToolset.Mba.Core/IBootstrapperApplication.cs b/src/WixToolset.Mba.Core/IBootstrapperApplication.cs
index 0d79122d..f1a631a3 100644
--- a/src/WixToolset.Mba.Core/IBootstrapperApplication.cs
+++ b/src/WixToolset.Mba.Core/IBootstrapperApplication.cs
@@ -12,7 +12,6 @@ namespace WixToolset.Mba.Core
     [ComImport]
     [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
     [Guid("53C31D56-49C0-426B-AB06-099D717C67FE")]
-    [GeneratedCodeAttribute("WixToolset.Bootstrapper.InteropCodeGenerator", "1.0.0.0")]
     public interface IBootstrapperApplication
     {
         [PreserveSig]
@@ -500,6 +499,69 @@ namespace WixToolset.Mba.Core
             int processId
             );
 
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnBeginMsiTransactionBegin(
+            [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId,
+            [MarshalAs(UnmanagedType.Bool)] ref bool fCancel
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnBeginMsiTransactionComplete(
+            [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId,
+            int hrStatus
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnCommitMsiTransactionBegin(
+            [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId,
+            [MarshalAs(UnmanagedType.Bool)] ref bool fCancel
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnCommitMsiTransactionComplete(
+            [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId,
+            int hrStatus
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnRollbackMsiTransactionBegin(
+            [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnRollbackMsiTransactionComplete(
+            [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId,
+            int hrStatus
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnPauseAutomaticUpdatesBegin(
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnPauseAutomaticUpdatesComplete(
+            int hrStatus
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnSystemRestorePointBegin(
+            );
+
+        [PreserveSig]
+        [return: MarshalAs(UnmanagedType.I4)]
+        int OnSystemRestorePointComplete(
+            int hrStatus
+            );
+
         [PreserveSig]
         [return: MarshalAs(UnmanagedType.I4)]
         int BAProc(
diff --git a/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs b/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs
index 9bea6418..4a30da7e 100644
--- a/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs
+++ b/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs
@@ -8,6 +8,8 @@ namespace WixToolset.Mba.Core
     {
         event EventHandler<ApplyBeginEventArgs> ApplyBegin;
         event EventHandler<ApplyCompleteEventArgs> ApplyComplete;
+        event EventHandler<BeginMsiTransactionBeginEventArgs> BeginMsiTransactionBegin;
+        event EventHandler<BeginMsiTransactionCompleteEventArgs> BeginMsiTransactionComplete;
         event EventHandler<CacheAcquireBeginEventArgs> CacheAcquireBegin;
         event EventHandler<CacheAcquireCompleteEventArgs> CacheAcquireComplete;
         event EventHandler<CacheAcquireProgressEventArgs> CacheAcquireProgress;
@@ -17,6 +19,8 @@ namespace WixToolset.Mba.Core
         event EventHandler<CachePackageCompleteEventArgs> CachePackageComplete;
         event EventHandler<CacheVerifyBeginEventArgs> CacheVerifyBegin;
         event EventHandler<CacheVerifyCompleteEventArgs> CacheVerifyComplete;
+        event EventHandler<CommitMsiTransactionBeginEventArgs> CommitMsiTransactionBegin;
+        event EventHandler<CommitMsiTransactionCompleteEventArgs> CommitMsiTransactionComplete;
         event EventHandler<DetectBeginEventArgs> DetectBegin;
         event EventHandler<DetectCompatibleMsiPackageEventArgs> DetectCompatibleMsiPackage;
         event EventHandler<DetectCompleteEventArgs> DetectComplete;
@@ -41,13 +45,16 @@ namespace WixToolset.Mba.Core
         event EventHandler<ExecutePackageCompleteEventArgs> ExecutePackageComplete;
         event EventHandler<ExecutePatchTargetEventArgs> ExecutePatchTarget;
         event EventHandler<ExecuteProgressEventArgs> ExecuteProgress;
-        event EventHandler<LaunchApprovedExeBeginArgs> LaunchApprovedExeBegin;
-        event EventHandler<LaunchApprovedExeCompleteArgs> LaunchApprovedExeComplete;
+        event EventHandler<LaunchApprovedExeBeginEventArgs> LaunchApprovedExeBegin;
+        event EventHandler<LaunchApprovedExeCompleteEventArgs> LaunchApprovedExeComplete;
+        event EventHandler<PauseAutomaticUpdatesBeginEventArgs> PauseAutomaticUpdatesBegin;
+        event EventHandler<PauseAutomaticUpdatesCompleteEventArgs> PauseAutomaticUpdatesComplete;
         event EventHandler<PlanBeginEventArgs> PlanBegin;
         event EventHandler<PlanCompatibleMsiPackageBeginEventArgs> PlanCompatibleMsiPackageBegin;
         event EventHandler<PlanCompatibleMsiPackageCompleteEventArgs> PlanCompatibleMsiPackageComplete;
         event EventHandler<PlanCompleteEventArgs> PlanComplete;
         event EventHandler<PlanMsiFeatureEventArgs> PlanMsiFeature;
+        event EventHandler<PlanMsiPackageEventArgs> PlanMsiPackage;
         event EventHandler<PlanPackageBeginEventArgs> PlanPackageBegin;
         event EventHandler<PlanPackageCompleteEventArgs> PlanPackageComplete;
         event EventHandler<PlanRelatedBundleEventArgs> PlanRelatedBundle;
@@ -56,8 +63,12 @@ namespace WixToolset.Mba.Core
         event EventHandler<RegisterBeginEventArgs> RegisterBegin;
         event EventHandler<RegisterCompleteEventArgs> RegisterComplete;
         event EventHandler<ResolveSourceEventArgs> ResolveSource;
+        event EventHandler<RollbackMsiTransactionBeginEventArgs> RollbackMsiTransactionBegin;
+        event EventHandler<RollbackMsiTransactionCompleteEventArgs> RollbackMsiTransactionComplete;
         event EventHandler<ShutdownEventArgs> Shutdown;
         event EventHandler<StartupEventArgs> Startup;
+        event EventHandler<SystemRestorePointBeginEventArgs> SystemRestorePointBegin;
+        event EventHandler<SystemRestorePointCompleteEventArgs> SystemRestorePointComplete;
         event EventHandler<SystemShutdownEventArgs> SystemShutdown;
         event EventHandler<UnregisterBeginEventArgs> UnregisterBegin;
         event EventHandler<UnregisterCompleteEventArgs> UnregisterComplete;
diff --git a/src/balutil/balutil.vcxproj b/src/balutil/balutil.vcxproj
index d35a7a77..4793770a 100644
--- a/src/balutil/balutil.vcxproj
+++ b/src/balutil/balutil.vcxproj
@@ -2,8 +2,8 @@
 <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
 
 <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" />
-  <Import Project="..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" />
+  <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" />
+  <Import Project="..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" />
 
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|ARM64">
@@ -98,8 +98,8 @@
     <PropertyGroup>
       <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
     </PropertyGroup>
-    <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props'))" />
-    <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props'))" />
+    <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props'))" />
+    <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props'))" />
     <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets'))" />
   </Target>
 </Project>
diff --git a/src/balutil/inc/BAFunctions.h b/src/balutil/inc/BAFunctions.h
index 8101afdb..a95b7a03 100644
--- a/src/balutil/inc/BAFunctions.h
+++ b/src/balutil/inc/BAFunctions.h
@@ -65,6 +65,16 @@ enum BA_FUNCTIONS_MESSAGE
     BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN,
     BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE,
     BA_FUNCTIONS_MESSAGE_ONPLANMSIPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE,
+    BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN,
+    BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE,
+    BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN,
+    BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE,
+    BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN,
+    BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE,
+    BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN,
+    BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE,
+    BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN,
+    BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE,
 
     BA_FUNCTIONS_MESSAGE_ONTHEMELOADED = 1024,
     BA_FUNCTIONS_MESSAGE_WNDPROC,
diff --git a/src/balutil/inc/BalBaseBAFunctions.h b/src/balutil/inc/BalBaseBAFunctions.h
index 72edadd5..39934128 100644
--- a/src/balutil/inc/BalBaseBAFunctions.h
+++ b/src/balutil/inc/BalBaseBAFunctions.h
@@ -612,6 +612,79 @@ public: // IBootstrapperApplication
         return S_OK;
     }
 
+    virtual STDMETHODIMP OnBeginMsiTransactionBegin(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __inout BOOL* /*pfCancel*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnBeginMsiTransactionComplete(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnCommitMsiTransactionBegin(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __inout BOOL* /*pfCancel*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnCommitMsiTransactionComplete(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnRollbackMsiTransactionBegin(
+        __in_z LPCWSTR /*wzTransactionId*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnRollbackMsiTransactionComplete(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnPauseAutomaticUpdatesBegin(
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnPauseAutomaticUpdatesComplete(
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnSystemRestorePointBegin(
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnSystemRestorePointComplete(
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
     virtual STDMETHODIMP_(HRESULT) BAProc(
         __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/,
         __in const LPVOID /*pvArgs*/,
diff --git a/src/balutil/inc/BalBaseBAFunctionsProc.h b/src/balutil/inc/BalBaseBAFunctionsProc.h
index f6ebd9f6..69843301 100644
--- a/src/balutil/inc/BalBaseBAFunctionsProc.h
+++ b/src/balutil/inc/BalBaseBAFunctionsProc.h
@@ -100,6 +100,16 @@ static HRESULT WINAPI BalBaseBAFunctionsProc(
         case BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN:
         case BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE:
         case BA_FUNCTIONS_MESSAGE_ONPLANMSIPACKAGE:
+        case BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONBEGIN:
+        case BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE:
+        case BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN:
+        case BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE:
+        case BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN:
+        case BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE:
+        case BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN:
+        case BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE:
+        case BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN:
+        case BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE:
             hr = BalBaseBootstrapperApplicationProc((BOOTSTRAPPER_APPLICATION_MESSAGE)message, pvArgs, pvResults, pvContext);
             break;
         case BA_FUNCTIONS_MESSAGE_ONTHEMELOADED:
diff --git a/src/balutil/inc/BalBaseBootstrapperApplication.h b/src/balutil/inc/BalBaseBootstrapperApplication.h
index 612faf54..ad0c60e5 100644
--- a/src/balutil/inc/BalBaseBootstrapperApplication.h
+++ b/src/balutil/inc/BalBaseBootstrapperApplication.h
@@ -798,6 +798,81 @@ public: // IBootstrapperApplication
         return S_OK;
     }
 
+    virtual STDMETHODIMP OnBeginMsiTransactionBegin(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __inout BOOL* pfCancel
+        )
+    {
+        *pfCancel |= CheckCanceled();
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnBeginMsiTransactionComplete(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnCommitMsiTransactionBegin(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __inout BOOL* pfCancel
+        )
+    {
+        *pfCancel |= CheckCanceled();
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnCommitMsiTransactionComplete(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnRollbackMsiTransactionBegin(
+        __in_z LPCWSTR /*wzTransactionId*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnRollbackMsiTransactionComplete(
+        __in_z LPCWSTR /*wzTransactionId*/,
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnPauseAutomaticUpdatesBegin(
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnPauseAutomaticUpdatesComplete(
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnSystemRestorePointBegin(
+        )
+    {
+        return S_OK;
+    }
+
+    virtual STDMETHODIMP OnSystemRestorePointComplete(
+        __in HRESULT /*hrStatus*/
+        )
+    {
+        return S_OK;
+    }
+
     virtual STDMETHODIMP_(HRESULT) BAProc(
         __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/,
         __in const LPVOID /*pvArgs*/,
diff --git a/src/balutil/inc/BalBaseBootstrapperApplicationProc.h b/src/balutil/inc/BalBaseBootstrapperApplicationProc.h
index 7d5de8e4..648252b5 100644
--- a/src/balutil/inc/BalBaseBootstrapperApplicationProc.h
+++ b/src/balutil/inc/BalBaseBootstrapperApplicationProc.h
@@ -513,6 +513,96 @@ static HRESULT BalBaseBAProcOnPlanMsiPackage(
     return pBA->OnPlanMsiPackage(pArgs->wzPackageId, pArgs->fExecute, pArgs->action, &pResults->fCancel, &pResults->actionMsiProperty, &pResults->uiLevel, &pResults->fDisableExternalUiHandler);
 }
 
+static HRESULT BalBaseBAProcOnBeginMsiTransactionBegin(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONBEGINMSITRANSACTIONBEGIN_ARGS* pArgs,
+    __inout BA_ONBEGINMSITRANSACTIONBEGIN_RESULTS* pResults
+    )
+{
+    return pBA->OnBeginMsiTransactionBegin(pArgs->wzTransactionId, &pResults->fCancel);
+}
+
+static HRESULT BalBaseBAProcOnBeginMsiTransactionComplete(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONBEGINMSITRANSACTIONCOMPLETE_ARGS* pArgs,
+    __inout BA_ONBEGINMSITRANSACTIONCOMPLETE_RESULTS* /*pResults*/
+    )
+{
+    return pBA->OnBeginMsiTransactionComplete(pArgs->wzTransactionId, pArgs->hrStatus);
+}
+
+static HRESULT BalBaseBAProcOnCommitMsiTransactionBegin(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONCOMMITMSITRANSACTIONBEGIN_ARGS* pArgs,
+    __inout BA_ONCOMMITMSITRANSACTIONBEGIN_RESULTS* pResults
+    )
+{
+    return pBA->OnCommitMsiTransactionBegin(pArgs->wzTransactionId, &pResults->fCancel);
+}
+
+static HRESULT BalBaseBAProcOnCommitMsiTransactionComplete(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONCOMMITMSITRANSACTIONCOMPLETE_ARGS* pArgs,
+    __inout BA_ONCOMMITMSITRANSACTIONCOMPLETE_RESULTS* /*pResults*/
+    )
+{
+    return pBA->OnCommitMsiTransactionComplete(pArgs->wzTransactionId, pArgs->hrStatus);
+}
+
+static HRESULT BalBaseBAProcOnRollbackMsiTransactionBegin(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONROLLBACKMSITRANSACTIONBEGIN_ARGS* pArgs,
+    __inout BA_ONROLLBACKMSITRANSACTIONBEGIN_RESULTS* /*pResults*/
+    )
+{
+    return pBA->OnRollbackMsiTransactionBegin(pArgs->wzTransactionId);
+}
+
+static HRESULT BalBaseBAProcOnRollbackMsiTransactionComplete(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONROLLBACKMSITRANSACTIONCOMPLETE_ARGS* pArgs,
+    __inout BA_ONROLLBACKMSITRANSACTIONCOMPLETE_RESULTS* /*pResults*/
+    )
+{
+    return pBA->OnRollbackMsiTransactionComplete(pArgs->wzTransactionId, pArgs->hrStatus);
+}
+
+static HRESULT BalBaseBAProcOnPauseAutomaticUpdatesBegin(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS* /*pArgs*/,
+    __inout BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS* /*pResults*/
+    )
+{
+    return pBA->OnPauseAutomaticUpdatesBegin();
+}
+
+static HRESULT BalBaseBAProcOnPauseAutomaticUpdatesComplete(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS* pArgs,
+    __inout BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS* /*pResults*/
+    )
+{
+    return pBA->OnPauseAutomaticUpdatesComplete(pArgs->hrStatus);
+}
+
+static HRESULT BalBaseBAProcOnSystemRestorePointBegin(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS* /*pArgs*/,
+    __inout BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS* /*pResults*/
+    )
+{
+    return pBA->OnSystemRestorePointBegin();
+}
+
+static HRESULT BalBaseBAProcOnSystemRestorePointComplete(
+    __in IBootstrapperApplication* pBA,
+    __in BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS* pArgs,
+    __inout BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS* /*pResults*/
+    )
+{
+    return pBA->OnSystemRestorePointComplete(pArgs->hrStatus);
+}
+
 /*******************************************************************
 BalBaseBootstrapperApplicationProc - requires pvContext to be of type IBootstrapperApplication.
                                      Provides a default mapping between the new message based BA interface and
@@ -701,6 +791,35 @@ static HRESULT WINAPI BalBaseBootstrapperApplicationProc(
         case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE:
             hr = BalBaseBAProcOnPlanMsiPackage(pBA, reinterpret_cast<BA_ONPLANMSIPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANMSIPACKAGE_RESULTS*>(pvResults));
             break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN:
+            hr = BalBaseBAProcOnBeginMsiTransactionBegin(pBA, reinterpret_cast<BA_ONBEGINMSITRANSACTIONBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONBEGINMSITRANSACTIONBEGIN_RESULTS*>(pvResults));
+            break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE:
+            hr = BalBaseBAProcOnBeginMsiTransactionComplete(pBA, reinterpret_cast<BA_ONBEGINMSITRANSACTIONCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONBEGINMSITRANSACTIONCOMPLETE_RESULTS*>(pvResults));
+            break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN:
+            hr = BalBaseBAProcOnCommitMsiTransactionBegin(pBA, reinterpret_cast<BA_ONCOMMITMSITRANSACTIONBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCOMMITMSITRANSACTIONBEGIN_RESULTS*>(pvResults));
+            break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE:
+            hr = BalBaseBAProcOnCommitMsiTransactionComplete(pBA, reinterpret_cast<BA_ONCOMMITMSITRANSACTIONCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCOMMITMSITRANSACTIONCOMPLETE_RESULTS*>(pvResults));
+            break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN:
+            hr = BalBaseBAProcOnRollbackMsiTransactionBegin(pBA, reinterpret_cast<BA_ONROLLBACKMSITRANSACTIONBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONROLLBACKMSITRANSACTIONBEGIN_RESULTS*>(pvResults));
+            break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE:
+            hr = BalBaseBAProcOnRollbackMsiTransactionComplete(pBA, reinterpret_cast<BA_ONROLLBACKMSITRANSACTIONCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONROLLBACKMSITRANSACTIONCOMPLETE_RESULTS*>(pvResults));
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN:
+            hr = BalBaseBAProcOnPauseAutomaticUpdatesBegin(pBA, reinterpret_cast<BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS*>(pvResults));
+            break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE:
+            hr = BalBaseBAProcOnPauseAutomaticUpdatesComplete(pBA, reinterpret_cast<BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS*>(pvResults));
+            break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN:
+            hr = BalBaseBAProcOnSystemRestorePointBegin(pBA, reinterpret_cast<BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS*>(pvResults));
+            break;
+        case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE:
+            hr = BalBaseBAProcOnSystemRestorePointComplete(pBA, reinterpret_cast<BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS*>(pvResults));
+            break;
         }
     }
 
diff --git a/src/balutil/inc/IBootstrapperApplication.h b/src/balutil/inc/IBootstrapperApplication.h
index 75ea7bc9..dd8f8024 100644
--- a/src/balutil/inc/IBootstrapperApplication.h
+++ b/src/balutil/inc/IBootstrapperApplication.h
@@ -518,6 +518,49 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A
         __in DWORD dwProcessId
         ) = 0;
 
+    STDMETHOD(OnBeginMsiTransactionBegin)(
+        __in_z LPCWSTR wzTransactionId,
+        __inout BOOL* pfCancel
+        ) = 0;
+
+    STDMETHOD(OnBeginMsiTransactionComplete)(
+        __in_z LPCWSTR wzTransactionId,
+        __in HRESULT hrStatus
+        ) = 0;
+
+    STDMETHOD(OnCommitMsiTransactionBegin)(
+        __in_z LPCWSTR wzTransactionId,
+        __inout BOOL* pfCancel
+        ) = 0;
+
+    STDMETHOD(OnCommitMsiTransactionComplete)(
+        __in_z LPCWSTR wzTransactionId,
+        __in HRESULT hrStatus
+        ) = 0;
+
+    STDMETHOD(OnRollbackMsiTransactionBegin)(
+        __in_z LPCWSTR wzTransactionId
+        ) = 0;
+
+    STDMETHOD(OnRollbackMsiTransactionComplete)(
+        __in_z LPCWSTR wzTransactionId,
+        __in HRESULT hrStatus
+        ) = 0;
+
+    STDMETHOD(OnPauseAutomaticUpdatesBegin)(
+        ) = 0;
+
+    STDMETHOD(OnPauseAutomaticUpdatesComplete)(
+        __in HRESULT hrStatus
+        ) = 0;
+
+    STDMETHOD(OnSystemRestorePointBegin)(
+        ) = 0;
+
+    STDMETHOD(OnSystemRestorePointComplete)(
+        __in HRESULT hrStatus
+        ) = 0;
+
     // BAProc - The PFN_BOOTSTRAPPER_APPLICATION_PROC can call this method to give the BA raw access to the callback from the engine.
     //          This might be used to help the BA support more than one version of the engine.
     STDMETHOD(BAProc)(
diff --git a/src/balutil/packages.config b/src/balutil/packages.config
index dbc4eb18..e6716363 100644
--- a/src/balutil/packages.config
+++ b/src/balutil/packages.config
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="Nerdbank.GitVersioning" version="3.3.37" targetFramework="native" developmentDependency="true" />
-  <package id="WixToolset.BootstrapperCore.Native" version="4.0.38" targetFramework="native" />
-  <package id="WixToolset.DUtil" version="4.0.55" targetFramework="native" />
+  <package id="WixToolset.BootstrapperCore.Native" version="4.0.54" targetFramework="native" />
+  <package id="WixToolset.DUtil" version="4.0.56" targetFramework="native" />
 </packages>
\ No newline at end of file
diff --git a/src/bextutil/bextutil.vcxproj b/src/bextutil/bextutil.vcxproj
index def0dd59..2e248d2c 100644
--- a/src/bextutil/bextutil.vcxproj
+++ b/src/bextutil/bextutil.vcxproj
@@ -2,8 +2,8 @@
 <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
 
 <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" />
-  <Import Project="..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" />
+  <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" />
+  <Import Project="..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" />
 
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|ARM64">
@@ -87,8 +87,8 @@
     <PropertyGroup>
       <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
     </PropertyGroup>
-    <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props'))" />
-    <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props'))" />
+    <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props'))" />
+    <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props'))" />
     <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets'))" />
   </Target>
 </Project>
diff --git a/src/bextutil/packages.config b/src/bextutil/packages.config
index dbc4eb18..e6716363 100644
--- a/src/bextutil/packages.config
+++ b/src/bextutil/packages.config
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="Nerdbank.GitVersioning" version="3.3.37" targetFramework="native" developmentDependency="true" />
-  <package id="WixToolset.BootstrapperCore.Native" version="4.0.38" targetFramework="native" />
-  <package id="WixToolset.DUtil" version="4.0.55" targetFramework="native" />
+  <package id="WixToolset.BootstrapperCore.Native" version="4.0.54" targetFramework="native" />
+  <package id="WixToolset.DUtil" version="4.0.56" targetFramework="native" />
 </packages>
\ No newline at end of file
diff --git a/src/mbanative/mbanative.vcxproj b/src/mbanative/mbanative.vcxproj
index 69309f8a..be60f3a9 100644
--- a/src/mbanative/mbanative.vcxproj
+++ b/src/mbanative/mbanative.vcxproj
@@ -5,8 +5,8 @@
   <Import Project="..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props" Condition="Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props')" />
   <Import Project="..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props" Condition="Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props')" />
   <Import Project="..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props" Condition="Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props')" />
-  <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" />
-  <Import Project="..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" />
+  <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" />
+  <Import Project="..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" />
 
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|ARM64">
@@ -94,7 +94,7 @@
     <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props'))" />
     <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets'))" />
     <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets'))" />
-    <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props'))" />
-    <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props'))" />
+    <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props'))" />
+    <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props'))" />
   </Target>
 </Project>
\ No newline at end of file
diff --git a/src/mbanative/packages.config b/src/mbanative/packages.config
index 20047373..46972411 100644
--- a/src/mbanative/packages.config
+++ b/src/mbanative/packages.config
@@ -4,6 +4,6 @@
   <package id="Microsoft.SourceLink.Common" version="1.0.0" targetFramework="native" developmentDependency="true" />
   <package id="Microsoft.SourceLink.GitHub" version="1.0.0" targetFramework="native" developmentDependency="true" />
   <package id="Nerdbank.GitVersioning" version="3.3.37" targetFramework="native" developmentDependency="true" />
-  <package id="WixToolset.BootstrapperCore.Native" version="4.0.38" targetFramework="native" />
-  <package id="WixToolset.DUtil" version="4.0.55" targetFramework="native" />
+  <package id="WixToolset.BootstrapperCore.Native" version="4.0.54" targetFramework="native" />
+  <package id="WixToolset.DUtil" version="4.0.56" targetFramework="native" />
 </packages>
\ No newline at end of file
diff --git a/src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj b/src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj
index 53d14cd7..a57c6f01 100644
--- a/src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj
+++ b/src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj
@@ -4,8 +4,8 @@
 
 <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.props" Condition="Exists('..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.props')" />
-  <Import Project="..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" />
-  <Import Project="..\..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props" Condition="Exists('..\..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" />
+  <Import Project="..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" />
+  <Import Project="..\..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props" Condition="Exists('..\..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" />
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
@@ -67,7 +67,7 @@
     </PropertyGroup>
     <Error Condition="!Exists('..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.props'))" />
     <Error Condition="!Exists('..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.targets'))" />
-    <Error Condition="!Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props'))" />
-    <Error Condition="!Exists('..\..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props'))" />
+    <Error Condition="!Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props'))" />
+    <Error Condition="!Exists('..\..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props'))" />
   </Target>
 </Project>
diff --git a/src/test/BalUtilUnitTest/packages.config b/src/test/BalUtilUnitTest/packages.config
index b8423837..e3b144e6 100644
--- a/src/test/BalUtilUnitTest/packages.config
+++ b/src/test/BalUtilUnitTest/packages.config
@@ -10,6 +10,6 @@
   <package id="xunit.runner.visualstudio" version="2.4.1" />
   <package id="WixBuildTools.TestSupport" version="4.0.47" />
   <package id="WixBuildTools.TestSupport.Native" version="4.0.47" />
-  <package id="WixToolset.BootstrapperCore.Native" version="4.0.38" targetFramework="native" />
-  <package id="WixToolset.DUtil" version="4.0.55" targetFramework="native" />
+  <package id="WixToolset.BootstrapperCore.Native" version="4.0.54" targetFramework="native" />
+  <package id="WixToolset.DUtil" version="4.0.56" targetFramework="native" />
 </packages>
\ No newline at end of file
diff --git a/src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj b/src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj
index 15a1f51d..c1cf107c 100644
--- a/src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj
+++ b/src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj
@@ -4,8 +4,8 @@
 
 <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.props" Condition="Exists('..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.props')" />
-  <Import Project="..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" />
-  <Import Project="..\..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props" Condition="Exists('..\..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" />
+  <Import Project="..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" />
+  <Import Project="..\..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props" Condition="Exists('..\..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" />
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
@@ -66,7 +66,7 @@
     </PropertyGroup>
     <Error Condition="!Exists('..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.props'))" />
     <Error Condition="!Exists('..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixBuildTools.TestSupport.Native.4.0.47\build\WixBuildTools.TestSupport.Native.targets'))" />
-    <Error Condition="!Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.38\build\WixToolset.BootstrapperCore.Native.props'))" />
-    <Error Condition="!Exists('..\..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.DUtil.4.0.55\build\WixToolset.DUtil.props'))" />
+    <Error Condition="!Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.54\build\WixToolset.BootstrapperCore.Native.props'))" />
+    <Error Condition="!Exists('..\..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props'))" />
   </Target>
 </Project>
diff --git a/src/test/BextUtilUnitTest/packages.config b/src/test/BextUtilUnitTest/packages.config
index b8423837..e3b144e6 100644
--- a/src/test/BextUtilUnitTest/packages.config
+++ b/src/test/BextUtilUnitTest/packages.config
@@ -10,6 +10,6 @@
   <package id="xunit.runner.visualstudio" version="2.4.1" />
   <package id="WixBuildTools.TestSupport" version="4.0.47" />
   <package id="WixBuildTools.TestSupport.Native" version="4.0.47" />
-  <package id="WixToolset.BootstrapperCore.Native" version="4.0.38" targetFramework="native" />
-  <package id="WixToolset.DUtil" version="4.0.55" targetFramework="native" />
+  <package id="WixToolset.BootstrapperCore.Native" version="4.0.54" targetFramework="native" />
+  <package id="WixToolset.DUtil" version="4.0.56" targetFramework="native" />
 </packages>
\ No newline at end of file
-- 
cgit v1.2.3-55-g6feb