You’ve got a stack of new machines that need Windows 11 — and they need it yesterday. But setting up SCCM, MDT, or WDS feels like launching a spaceship just to light a candle. You don’t have time to fight with complex configuration, databases, and roles. You just want a simple, network-based deployment that works, without all the enterprise baggage.
Sound familiar?
I had a customer once who got 800 white-box PCs delivered from a factory in China. They were heading out to industrial sites around the world to be used for programming appliance motherboards — so each one needed a very specific setup. But here’s the kicker: every single device had been imaged incorrectly. All 800 needed a full reinstall.
Sure, you could do it with USB sticks. But are you really going to plug and unplug USB drives 800 times? Not unless you hate yourself.
This guide is for those moments. Whether you’re prepping devices for Autopilot enrolment or just need a fast, repeatable way to install Windows 11 from scratch, you’re going to learn how to build a fully functional PXE boot solution — without touching SCCM or MDT.
I’ll walk you through exactly how to:
- Set up a lightweight TFTP server that supports PXE booting
- Build your own WinPE boot image using the Windows ADK
- Automate the entire install using an unattend.xml
- Deploy Windows 11 over the network, fully hands-off
No enterprise tools. No bloat. Just a clean, fast deployment solution that you can set up in an afternoon — and reuse again and again.
Why You Need a Deployment Solution (and When SCCM/MDT Are Overkill)
If you’re dealing with more than a couple of machines, reinstalling Windows manually just doesn’t scale. USB sticks are fine for one-offs or testing, but once you’re in double digits — or in the case of that 800-device disaster — you need something faster, smarter, and repeatable.
That’s where deployment solutions come in.
But here’s the catch: most of the popular deployment tools like SCCM, MDT, or even WDS are built for large enterprise environments. They’re powerful, yes — but they come with baggage:
- Complex setup and dependencies
- AD integration requirements
- SQL servers, DHCP scope options, service accounts…
- Hours (or days) of configuration and testing
If you’re in a corporate IT department with the infrastructure already in place, great. But what if you’re:
- A consultant or MSP working at client sites
- An IT admin in a small to mid-sized business
- A contractor shipping pre-imaged devices globally
- Setting up a lab where you frequently wipe and re-deploy machines
- Cloud native
- Just short on time and need something now
…then those tools are likely massive overkill.
What You Actually Need
You need something lightweight and functional:
- A basic PXE server to serve boot files over the network
- A WinPE boot image that launches setup
- A shared folder with the Windows image and a hands-off answer file
No domain join. No group policies. No software catalogues. Just bare-metal deployment that gets the job done quickly.
And let’s be clear: this isn’t the end of the line — it’s just the beginning.
This process handles the image deployment, fast and efficiently. Once Windows is installed, you hand the device off to Windows Autopilot, and let Intune take over the configuration, security policies, software installs, and everything else that makes the device production-ready.
So, whether you’re refreshing devices in a lab or prepping systems for global rollout, this gives you a simple, clean foundation to build on — without the overhead of enterprise deployment tools.
Tools You’ll Need (Prereqs)
Before you start configuring anything, you’ll need to download a few essential tools. The good news? None of these require a server OS, domain controller, or enterprise infrastructure. Everything in this guide can be run on a regular Windows 10 or 11 Pro machine. I run this on a regular Windows 11 Pro that is managed by the same Intune tenant as it is deploying the devices into 🙂
Here’s what you’ll need:
1. Windows ADK (Assessment and Deployment Kit)
This gives you the tools to build a WinPE (Windows Preinstallation Environment) boot image — the lightweight OS that will boot over the network and kick off the Windows 11 install.
- 🔗 Download link: Windows ADK for Windows 11 22H2 or later
- During installation, select:
- Deployment Tools
2. Windows PE Add-on for the ADK
This is installed separately but is required to create and customise the WinPE boot image.
- 🔗 Download link: Windows PE Add-on
3. TFTP64
This will act as your PXE server. It’s lightweight, easy to configure, and perfect for small-scale deployments.
- 🔗 Download link: TFTPD32/TFTP64 Official Page
TFTP64 is the 64-bit version and includes both DHCP and TFTP services. If you already have a DHCP server on your network, you can disable the built-in DHCP in TFTP64. We will look into later how to configure the DHCP in place.
4. Windows 11 ISO (Latest version)
You’ll need this to extract the Windows image you want to deploy. You can download it directly from Microsoft’s website or via Volume Licensing if you’re using business editions.
- 🔗 Download link: Windows 11 ISO (Microsoft)
Setting Up the PXE Server and Folder Structure
With all the tools downloaded, it’s time to put them to work. You’ll start by setting up the TFTP server and creating a clean folder structure to organise your boot files, images, and configuration.
This is the foundation your entire deployment setup will run on, so getting it right now will save headaches later.
Install and Configure TFTP64
- Extract and run the TFTP64 installer or portable version.
- Once installed, run it as Administrator.
- Configure the following:
- Under the “TFTP Server” tab, set the base directory to your PXE folder (we’ll create that next).
- If you don’t have another DHCP server on your network, you can enable the DHCP server tab. Otherwise, leave it off!!

