Exchange 2019 Migration from Exchange 2016

KB ID 0001472

Exchange 2019 Migration

If Exchange 2016 was Exchange 2013 in a pretty dress, then with Exchange 2019 it’s simply added a hat. In the past, every third Exchange release was a major rebuild, but Exchange 2016 is simply Exchange version 15.1 (Exchange 2013 was 15.0 and Exchange 2016 is version 15.1).

So the Exchange 2019 Migration is pretty much the same as it was from 2013 > 2016, or even 2016 > 2016. 

  •  There should be NO Exchange 2010 servers in existence before deploying Exchange 2019. You would need to upgrade to 2013 (CU21 minimum)/2016 (CU 11 minimum) first.
  • There’s no Unified Comms Role with Exchange any more! If you need to upgrade look at Microsoft Teams.
  • Forest Functional Levels should be, (at least) Server 2012 R2.
  • WARNING: Memory recommendations are 128GB (Mailbox server) and 64GB (Edge Transport server). Make sure you have enough compute!
  • Edge Server Role is still supported.
  • Windows Server Core (2019/2022) is supported with Exchange 2019.
  • Windows Server Nano is NOT supported.
  • Windows Server 2019 (Standard or Datacenter) and Windows Server 2022 (Standard or Datacenter) Note: Exchange 2019 CU 12 minimum, are supported host Operating systems.
  • Outlook 2013 (and newer), and Outlook for mac 2016 (and newer) is supported.


As with all Exchange migrations make sure your Active Directory Domain/DNS/Existing Exchange organisation is healthy before you start. Then upgrade the existing Exchange to the latest cumulative update.

Exchange 2016 Migration

Exchange 2019 Prerequisites

You will need your Server 2012R2 or Server 2016 server fully updated and added to your domain, then to add the required roles and services use the following Powershell commands for Server 2012, 2016 and 2019;

Server 2016 / 2012 R2

Install-WindowsFeature AS-HTTP-Activation, Desktop-Experience, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS

Server 2019

Install-WindowsFeature NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS

Exchange 2019 Prerequisites

Now Required on Server 2012 R2, 2016, and 2019: You will need to install .Net 4.8 (link).

Install Net 4 7 1

Server 2022: .Net 4.8 is already included in Server 2022!

Dot Net installed on Server 2022

You need to install the MS Unified Communications API 4.0 (link).

Install Unified Communication API

You will also need to install Microsoft Visual C++ (link)

Exchange 2019 Install Visual C++

You will also now have to install the ‘IIS Rewrite Module’ (link)

Either download the Exchange 2019 install media, or insert the Exchange 2019 DVD, and launch setup.exe > Next > Next > Files will be copied over.

Don’t I need to extend the schema, forest or domain? The setup does all this for you, you don’t need to do this manually anymore, (yes you can manually do this before installing, if you want to, but unless your schema master is in a different root domain, or you’re not a schema admin, then I don’t see the point!)

Setup Exchange 2019 Server

Introduction Page > Next > At the EULA tick “I Accept…” > Next > Tick “Use Recommended settings” > Next.

Migrate To Exchange 2019 Server

Select ‘Mailbox role’, and ‘Automatically install Windows Server roles and features…” > Next > Select the install directory, Note: In production you probably DON’T want this on the Windows System drive > Next > Unless you have a reason to disable Malware scanning then select ‘No’ > Next.

Migrate To Exchange 2019 Prerequisites

Readiness Checks > Fix and Errors and heed any warnings > Install > The product will install, this will take a long time!

Install Microsoft Exchange 2019

Finish > Reboot the server.

Install Exchange 2019

An there’s our new Exchange 2019 Server.

Show Exchange 2019

Exchange 2019 EnterProduct Key

Servers > Servers > Select the 2019 Exchange Server > Enter Product Key  > Save

Note: On the pre-release version of Exchange 2019, the Exchange 2016 keys worked fine.

Exchange 2019 Product Key

At the warning click OK.

Exchange 2019 Information Store Licence Warning

Note: You can also enter the product key using the Command Shell, if you prefer.

Set-ExchangeServer {Host-name} -ProductKey 12345-12345-12345-12345-12345

Exchanger 2019 Powershell Product Key

As directed Restart the ‘Microsoft Exchange Information Store’ service.

Restart-Service MSExchangeIS

Restart Information Store Service

Transfer Exchange Certificate to Exchange 2019

Note: The ability to Export, Import & Renew certificates and creation/completion of certificate requests has been removed from the Exchange Admin Center. These changes will affect all cumulative update (CU) releases of Microsoft Exchange Server 2019 (CU12 and later) and Microsoft Exchange Server 2016 (CU23 and later).

I will leave the older (GUI) method, below for completeness – but all modern Exchange builds will need you to Open the Exchange Management Shell and perform the certificate migration via PowerShell

Transfer Certificates (PowerShell)

On your C: drive create a new folder called CERT  > Open an Administrative Exchange Managment Shell window on the SOURCE Exchange server.

Get-ExchangeCertificate -Server {Server-Name}

Exchange Get Exchange Certificates

Identify the certificate you require (by Subject) > Copy the Thumbprint text > Replace the thumbprint in this text with your thumbprint, then execute the following two  commands.

$Cert = Export-ExchangeCertificate -Thumbprint 4896265B267C38D39314121C7C6550C6E4DD23AB -BinaryEncoded -Password (ConvertTo-SecureString -String 'PASSWORD' -AsPlainText -Force)

[System.IO.File]::WriteAllBytes('\\New-Server-Name\C$\CERT\CertEx.pfx', $Cert.FileData)

Import Exchange Certificate

Remeber you will need to enable the certificate for the correct services also e.g.

Get-ExchangeCertificate -Server {New-Server-Name}


Enable-Exchange Certificate –Thumbprint {Thumb-Print} -Service IIS,SMTP

Transfer Certificates (ExchangeAdmin Centre {Older build versions only})

I’m using a wildcard certificate so I want to export the cert form my Exchange 2016 server and import it onto my new Exchange 2019 Server. You will want to do the same if you have a certificate with your public domain name on it and this will be your ‘internet facing’ Exchange server. Servers > Certificates > Select the Exchange 2016 Server, in the drop down menu > Select The Certificate > Click the ellipses (three dots) > Export Exchange Certificate > Supply a UNC path and password > OK.

Export Exchange Certificate

Change the Dropdown to the Exchange 2019 Server > Click the ellipsis > Import Exchange Certificate > Supply the UNC path and password you used (above) > Next.

Import Exchange Certificate

Add in the Exchange 2019 Server > Finish.

Import Exchange 2019 Certificate

Exchange 2019 Assign Services to Certificate

Select the newly imported certificate> Edit > Services > Select the services > Save > Note: Here I’m selecting SMTP and IIS. (You cant use a wildcard cert for IMAP,POP).

Assign Services Exchange 2019 Certificate

Exchange 2019 Changing the Exchange Web Services URLs