- Go to the Settings menu and:
- In my case I need the “Reduce ‘//’ in file path ‘ setting. Beacuse how my Unif DHCP sent the DHCP options.
- Set the correct network interface (the one connected to your deployment LAN or switch).
- Make sure TFTP, DHCP (if used), and PXE boot services are enabled.

- Save your settings, and close/restart TFTP64 if needed.
🔧 Optional: You can install TFTP64 as a Windows service if you want it to run automatically. This is useful in lab environments. It’s a separate download though but in the same Github source. You need to manually start the service or set it as automatically,
Create the PXE Folder Structure
Now you’ll create a simple folder structure that keeps everything tidy and functional.
- Create a folder called PXE on the root of your deployment machine’s drive (e.g.
C:\PXE). - Inside the
PXEfolder, create the following subfolders:
- Share the PXE folder over the network:
Right-click the PXE folder > Properties > Sharing > Advanced Sharing.
Tick “Share this folder” and give it a name like PXE.
Click Permissions and give Everyone at least Read access.
This shared folder will be accessed from WinPE during installation, so make sure it’s reachable over the network. Since we do not work with Active directory and this PXE “server” is workgroup we need to create a local account to use when accessing the share.
I created a local account with username PXEUSER and password LetsdeploywithPXE!
Of course these folders is just how I want it. I use the Boot for the boot image to be loaded through PXE, the Unattend for XML answer files for automated setup. Win11Pro25h2 for the install files, just adding more folders with install files when needed, Ubuntu perhaps?!?
Prepare the Boot Image Using Windows ADK and WinPE Add-on
Your PXE server is ready, and the folder structure is in place. Now you need a bootable WinPE image — this is what your client machines will load over the network. It’s a minimal Windows environment that supports networking and can launch your unattended setup.
Here’s how to create it using the Windows ADK and WinPE Add-on.
Open Deployment and Imaging Tools Environment as An dministrator, you’ll find it in the startmenu.

Now we want copy PE files to working directory. Prepare a folder before copying. Doesn’t have to be the PXE folder since this is only the preparation of the boot image.
copype amd64 C:\PEWork_amd64
It will copy a bunch of files to the working directory.