Exchange relies heavily on web based services, and it needs the URLs setting accordingly. (remeber for Outlook Anywhere/OWA ets you might need to change firewall settings or repoint load balancers WAP server etc to the NEW 2019 server (and let it proxy these connections to the olde rExchange servers, while they still exist).

Get-WebServicesVirtualDirectory -Server EXCH-2019 | Set-WebServicesVirtualDirectory -InternalUrl -ExternalURL

Set-OWAVirtualDirectory -identity "EXCH-2019\owa (Default Web Site)" -InternalURL -ExternalURL

Get-OABVirtualDirectory -Server EXCH-2019 | Set-OABVirtualDirectory -InternalURL -ExternalURL

Get-ECPVirtualDirectory -Server EXCH-2019 | Set-ECPVirtualDirectory -InternalURL -ExternalURL

Get-MAPIVirtualDirectory -Server EXCH-2019 | Set-MAPIVirtualDirectory -InternalURL -ExternalURL -IISAuthenticationMethods NTLM,Negotiate

Get-ActiveSyncVirtualDirectory -Server EXCH-2019 | Set-ActiveSyncVirtualDirectory -InternalURL -ExternalURL

Set-OutlookAnywhere -identity "EXCH-2019\RPC (Default Web Site)" -ExternalHostname -InternalHostname -InternalClientsRequireSSL $true -ExternalClientsRequireSsl $true -ExternalClientAuthenticationMethod:NTLM

Set-ClientAccessService -Identity EXCH-2019 -AutoDiscoverServiceInternalUri

Set Exchange 2019 service URLs

Exchange 2019 Rename Mailbox Database

Servers > Databases > Exchange always gives databases annoying names > Select the Database on the 2019 Exchange Server > Edit > Rename it  > Save.

Note: The path to the Database retains the original name (we will fix that in the next step).

Rename Exchange 2019 Database

Exchange 2019 Migration Move Mailbox Database

I’m pretty old school, I like my Exchange databases on their own drive/partition, and I like the logs on another drive/partition. To move both the Database and the Logs;

Move-DatabasePath -Identity Database-Name -EdbFilePath X:\Folder\Database\Database-Name.edb -LogFolderPath L:\Folder\Log-Folder\

Move Exchange 2019 Database and Logs

Add Exchange 2019 to the Send Connector

Mail Flow > Send Connectors > Select your mail SMTP connector(s) > Edit > Scoping > Source Server section > Add > Add in the new server > OK > Save.

Note: The Exchange server will now need to have TCP port 25 (SMTP) open outbound on your corporate firewall.

Exchange 2019 Send Connector

Hybrid (On-Prem) Exchange Migration Note

If your on-premise Exchange is part of an Office 365 Hybrid deployment you will need to add the new server to the ‘scope’ for that connector also!

Migrate Hypbrid On Prem Exchange

Decommission Exchange 2016

From this point forward we are going to start getting rid of our Exchange 2016 server, they can of course coexist, (if you wanted to wait a while).

For that reason I change the ‘mail flow’ on the firewall to point to the new Exchange server at this point, and the HTTP access for OWA, Outlook Anywhere,  and Phone/Tablet access

Exchange 2019 Mailbox Migration

Yes you can do this in the EAC, but I prefer to do this in PowerShell. But If I don’t put this here, I’ll get emails! Recipients > Migration  > Add > Move to a different Database > Add in the mailboxes/users > Next.

Exchange 2019 Migrate Mailboxes

Give the ‘Batch’ a name > Select to move Archive mailboxes (if you have them) > Select the destination (Exchange 2019) Database > Again if using archive mailboxes, select the target archive mailbox database > Set the bad Item limit to 99 > Next > Select Automatically Start > Select Automatically Finish > New. 

Exchange 2019 Mailbox Migration

From this point, this is where I don’t like the EAC it takes AGES to update with progress! From the Exchange Shell you can get an up to date view of that is going on!

Get-MoveRequest | Get-MoveRequestStatistics

Exchange 2019 Mailbox Migration Progress

For a better list of commands for moving user mailboxes, and monitoring the migration, and removing the move requests when you are finished, see the following article;

Exchange: PowerShell Commands

 Migrate All mailboxes 2016 to 2019

Migrating Exchange System Mailboxes

Before you start issue the following command;

Set-AdServerSettings -ViewEntireForest $true

In addition to the user mailboxes there are a multitude of different ‘System mailboxes’ that might be hanging around, before we can get rid of the Exchange 2016 Database we need to migrate those.

Firstly AuditLog Mailboxes

Get-Mailbox -AuditLog -Database “Mailbox-Database-2016

If there are any!

Get-Mailbox -AuditLog -Database “Mailbox-Database-2016” | New-MoveRequest -TargetDatabase “Mailbox-Database-2019

Migrate system mailboxes 2019

Then Arbitration Mailboxes

Get-Mailbox -AuditLog -Database “Mailbox-Database-2016” -Arbitration

If there are any!

Get-Mailbox -AuditLog -Database “Mailbox-Database-2016” -Arbitration | New-MoveRequest -TargetDatabase “Mailbox-Database-2019

Migrate Arbitration mailboxes 2019

Then Monitoring Mailboxes

Get-Mailbox -Monitoring -Server “Mail-2016

If there are any!

Get-Mailbox -Monitoring -Server “Mail-2016” | New-MoveRequest -TargetDatabase “Mailbox-Database-2019

Migrate Health mailboxes 2019

Make sure there are no archive mailboxes;

Get-Mailbox -Auditlog -Database “Database-Name” -Archive

If there are, move them, (as above.)

Also move any  Discovery mailboxes, and move them to 2019;

Get-Mailbox DiscoverySearchMailbox* | New-MoveRequest -TargetDatabase “Mailbox-Database-2019

Migrating Public Folder Mailboxes

Remember after Exchange 2013 these are just mailboxes! you can move them like any other mailbox 🙂

Migrate Public Folders Exchange 2019

Delete Exchange 2016 Database(s)

When you are 100% sure theres nothing left on the old database(s) remove them;

Get-MailboxDatabase -Identity “Mailbox-Database-2016” | Remove-MailboxDatabase

Exchange 2016 Delete Mailbox Database

Uninstall Exchange 2016

Your install directory may not be on the C: drive so change your path accordingly;

cd “C:\Program Files\Microsoft\Exchange Server\V15\Bin

setup.exe /mode:uninstall

Uninstall Exchange Command Line

At this point make sure your backup/replication software is pointed to the new Exchange 2019 Server.


Note: If you are running an On-Premise Exchange in Hybrid mode, and post migration if you have any mail flow problems see the following article;

No Mail Flow On-Premise To/From Office 365

Related Articles, References, Credits, or External Links


Author: PeteLong

Share This Post On


  1. Nice Article and well explained

    Post a Reply
    • Has anyone had any issues with users being unable to view ‘Free/Busy’ of users who have been migrated? This is not the initial issue of not being able to see free/busy after migration unless you restart the App Pools. This is users who have not been migrated not being able to view the migrated users even after full server reboots.

      We have been searching everywhere and have not been able to find a resolution. I guess there are not many people who have done the migration yet, but would be interested if anyone has experienced the same issue and if they found the resolution.

      At the moment we are having to suggest to users to change their default calendar permissions to reviewer during the migration period which is not ideal.

      Post a Reply
      • We are having the same issue and Exchange 2016 users are unable to see the free/busy of Exchange 2019 test users. Typically, this direction of free/busy works, but for some reason there is something that is not right. Been troubleshooting for a few weeks but have not found the resolution yet.

        I notice this post is a few months old. Has there been resolution to the free/busy issues you have been having?

        Post a Reply
        • We are having the same issue. Users still on Exchange 2016 could not see free/busy on the migrated user (to Exchange 2019). Change default calender permission to reviewer works but is no good solution. Very interested in a solution for that.

          Post a Reply
      • I also came across the free/busy issue with 2019 when migrating a customer on 2016. Exchange 2019 / Server 2019 has TLS 1.2 enabled by default. This is the issue with the free/busy info not displaying for 2019 mailbox users. To resolve this, you have to add/merge in some registry entries and then restart the 2016 servers to enable TLS 1.2. The only other workarounds are to lower TLS to 1.1 on the 2019 servers (less secure) or, as a previous poster mentioned, add Reviewer rights to the default calendar permissions on the mailboxes. TLS 1.2 is the way to go.

        Post a Reply
  2. Great write up, thanks very much!

    One thing I’d add is to remember to check your Public Folder mailbox and migrate that before deleting the old servers’ database.

    Post a Reply
  3. For the step about the Monitoring Mailboxes (Get-Mailbox -Monitoring -Server “Mail-2016”), I’ve got several HealthMailbox items that are taking forever to migrate.

    I thought those were server- or database-specific.

    Do those really even need to be migrated, or can they just be removed or ignored?

    Post a Reply
    • You can delete them (if the old server is being retired) they are auto created 🙂


      Post a Reply
  4. What about setting all the URL’s / URI’s?

    I’d suggest running this PS script to check them all then updating where needed.

    Start-Transcript log0.txt
    Get-OabVirtualDirectory | fl server, Name, *URL*, *auth*
    Get-WebServicesVirtualDirectory | fl server, Name, *URL*, *auth*
    Get-EcpVirtualDirectory | fl server, Name, *URL*, *auth*
    Get-ActiveSyncVirtualDirectory | fl server, Name, *URL*, *auth*
    Get-OutlookAnywhere | fl server, Name, *URL*, *hostname*, *auth*
    Get-OwaVirtualDirectory | fl server, Name, *URL*, *auth*
    Get-ClientAccessServer | fl Name, OutlookAnywhereEnabled, AutodiscoverServiceInternalUri
    Get-ExchangeCertificate | fl FriendlyName, Subject, CertificateDomains, Thumbprint, Services, Issuer, *not*
    Get-MapiVirtualDirectory | fl server, Name, *URL*, *auth*
    Get-ClientAccessArray | fl
    Get-ExchangeServer | fl *version*
    Get-OrganizationConfig | fl *mapi*

    Post a Reply
  5. What is best practice (or best timing I guess) for keeping existing server name and IP. For example if 2016 is currently MailServ.domain.local with, then I add 2019 server of MailServ01.domain.local with Once 2016 is decommissioned can I just change ip and name, reboot, and bobs your uncle?

    Post a Reply
    • Hi Matt, The server name is not really important. as long at the service URLs are the same (of have been repointed) I’ve never needed to retain an Exchange host name?

      Post a Reply
  6. Thank you! This guide is very helpful! I just have one question.

    Is this for installing Exchange 2019 ON TOP OF a CURRENT Exchange 2016 server, or is this for deploying a brand new server into the environment?

    Post a Reply
    • New Server – it’s always the best way with Exchange 🙂

      Post a Reply
  7. Excellent article, thank you!
    We are currently running Exchange Server 2013 CU16.
    Do we need to upgrade Exchange to the latest 2013 version CU22, before migrating to Exchange 2019 ?

    Post a Reply
    • ALWAYS, bring the oldest Exchange up to the latest CU before deploying the new version 🙂


      Post a Reply
  8. Great write up – thank you!
    What considerations are added if I have a three server DAG that I’m looking to upgrade from 2013 to 2019?
    I’m guessing that I need to remove the DAG and reduce to one server first, but wanted to make sure.

    Post a Reply
    • I’ve not done one (from 2013 to 2019), but I’ll throw this up for anyone else to comment.

      Post a Reply
  9. Hi,

    Great article! Thanks for the write-up.

    Based on the mailbox movement and design of Exchange 2016 and 2019, do mailbox moves between 2016 and 2019 cause Outlook to need to be restarted, or does it quietly and automatically shift to the new server in a stateless way? Based on what I’ve read about the architecture of the ClientAccessServices on Exchange 2016 for fail-over / DAG — a mailbox move should be stateless, but I’ve seen nothing to confirm or deny that.


    Post a Reply
    • I agree, it should not matter, the worst that’ll happen is, the user will gets a “an administrator has made changes to your mailbox, that require you to restart Outlook’ popup.



      Post a Reply
      • Hi, so it means that I can manage this upgrade anytime even during work hours so users won’t have no stops?

        Post a Reply
        • Hi Matteo, yes performance will not be as good, but you can migrate users while they work, if they are logged in when they migrate, they get a popup onscreen that’s says something like ‘An administrator has made a change that requires you to restart Outlook’ and it stays offline until they do. If you have twitchy users, email everyone beforehand to warn them.

          Post a Reply
  10. Hi,

    Im currently migration Exchange 2013 CU22 to Exchange 2019. After the installation of Exchange 2019 i cant transfer/check te certificates via ECP. The following message appears
    The Exchange Certificate operation has failed with an exception on server SV-EX01. The error message is: Access is denied.

    When i type Get-ExchangeCertificates in the management powershell i do see the certificates
    Im logging in with the built-in Administrator account in ECP. Any1 has a clue what is going on?

    Post a Reply
    • Found the solution.
      Adding Exchange Trusted Subsystem to the local administrator group on the new Exchangeserver fixed it.

      Post a Reply
  11. Hello guys
    I´m gonna to migrate all users from Exchange 2013 to Exchange 2019 but I have issue with one mailbox when i run commando “new-moverequest user -targetdatabase DB1” and there is culture not supported. I checked Adsiedit and attribute msexchuserculture is correct en-US but i still get error:
    The call to ‘net.tcp:// (15.0.1395.0 caps:0400001F7FFFFFCB07FFFF)’ failed. Error details: Culture is not supported.
    Parameter name: culture
    4096 (0x1000) is an invalid culture identifier..
    + CategoryInfo : NotSpecified: (:) [New-MoveRequest], RemoteTransientException
    + FullyQualifiedErrorId : [Server=exch2019,RequestId=597c38e1-4490-47e4-8fbf-bef40c251031,TimeStamp=13/08/2019 12
    :43:36] [FailureCategory=Cmdlet-RemoteTransientException] D0F6239B,Microsoft.Exchange.Management.Migration.Mailbox
    + PSComputerName: exch2019,
    Can someone help me please? Thanks for perfekt article btw!!!
    Regards Darko

    Post a Reply
  12. This is a beautiful migration plan, thank you very very much!!!!
    It worked great for my 2013 to 2019 migration

    In case others encounter this, when using the Exchange Admin Center from the new Exchange 2019 server it is necessary to append the version to the URL to insure you are getting the right features and functionality during the co-existence:


    This drove me crazy for days until I ran across another person having other issues.

    Post a Reply
  13. Any additional step if a basic Exchange hybrid configuration is setup on the 2013 server and Exchange Online? I have a few users with mailboxes in Exchange Online and migrating from 2013 to 2019. Not sure if the hybrid configuration will just carry over?

    Post a Reply
    • You run the hybrid wizard again, it detects you have one in place and upgrades/updates it accordingly.

      Post a Reply
  14. Thnx for sharing this, i ll try this soon! i did not see anything about Database availabiltiy groups in your article. can you add an ex19 to an ex16 dag?

    Post a Reply
    • You can’t mix Exchange version (any version) in a DAG.


      Post a Reply
      • Not sure that is true.

        Link Removed

        Post a Reply
  15. Hi,

    Can it’s possible to make a article on the public folder migration side ? (also from 2016 to 2019) please ?


    Post a Reply
    • It’s easy now (exchange 2013 and above)
      Get-Mailbox -PublicFolder -Server OLD-SERVER-NAME | New-MoveRequest -TargetDatabase TARGET-MAILBOX-DATABAASE


      Post a Reply
      • You should add this to the main text in the appropriate place, when I saw what was there now regarding public folder moves I got confused then remembered I had seen something in the comments about it previously.

        Post a Reply
  16. About to add my first EX2019 server to an existing EX2016 environment (all prerequisites in place) The EX2019 server will sit around for quite some while dormant before I finally start moving mailbox and send/receive etc connectors to it.

    As with an EX2013 to EX2016 migration do I need to revert my SCP from the FQDN of the new EX2019 server (does it change it) back to the SCP value “pointing to my old/existing EX2016”, understand that the SCP always reverts to the highest value EX server version or is this not a factor between EX2016 and EX2019 ?

    Thank You


    Post a Reply
    • I’ve NEVER needed to manually manipulate an SCP (providing auto discover works!)

      Post a Reply
      • Thank You for the quick reply!

        I did the install of the first Ex2019 server in our EX2016 environment today and the SCP issue did indeed creep in. By default Outlook Clients seeks out the highest version EX server with autodiscovery in this case EX2019 but easily overcome by ADSI edit and point the EX2019 server SCP name space to one of the EX2016 servers and all sorted. Of course if one installs a certificate immediately on the EX2019 server before any Outlook clients attempts auto discover this is a non issue.

        Learnt this the hard way when I did EX2013 to EX2016.

        Keep the BLOG up! You doing a great job Pete (Thank You)


        Post a Reply
  17. we have exchange 2016 on a VM and we need to Upgrade to exchange 2019 on other Physical Server can we follow this step or we should upgrade on the VM PeteLong.

    Post a Reply
    • No, build a new VM and follow this procedure, I never like in-place upgrades.

      Post a Reply
  18. Installing Exchange 2019 on Server Standard 2019 (1809 full install):

    It required me to install .NET Framework 4.8 even though your article says it’s not necessary.

    Also, any idea why the Unified Communications stuff is still required as prerequisites when the function is actually no longer in Exchange?

    Post a Reply
    • Exchange is CU5, maybe that’s the reason. Seems I read something about it being required where it previously wasn’t.

      Post a Reply
  19. Love your articles – always very clear and helpful! One little thing – I found that I DID have to install .NET 4.8 on my Windows 2019 server to install Exchange 2019. Your comment indicates that it’s not required, so you might want to revise that.


    Post a Reply
  20. Install of 2019 went fine, but post config, moving any mailbox from existing 2013 to 2019 doesn’t work, On 2019 the batch process just reports no progress, no hang or fail just says syncing,I take your point it can sometimes takes ages but after 24hrs the same and from PS there are no stats at all! If i try and do this from 2013 I get on the Migration tab an error before I even try and add a migration batch “A version mismatch was detected (Actual:6, Expected:5).” Googling this seems to indicate some sort of Arbitration issue, should the arbitration mailbox have moved to 2019, its currently still in 2013 database. If so how to move? But this should not stop the over of mailboxes? Thanks for setup process.

    Post a Reply
    • Are you simply looking in the EAC? use Powershell to instigate the move of a test mailbox, then use a get statistics on the same move to see what it’s doing?

      Post a Reply
    • Just ran into this issue. Looks like you need to move the migration mailbox to the 2019 server in order for the batches to process. Maybe similar to how you cant see a 2019 database status if logged into ECP hosted by a 2013 server.

      Solution was to migrate the migration mailbox. This can be found in active directory if you search for “migration”. Once I moved that, I was able to start a migration batch using a CSV of email addresses and then the Get-MigrationUser command actually populated.

      See here for more info:

      Post a Reply
  21. Hi Pete, great article, I followed it step by step and stopped before the migration as I wanted to stay for a few days with the coexistence of 2016 and 2019; i started to not receive emails anymore, couldn’t realize why, then gmail gave me this message

    Server at db1901 returned ‘400 4.4.7 Message delayed’
    28/05/2020 18:34:26 – Server at db1901 returned ‘451 4.4.0 DNS query failed. The error was: SMTPSEND.DNS.NonExistentDomain; nonexistent domain db1901 -> DnsDomainDoesNotExist: InfoDomainNonexistent’

    (Db1901 is the name of the Db of my new server)

    Now I don’t kow if it is more convenient to go at the end of the procedure (complete the migration) or maybe rollback and uninstall 2019.

    What do you think?

    Thanks in advance for any help

    Post a Reply
    • Check and test! I always check internal mail flow both ways, and check internal/external mail flow from old/new system as I go along. And make sure you have bounced both systems sometimes the MTA gets upset and stops passing traffic on new deployments until you reboot. If all that gets done and there’s still problems go to the server that cannot send and look at its outbound queues, it will have an error that you can google!

      Post a Reply
      • Hi, problem solved, kind of a Newbie Mistake but it’s little strange: I realized that I gave an old DNS Ip address to my server, I was able to send emails from internal users to external adresses but not able to receive mails and not able to reply even from internal to internal. The funny thing is that it was the secondary DNS (on the network interface) while the first one was working correctly. Since i changed secondary dNS on the network interface of the new exchange server everything started to work again and the mail queue unblocked.

        Post a Reply
  22. Hi Pete, I did the whole process and now I am at the end; I have a question: in the certificate part I saw that you exported the old certificate from the old server and imported it in the new exchange; I did it as well, but I keep getting error warning on the clients because my certificate has also the name of the old server in it and not the name of the new server (on which clients are connecting now). Would You rather advise to get a Digicert (or whatever company) certificate or may I did something wrong?

    Post a Reply
    • If it’s in date, Digicert will re-generate it for you and remove/change the old name usually 🙂

      Post a Reply
  23. Hi Pete,
    I have done everything and now need to decommission 2016 but when I try to delete 2016 DB I get the error “This mailbox database is associated with one or more active MailboxImport requests….” but when I try to see these Import requests with cmdlet get-mailbox import requests nothing shows up; I also tryied to execute the remove Import request cmdlet but same error… What Would You rather advise? Is adsi edit the only way or maybe there is some less breathtaking method?
    Thanks in advance

    Post a Reply
    • As long as you KNOW there’s nothing in there, then simply ADSIedit it out 🙂

      Post a Reply
  24. Hi, Pete. I’m facing an odd situation (unfortunately of my own making). A few years ago, I installed Exchange 2013 on a Windows Server 2016 DC (VM) for a very small client. At the time, I didn’t realize that Exchange 2013 was not fully compatible with Server 2016. Yes, I DO know that it’s a bad idea to install Exchange on a DC, but in this environment I didn’t have a choice. Anyway, it works although not entirely without some minor issues. The main one: I tried to upgrade to a later CU. I called MS tech support when it wouldn’t install and was told that in this unsupported environment you cannot upgrade the Exchange CU after the initial installation.

    Now, hopefully I will be installing a new Windows 2019 VM and migrating to Exchange 2019 on that new server. I plan of course to uninstall Exchange 2013 when the migration is finished.

    My question: The original (and current) Exchange 2013 version is CU16. Will this FUBAR my migration or will it work OK without upgrading the CU level of Exchange 2013?

    Thanks for your help!

    Post a Reply
    • Wow that is a pickle? You said that they are VMs? Clone and sandbox them, then you can perform the upgrade and test it?

      Post a Reply
      • A big fat sour pickle indeed! The sandbox idea is a good one, but I don’t have the resources at the client to do this. I’d have to move the VMS to a server on my own network – quite a bit of additional work…

        I’m almost thinking that, aside from some disruption for the users, it might be a better idea to export the mailboxes to psts (there are a fairly small number), uninstall Exchange 2013, then install Exchange on the new server, create new accounts and import the mailboxes. Do you see any problems with that approach?

        Post a Reply
        • Hi Diane, Ive never done it that way. I’d much prefer a clean migration.

          Post a Reply
          • OK – thanks for the advice. I’ve double-checked and it looks like the migration from the version of 2013 that I have to 2016 should work OK.

            Thanks for your sage advice!


          • Glad to help 🙂

  25. Currently got a bit of a strange issue where we’ve implemented some 2019 Exchange servers into an existing 2013 hybrid deployment with Office 365. All the directories have been changed but we’ve not yet added the new servers into the hybrid deployment or moved the arbitration mailboxes.
    The behaviour we’re seeing is that if a user (without a mailbox) logs in to the new servers, they can do that on the local server using localhost/ecp for example. It also works if they log on to that server using the new FQDN. Problem arises when a user who as hybrid mailbox tries to log on to the new address and gets an error 500. I’ve tried using the different Exchange addresses e.g. 15.2 at the end of the ECP address but it still doesn’t work. I’m getting to the point where I think it would get resolved by running the hybrid wizard and moving arbitration but need a better argument to integrate them into the existing environment other than I’ve got no other ideas.

    Post a Reply
    • Chris, did you ever get this figured out? I’m dealing with the same thing.

      Post a Reply
  26. Having just done this, a note about monitoring mailboxes. I migrated these from the 2016 server to the 2019 server, and when I proceeded to delete the old database, the event log on the new server started showing 3008 Warnings from the MSExchange Front End HTTP Proxy, complaining that it couldn’t find a database (which I assumed was the old database). Deleting the old monitoring mailboxes (in fact, deleting them all and letting Exchange recreate them) appears to have silenced these warnings.

    Post a Reply
  27. Do we not need to update URL/URi stuff when migrating? At the moment when checking this, the virtual dirctories are all still pointing locally? When locking at the Exchange 2016 directories, they are filled out with the expected https: domain info etc.
    I am installing Exchange2019 on a new vm so not directly migrating/upgrading on the same box. Maybe this guide is for upgrading on the same box perhaps??

    Post a Reply
    • >>Maybe this guide is for upgrading on the same box perhaps??

      Certainly not, you can update the URI, though it’s much simpler to point the URLs to your new server?


      Post a Reply
  28. Amazing article Thank you!!

    Post a Reply
    • this worked well for me until i got to the migrating mailboxes. I have only managed to get one mailbox migrated from the 2016 db to the 2019db. Everytime i run “New-MoveRequest -Identity david -TargetDatabase “EX2019″ -Priority Highest”, the migration goes until 20% then i get the TransientFFailureTarget, or StalledDueToSource_DiskeLatency error. Both exchange servers Are VM’s which were both stored on the same Storage unit. I read up that this could be due to physical disk issues. I moved both VM’s to the Host server which has a mirrored drive, and I am still getting the same errors, I have created new databases on both servers, What I found here is that I can migrate from database to database within the same exchange but not across exchanges without these problems. Any ideas on how to get these migrated.

      Post a Reply
  29. We have Exchange 2016 and Exchange 2019 running in the environment. We moved all users mailboxes and connectors moved over to the newer server. We have dismounted all the data store on MS Exchange 2016 server. We have been running both servers in co-existing environment for a while, it work fine. We are not getting ready to remove Exchange 2016 from the environment. We figure we shut down the server before we un-install our 2016 Exchange server. However, as soon as we shut down our Exchange 2016 server all our Outlook clients gets flaky as it tries to connect to our Exchange 2016 server. Some times it works fine but every other time it tries to connect to our 2016 server. Am i missing anything?? Are we support to change URL and URI?

    Post a Reply
    • URI or Autodiscover (which is also a URI of course).

      Post a Reply
    • Hi Sandman
      I have the same problem.

      Were you able to solve it, it would help me a lot.

      Thank you

      Post a Reply
    • I have the Same issue wanted to shutdown the old server but in client cant connect.
      autodiscover is pointing to the new server.
      if i change uri to on the Old 2016 clients access that,
      Database store has been dismount ond the old server, forfront client server have been disable on the old server.

      Post a Reply
  30. would be nice if the prerequisite section included what is needed for server core. doing a build in a test environment and found 3 features (rsat-clustering-mgmt, web-lgcy-mgmt-console, windows-identity-foundation) are not valid in 2019 server core.

    Post a Reply
  31. In Which moment the Mail Flow should be moved to the Exchange 2019, before or after migrate the Mailboxes? or in different order, Migration of the mailboxes can be done after Mail Flow is on 2019, or should be done before?

    Post a Reply
    • TBH – it does not matter, as long as the ORG is healthy you can change email flow at any time

      Post a Reply
  32. Hi,

    I enjoy your articles, as they are highly technical and informative yet easy to follow, for the not so professional IT guy.

    I am preparing to move our schools Exchange 2013 to 2019 and using a similar but smaller system as a test run, before committing the schools Exchange. The installation is on vmware esxi 6.7 when following your KB ID 0001472 Exchange 2019 Migration

    Exchange 2019 Migration Move Mailbox Database
    Move-DatabasePath -Identity Database-Name -EdbFilePath X:\Folder\Database\Database-Name.edb -LogFolderPath L:\Folder\Log-Folder\
    On the second confirm – to perform the move operation I entered “Y” to confirm instead of just and PowerShell crashed.
    When rerunning process – get error msg – Move-DatabasePath -Identity WARNING: The source and destination locations are the same, but when I try to reseed the database (reset) I get a msg that these commands are only for multiple mailbox copies will not work on system with single mailbox copy. How can I reset paths to allow running the move process again.

    Kind Regards

    Yakov Konig

    IT Support
    Beis Chinuch Lebonos Girls School London

    Reply to either email addresses bellow school / my own /

    Post a Reply
  33. I’ve migrated everything to 2019 following your great details above. Before uninstalling exchange 2016 we powered down that server. LIke to do that for a couple of weeks and make sure everything is stable. However – when we do so clients stop connecting to exchange – they are still looking for exchange 2016? Power backup the old server and the clients all connect again. What do I need to change so we can power down the old server for a while but allow the outlook clients to still connect? Thank you!

    Post a Reply
    • Check all you URI addresses!

      Post a Reply
  34. Just completed a migration from 2013 to 2019. Everything is working correctly *except* one external program that uses EWS to make calendar appointments. The service works from outside the network but not inside. All tests on pass. When I run Test-“OutlookWebservices | fl Scenario, Result, Error”, autodiscover passes but EWS fails with 401 unauthorized. Any idea where I can look to fix this?

    Post a Reply
  35. To monitor progress of move requests, use following powershell statement, it refreshes automatically every 60 seconds:

    do { $t = Get-MoveRequest | Get-MoveRequestStatistics | format-table ; cls; Write-Host “Last update:” (get-date); $t; start-sleep -Seconds 60 } until ($false)

    Post a Reply
  36. Nice job. The only thing I would add would be to update any public/private DNS entries or load balancers you may have for OWA/ECP access, before you decom the 2016 server…and honestly, let it sit for a day for anything cached to update.

    After all, most people don’t go to https://servername/ to access OWA, they go to something more friendly like

    It’s minor, and mostly common sense, but just for completeness.

    Post a Reply
  37. Thanks for the guide!
    I have set up Exchange2019 on new server with the intention to migrate from Exchange 2016.
    Certificates, migration mailbox have been transfered over to new server. New mailboxes databases on Exchange 19 created. Pre-requsites of Forest functional, AD schema all checks out well.

    In order to test the new server, I set it to a different domain name while Exchange 16 remains at Also migrated a test mailbox to new server sucessfully – OWA on Exchange19 is able to access this test mailbox.

    When I try to access a mailbox still on the Exchange16 database from Exchange19 OWA, login was sucessful but after which I encounter a 503 error on the next page. Further checking on this error page shows that there was no valid certificate (althout the domain name still remains on the address bar and the previous login page had a valid cert with the exact domain name)

    Did some research and seems to be a case of certificate issue on the Exchange19 IIS. I have tried all sorts of certificate combination settings (CA cert, self-signed cert, new CA cert with, new self-signed cert) both on Default Web and Backend on both Exchange 16 and Exchange 19 but the error still persists.

    Any suggestions on where I could have gone wrong and what else I should try? Or any troubleshooting logs I can refer to?


    Post a Reply
    • Did you manage to resolve this issue? I have same problem too.
      when try to open mailbox reside in Exchange 2016 from OWA Exchange 2019 or vice versa

      Post a Reply
  38. Thanks for the very good guide A couple of issues with missing end quotes and such but nothing not obvious with a close look. I researched this process on lots of posts and all said simply “uninstall Exchange 2016” WITHOUT the details about migrating the system mailboxes that are sort of hidden.. this is key and thank you for showing the easy steps. The command line “uninstall is nice as well”

    Post a Reply
  39. First…thank you!!! I’ve used a bunch of your guides.

    Second…question…I’ve migrated from 2013 to 2019. Everything has been moved to 2019, EXCEPT all OWA and ActiveSync clients are still point to 2013. What’s the most transparent way to the users to move them to 2019? Meaning…right now to access OWA, we go to and our phones point to the same. How do I get them over to 2019 instead? I already have SSL cert installed on 2019 and have complete access to both internal and external DNS settings.

    Do I simply uninstall Exchange from 2013 and shutdown, then add a binding on 2019 that has the same URL as 2013 did? (Plus make IP/DNS changes)?

    Post a Reply
    • I’m having a similar question. Client used Exchange 2013 for years, now wants to migrate to Exchange 2019 but they want to change the URL while doing it. The old server can be found on but they want to change this to I know how to do that including certificates but I think this requires me manually changing all iPhones and Microsoft Outlook profiles to be recreated and point to the new URL. Is there a way to change that any other way without causing disruption for users?

      Post a Reply
      • In Exchange, not really, but change the DNS A record for to be a PTR record that points to
        Assuming the cert is publically signed and resolves to the correctn IP! Then that should work? Note Some phones might need a reboot.

        Post a Reply
  40. I came across articles stating that your arbitration (System) mailboxes should be moved prior to moving your normal user mailboxes. Is this the case? Or is this only required with pre 2016 exchange servers.

    I have already moved my user mailboxes and came across this right before I was about to move my system mailboxes. Should I move my user mailboxes back to the old server and then move the system (arbitration) mailboxes first? Thought please.

    Post a Reply
  41. Best of article for exchange migration.

    Thanks a lot.

    Post a Reply
    • Thanks for the feedback!


      Post a Reply

Submit a Comment

Your email address will not be published. Required fields are marked *