Next up is mounting the boot file
Dism /Mount-Image /ImageFile:"C:\PEwork_amd64\media\sources\boot.wim" /index:1 /MountDir:"C:\PEWork_amd64\mount"This mounts the Boot.wim into \mount folder. Now we can add components to the WinPE. It has a bunch of stuff you can add, you can find which one here on Microsoft.
To have the device deployed with Windows 11 and of course have UEFI and secureboot enabled you need at least the following:
WinPE-WMI.cab
WinPE-WMI_en-us.cab
WinPE-SecureStartup.cab
WinPE-SecureStartup_en-us.cab"But since I want to add possibility for scripting and PowerShell during WinPE i will run all f the following:
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-WMI.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-WMI_en-us.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-SecureStartup.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-SecureStartup_en-us.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-NetFX.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-NetFX_en-us.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-Scripting.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-Scripting_en-us.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-PowerShell.cab"
Dism /Add-Package /Image:"C:\PEwork_amd64\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-PowerShell_en-us.cab"Note that for each module or stuff you add, the boot.wim file size increase. Usually not an issue i you have an good network (LAN).
Here is it also a good idea to add drivers to the boot image if the hardware requires it. Such as network or storage drivers.
Alrighty then, Let’s make the WinPE automatically map the share folder we previously created where we store install files and answer files. We need to modify the startnet.cmd file in mounted boot.wim.
You find it here: C:\PEWork_amd64\mount\Windows\System32\startnet.cmd
By default in only contains the command winpeinit. We want it to add the network drive.
wpeinit
net use Z: \\192.168.1.100\PXE /user:.\PXEUSER LetsdeploywithPXE!
Z:As you can see it contains user and password in cleartext so beware how you handle it. Anyway this is just the start.
Once the device boots up in wipe from the network we will be presented with a cmd prompt. Now we can just initiate the install or we can add the install command in the startnet.cmd and it will just go straight into Windows install 🤘.
wpeinit
net use Z: \192.168.1.100\PXE /user:.\PXEUSER LetsdeploywithPXE!
Z:
z:\Win11Pro25H2\setup.exe /unattend:z:\Unattend\unattend.xmlYou can also add PowerShell script directly from here if you want to build like a menu for different images, drivers or anything else you can come up with.
In my lab environment I do not add the setup.exe line so I can choose images or unattend.xml I want depending on what I want at the moment.
Note: You can change the default background in the WinPE boot. Change the current blue image C:\WinPE_amd64\mount\windows\system32\winpe.jpg with another one with same name.
Populate the PXE Boot folder
Copy these files from the C:\PEWork_amd64\mount\Windows\Boot\PXE folder to C:\PXE\Boot folder:
abortpxe.com
bootmgr.exe
hdlscom1.com
hdlscom1.n12
hdlscom2.com
hdlscom2.n12
pxeboot.com
pxeboot.n12
WdsConfig.inf
wdsmgfw.efi
wdsnsp.com
The folder \en-USCopy this file from the C:\PEWork_amd64\media\EFI\Boot folder to C:\PXE\Boot:
bootx64.efiCopy this file from the C:\PEWork_amd64\media\Boot folder to C:\PXE\Boot:
boot.sdiNow we commit the changes and close the boot.wim image.
Dism /Unmount-Image /MountDir:"C:\PEWork_amd64\mount" /commitCopy the C:\PEWork_amd64\media\sources\boot.wim file to our C:\PXE\Boot folder.
Create a BCD Store for Network Boot
Now we’ll use BCDEdit to build a Boot Configuration Data (BCD) store that tells the PXE boot loader how to launch WinPE. This follows Microsoft’s recommended layout for a PXE server.
Create a fresh BCD store:
bcdedit /createstore C:\PEWork_amd64\BCD
Run the following commands to prepare the BCD:
bcdedit /store c:\PEwork_amd64\BCD /create {ramdiskoptions} /d "Ramdisk options"
bcdedit /store c:\PEwork_amd64\BCD /set {ramdiskoptions} ramdisksdidevice boot
bcdedit /store c:\PEwork_amd64\BCD /set {ramdiskoptions} ramdisksdipath \Boot\boot.sdi
bcdedit /store c:\PEwork_amd64\BCD /create /d "winpe boot image" /application osloaderThis will give you an output of a GUID, that is used in the coming commands. So replace it with the GIUD you get.

Now run these commands but change the GUID to the value from above:
bcdedit /store c:\PEwork_amd64\BCD /set {GUID} device ramdisk=[boot]\Boot\boot.wim,{ramdiskoptions}
bcdedit /store c:\PEwork_amd64\BCD /set {GUID} path \windows\system32\winload.efi
bcdedit /store c:\PEwork_amd64\BCD /set {GUID} osdevice ramdisk=[boot]\Boot\boot.wim,{ramdiskoptions}
bcdedit /store c:\PEwork_amd64\BCD /set {GUID} systemroot \windows
bcdedit /store c:\PEwork_amd64\BCD /set {GUID} detecthal Yes
bcdedit /store c:\PEwork_amd64\BCD /set {GUID} winpe YesThen lastly run:
bcdedit /store c:\PEwork_amd64\BCD /create {bootmgr} /d "boot manager"
bcdedit /store c:\PEwork_amd64\BCD /set {bootmgr} timeout 30
bcdedit /store c:\PEwork_amd64\BCD -displayorder {GUID} -addlastCopy the BCD file from c:\PEwork_amd64\ to C:\PXE\Boot\
Almost there..
The folder structure under boot should look like this:

Configure DHCP Options for PXE Boot
If your network already has a DHCP server (e.g. your router or domain controller), you’ll need to configure a few DHCP options so that PXE clients know where to find the boot files on your TFTP server.
⚠️ Skip this if you’re using TFTP64’s built-in DHCP server — it’s already configured for PXE.
Key DHCP Options for PXE
Option 67 (Boot File Name)
Set this to the boot file the client should download. For BIOS/legacy clients, use:
Option 66 (Boot Server Host Name)
Set this to the IP address of your PXE/TFTP server.
I have the Unifi (Ubiquiti) system in my lab and my settings look like the image below, but it’s the same as option 66 and 67.

Prepare the Windows 11 Image and Unattended Setup File
Now that your PXE server can boot into WinPE, the next step is making sure Windows 11 installs itself — hands-off and correctly configured.
You’ll need two key things:
- A copy of the Windows 11 installation files
- An unattend.xml file that tells setup exactly what to do
Right click your ISO file and choose ‘Mount’. Go to the mounted drive and just copy all files into the image for that particular installation folder.

Creta an unattended answer file to automate your Windows deployment.
So there are multiple ways you can create the XMl file
- Windows System Image Manager (WSIM), which comes with the Windows ADK.
- Christoph Schneegans website for creating
- ChatGPT or Copilot for GitHub is a good help as well
Here is a sample
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- =========================
PASS: windowsPE
- Language/locale in WinPE
- Disk configuration (UEFI/GPT)
- Image installation
- Product Key (will be replaced by script)
========================= -->
<settings pass="windowsPE">
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<!-- en-GB locale settings -->
<SetupUILanguage>
<UILanguage>en-GB</UILanguage>
</SetupUILanguage>
<InputLocale>0809:00000809</InputLocale>
<SystemLocale>en-GB</SystemLocale>
<UILanguage>en-GB</UILanguage>
<UserLocale>en-GB</UserLocale>
</component>
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<!-- Disk 0: Wipe and create GPT layout (EFI + MSR + OS) -->
<DiskConfiguration>
<Disk wcm:action="add">
<DiskID>0</DiskID>
<WillWipeDisk>true</WillWipeDisk>
<CreatePartitions>
<!-- EFI System Partition -->
<CreatePartition wcm:action="add">
<Order>1</Order>
<Type>EFI</Type>
<Size>100</Size>
</CreatePartition>
<!-- Microsoft Reserved Partition -->
<CreatePartition wcm:action="add">
<Order>2</Order>
<Type>MSR</Type>
<Size>16</Size>
</CreatePartition>
<!-- Windows OS Partition -->
<CreatePartition wcm:action="add">
<Order>3</Order>
<Type>Primary</Type>
<Extend>true</Extend>
</CreatePartition>
</CreatePartitions>
<ModifyPartitions>
<ModifyPartition wcm:action="add">
<Order>1</Order>
<PartitionID>1</PartitionID>
<Format>FAT32</Format>
<Label>System</Label>
</ModifyPartition>
<ModifyPartition wcm:action="add">
<Order>2</Order>
<PartitionID>3</PartitionID>
<Format>NTFS</Format>
<Label>Windows</Label>
<Letter>C</Letter>
</ModifyPartition>
</ModifyPartitions>
</Disk>
</DiskConfiguration>
<!-- Install Windows 11 Pro (index 5) to Disk 0, Partition 3 -->
<ImageInstall>
<OSImage>
<InstallFrom>
<MetaData wcm:action="add">
<Key>/IMAGE/INDEX</Key>
<Value>5</Value>
</MetaData>
</InstallFrom>
<InstallTo>
<DiskID>0</DiskID>
<PartitionID>3</PartitionID>
</InstallTo>
</OSImage>
</ImageInstall>
<!-- User Data and Product Key -->
<UserData>
<AcceptEula>true</AcceptEula>
<ProductKey>
<!-- Key will be replaced by Update-UnattendedXml.ps1 -->
<Key>XXXXX-XXXXX-XXXXX-XXXXX-XXXXX</Key>
<WillShowUI>OnError</WillShowUI>
</ProductKey>
</UserData>
<!-- Suppress upgrade prompts and dynamic updates -->
<DynamicUpdate>
<Enable>false</Enable>
<WillShowUI>Never</WillShowUI>
</DynamicUpdate>
<!-- Upgrade settings for clean install behavior -->
<UpgradeData>
<Upgrade>false</Upgrade>
<WillShowUI>Never</WillShowUI>
</UpgradeData>
</component>
</settings>
<!-- =========================
PASS: specialize
- Locale in full OS
- Timezone
- Computer name settings
- Product Key (primary location for script)
========================= -->
<settings pass="specialize">
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<InputLocale>0809:00000809</InputLocale>
<SystemLocale>en-GB</SystemLocale>
<UILanguage>en-GB</UILanguage>
<UserLocale>en-GB</UserLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<!-- Suppress all UI prompts during installation -->
<ShowWindowsLive>false</ShowWindowsLive>
<!-- Sweden/Central Europe timezone -->
<TimeZone>W. Europe Standard Time</TimeZone>
<!-- Organization branding -->
<RegisteredOrganization></RegisteredOrganization>
<RegisteredOwner></RegisteredOwner>
<!-- Product Key - Primary location for Update-UnattendedXml.ps1 script -->
<ProductKey>XXXXX-XXXXX-XXXXX-XXXXX-XXXXX</ProductKey>
</component>
</settings>
<!-- =========================
PASS: oobeSystem
- OOBE configuration for Autopilot
- Hide unnecessary OOBE screens
- Keep network/online account screens for Autopilot enrollment
========================= -->
<settings pass="oobeSystem">
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<InputLocale>0809:00000809</InputLocale>
<SystemLocale>en-GB</SystemLocale>
<UILanguage>en-GB</UILanguage>
<UserLocale>en-GB</UserLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<OOBE>
<!-- Keep OOBE for Windows Autopilot enrollment -->
<SkipMachineOOBE>false</SkipMachineOOBE>
<SkipUserOOBE>false</SkipUserOOBE>
<!-- Simplify OOBE while preserving Autopilot functionality -->
<HideEULAPage>true</HideEULAPage>
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
<!-- Keep network and online account screens for Autopilot -->
<HideOnlineAccountScreens>false</HideOnlineAccountScreens>
<HideWirelessSetupInOOBE>false</HideWirelessSetupInOOBE>
<!-- Privacy settings: 3 = Express settings disabled, user chooses -->
<ProtectYourPC>3</ProtectYourPC>
</OOBE>
</component>
</settings>
</unattend>🔒 Be mindful of plain-text passwords in lab setups.
Place your unattend.xml file in C:\PXE\unattend
Ready to Go!
If you’ve followed everything up to this point, you now have a fully working, lightweight PXE deployment setup — no MDT, no SCCM, no WDS and definitely no USB.
It’s:
- Quick to set up
- Easy to manage
- Perfect for labs, small-scale rollouts, or emergency recoveries
- Fully automatable and reusable
But while this handles the image deployment, it’s just the first half of a modern device setup.
Handing Off to Autopilot + Intune
Once Windows 11 is installed, you can let Autopilot and Intune take over — pushing out:
- Device naming policies
- Wi-Fi/BitLocker/Security settings
- Required apps and configurations
- Conditional Access and compliance policies
All your PXE setup has to do is deliver a clean, Windows 11 base — from there, Microsoft’s cloud stack handles the rest.
Tips for Scaling or Improving This Setup
As you start using this more, here are a few ideas to scale it up or customise it:
- Multicast support: Not available with this setup, but worth considering for large LANs.
- Multiple Images: Store different Windows versions or configurations in separate folders, and tweak your
startnet.cmdfor dynamic selection. - Hardware-specific drivers: Inject drivers into your WinPE image if some devices don’t pick up network/storage support.
- Logging: Redirect WinPE and Setup logs to a network share to help troubleshoot installs remotely.
- Add advanced menus for multiple setups with powershell and start it with adding them in
startnet.cmd.
When Should You Not Use This?
To be clear, this approach is not a silver bullet for every scenario. Avoid using it if:
- You need dynamic provisioning based on roles/departments
- You rely on domain-joined environments with complex GPOs
- You’re managing thousands of endpoints with lifecycle reporting
In those cases, enterprise tools like MDT, SCCM, or Third-party solutions make more sense.
Wrapping Up
This PXE deployment method won’t win any awards for enterprise-grade elegance — but that’s the point. It’s fast, clean, and gets the job done with minimal setup.
You can build it in a couple of hours. Use it again and again. Reimage 5, 50, or 800 machines with almost no effort.
And with Autopilot and Intune waiting on the other side, you still get all the modern endpoint management you need — without ever reaching for a USB stick.
Great and thanks for sharing .
Very helpful.