diff --git a/.appveyor.yml b/.appveyor.yml
deleted file mode 100644
index bb08c436468d43df5200dfe05f5201936972df0d..0000000000000000000000000000000000000000
--- a/.appveyor.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-init:
-  # Reset dynamic port range from AppVeyor setting (1025-65535) to Windows default (49152-65535),
-  # to prevent conflicts with ANCM random ports (1025-48000).
-  - netsh int ipv4 show dynamicport tcp
-  - netsh int ipv4 set dynamic tcp start=49152 num=16384
-  - netsh int ipv4 show dynamicport tcp
-
-  - git config --global core.autocrlf true
-branches:
-  only:
-    - dev
-    - /^release\/.*$/
-    - /^(.*\/)?ci-.*$/
-install:
-  - ps: .\tools\update_schema.ps1
-  - git submodule update --init --recursive
-  - net start w3svc
-build_script:
-  - ps: .\run.ps1 default-build /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISForwardsCompatibilityTests=true
-clone_depth: 1
-environment:
-  global:
-    DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
-    DOTNET_CLI_TELEMETRY_OPTOUT: 1
-test: off
-deploy: off
-os: Visual Studio 2017
diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 17d90aec31e287a0c20bb1ba5dc872c95022c619..0000000000000000000000000000000000000000
--- a/.editorconfig
+++ /dev/null
@@ -1,24 +0,0 @@
-# EditorConfig is awesome:http://EditorConfig.org
-
-# top-most EditorConfig file
-root = true
-
-[*]
-indent_style = space
-charset = utf-8
-trim_trailing_whitespace = true
-insert_final_newline = true
-
-[*.cs]
-indent_size = 4
-dotnet_sort_system_directives_first = true:warning
-
-# Xml files
-[*.{csproj,config,props,targets,ruleset,config,resx,xml}]
-indent_size = 2
-
-[*.{json, yml}]
-indent_size = 2
-
-[*.{ps1,sh}]
-indent_size = 4
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 204c7323a3702f97690e533d9754f4141b349e3c..0000000000000000000000000000000000000000
--- a/.gitattributes
+++ /dev/null
@@ -1,53 +0,0 @@
-*.doc  diff=astextplain
-*.DOC	diff=astextplain
-*.docx	diff=astextplain
-*.DOCX	diff=astextplain
-*.dot	diff=astextplain
-*.DOT	diff=astextplain
-*.pdf	diff=astextplain
-*.PDF	diff=astextplain
-*.rtf	diff=astextplain
-*.RTF	diff=astextplain
-
-*.jpg  	binary
-*.png 	binary
-*.gif 	binary
-
-*.cs text=auto diff=csharp 
-*.vb text=auto
-*.resx text=auto
-*.c text=auto
-*.cpp text=auto
-*.cxx text=auto
-*.h text=auto
-*.hxx text=auto
-*.py text=auto
-*.rb text=auto
-*.java text=auto
-*.html text=auto
-*.htm text=auto
-*.css text=auto
-*.scss text=auto
-*.sass text=auto
-*.less text=auto
-*.js text=auto
-*.lisp text=auto
-*.clj text=auto
-*.sql text=auto
-*.php text=auto
-*.lua text=auto
-*.m text=auto
-*.asm text=auto
-*.erl text=auto
-*.fs text=auto
-*.fsx text=auto
-*.hs text=auto
-*.rc text=auto
-
-*.vcxproj text=auto
-*.csproj text=auto
-*.vbproj text=auto
-*.fsproj text=auto
-*.dbproj text=auto
-*.sln text=auto eol=crlf
-*.sh eol=lf
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 42ecc5d6c7461ea4762b34344997cee3ee6101cd..0000000000000000000000000000000000000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "test/gtest/googletest"]
-	path = test/gtest/googletest
-	url = https://github.com/google/googletest
diff --git a/.vsts-pipelines/builds/ci-internal-21.yml b/.vsts-pipelines/builds/ci-internal-21.yml
deleted file mode 100644
index afb252eae867641ac28c2916eef08d5764bbde53..0000000000000000000000000000000000000000
--- a/.vsts-pipelines/builds/ci-internal-21.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-trigger:
-- release/2.2
-
-resources:
-  repositories:
-  - repository: buildtools
-    type: git
-    name: aspnet-BuildTools
-    ref: refs/heads/release/2.2
-
-phases:
-- template: .azure\templates\jobs\default-build.yml@buildtools
-  parameters:
-    agentOs: Windows
-    codeSign: false
-    buildArgs: /p:BuildServerIIS21=true /p:SkipIISExpressTests=true /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISForwardsCompatibilityTests=true
-    beforeBuild:
-      - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 SetupDumps"
-        displayName: Prepare repo
-    afterBuild:
-      - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown"
-        displayName: Stop AppVerifier
-        condition: always()
-      - task: PublishBuildArtifacts@1
-        displayName: Upload logs
-        condition: eq(variables['system.pullrequest.isfork'], false)
-        inputs:
-          artifactName: logs
-          artifactType: Container
-          pathtoPublish: artifacts/logs
\ No newline at end of file
diff --git a/.vsts-pipelines/builds/ci-internal.yml b/.vsts-pipelines/builds/ci-internal.yml
deleted file mode 100644
index 260baf4536f61f496484cf78b475d93b9a486ef6..0000000000000000000000000000000000000000
--- a/.vsts-pipelines/builds/ci-internal.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-trigger:
-- master
-- release/*
-
-resources:
-  repositories:
-  - repository: buildtools
-    type: git
-    name: aspnet-BuildTools
-    ref: refs/heads/release/2.2
-
-phases:
-- template: ../templates/build-steps.yml
diff --git a/.vsts-pipelines/builds/ci-public.yml b/.vsts-pipelines/builds/ci-public.yml
deleted file mode 100644
index 0ed1a241abfc0620bd52ce623e4f5b676199ec74..0000000000000000000000000000000000000000
--- a/.vsts-pipelines/builds/ci-public.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-trigger:
-- master
-- release/*
-
-# See https://github.com/aspnet/BuildTools
-resources:
-  repositories:
-  - repository: buildtools
-    type: github
-    endpoint: DotNet-Bot GitHub Connection
-    name: aspnet/BuildTools
-    ref: refs/heads/release/2.2
-
-phases:
-- template: ../templates/build-steps.yml
diff --git a/.vsts-pipelines/templates/build-steps.yml b/.vsts-pipelines/templates/build-steps.yml
deleted file mode 100644
index 4db5633ddc768b0141981e843f822653d543451c..0000000000000000000000000000000000000000
--- a/.vsts-pipelines/templates/build-steps.yml
+++ /dev/null
@@ -1,88 +0,0 @@
-phases:
-- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools
-  parameters:
-    agentOs: Windows
-    phaseName: IIS_Express_Tests
-    buildArgs: /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISTests=true /p:SkipIISForwardsCompatibilityTests=true
-    beforeBuild:
-      - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 Setup"
-        displayName: Prepare repo
-    afterBuild:
-      - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown"
-        displayName: Stop AppVerifier
-        condition: always()
-      - task: PublishBuildArtifacts@1
-        displayName: Upload logs
-        condition: eq(variables['system.pullrequest.isfork'], false)
-        inputs:
-          artifactName: logs
-          artifactType: Container
-          pathtoPublish: artifacts/logs
-
-- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools
-  parameters:
-    agentOs: Windows
-    phaseName: IIS_Tests
-    buildArgs: /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true
-    beforeBuild:
-      - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 Setup"
-        displayName: Prepare repo
-    afterBuild:
-      - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown"
-        displayName: Stop AppVerifier
-        condition: always()
-      - task: PublishBuildArtifacts@1
-        displayName: Upload logs
-        condition: eq(variables['system.pullrequest.isfork'], false)
-        inputs:
-          artifactName: logs
-          artifactType: Container
-          pathtoPublish: artifacts/logs
-
-- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools
-  parameters:
-    agentOs: Windows
-    phaseName: IIS_BackCompat_Tests
-    buildArgs: /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true
-    beforeBuild:
-      - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 Setup"
-        displayName: Prepare repo
-    afterBuild:
-      - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown"
-        displayName: Stop AppVerifier
-        condition: always()
-      - task: PublishBuildArtifacts@1
-        displayName: Upload logs
-        condition: eq(variables['system.pullrequest.isfork'], false)
-        inputs:
-          artifactName: logs
-          artifactType: Container
-          pathtoPublish: artifacts/logs
-
-- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools
-  parameters:
-    agentOs: Windows
-    phaseName: IIS_ForwardsCompat_Tests
-    buildArgs: /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISBackwardsCompatibilityTests=true
-    beforeBuild:
-      - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 Setup"
-        displayName: Prepare repo
-    afterBuild:
-      - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown"
-        displayName: Stop AppVerifier
-        condition: always()
-      - task: PublishBuildArtifacts@1
-        displayName: Upload logs
-        condition: eq(variables['system.pullrequest.isfork'], false)
-        inputs:
-          artifactName: logs
-          artifactType: Container
-          pathtoPublish: artifacts/logs
-
-- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools
-  parameters:
-    agentOs: macOS
-
-- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools
-  parameters:
-    agentOs: Linux
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index eac4268e4c97dc979c89a79ed8705c9998506413..0000000000000000000000000000000000000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Contributing
-======
-
-Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo.
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
index 1508c66d70ba654cd380745ebb2288fe7a62f8d1..0000000000000000000000000000000000000000
--- a/LICENSE.txt
+++ /dev/null
@@ -1,228 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright (c) .NET Foundation and Contributors
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-=========================
-
-ASP.NET Core Module
-
-Copyright (c) .NET Foundation
-All rights reserved.
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the ""Software""), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/NuGet.config b/NuGet.config
deleted file mode 100644
index e32bddfd514287b0b63cece097f11ecb1410ec64..0000000000000000000000000000000000000000
--- a/NuGet.config
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <clear />
-    <!-- Restore sources should be defined in build/sources.props. -->
-  </packageSources>
-</configuration>
diff --git a/README.md b/README.md
deleted file mode 100644
index 217e6fe345f81b408d98ebcdeb8dc8be3e6161b4..0000000000000000000000000000000000000000
--- a/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-ASP.NET Core IISIntegration
-========
-This repo hosts the ASP.NET Core middleware for IIS integration and the ASP.NET Core Module.
-
-This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo.
-
-## Building from source
-1. Install prerequisites
-   1. Visual Studio 2017
-      1. Workload: `Desktop development with C++`
-         1. Run `run.ps1 install vs` or install the following components
-            1. Additional Component: `Windows 8.1 SDK and UCRT SDK`
-            2. Additional Component: `Windows 10 SDK (10.0.15063.0) for Desktop C++ [x86 and x64]`
-      2. Workload: `ASP.NET and web development`
-2. Clone with submodules
-   1. `git clone --recurse-submodules IISIntegration`
-   2. OR run `git submodule update --init --recursive` after initial clone
-3. `build.cmd`
diff --git a/THIRD_PARTY_NOTICES b/THIRD_PARTY_NOTICES
deleted file mode 100644
index 12e1c32746014154bcdba79f93c78f584be14b05..0000000000000000000000000000000000000000
--- a/THIRD_PARTY_NOTICES
+++ /dev/null
@@ -1,42 +0,0 @@
-.NET Core uses third-party libraries or other resources that may be
-distributed under licenses different than the .NET Core software.
-
-In the event that we accidentally failed to list a required notice, please
-bring it to our attention. Post an issue or email us:
-
-           dotnet@microsoft.com
-
-The attached notices are provided for information only.
-
-
-License notice for googletest
-------------------------------------
-
-"Copyright 2008, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-    * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
diff --git a/build.cmd b/build.cmd
deleted file mode 100644
index c0050bda125e73f3745de70a4021262eaa048c7b..0000000000000000000000000000000000000000
--- a/build.cmd
+++ /dev/null
@@ -1,2 +0,0 @@
-@ECHO OFF
-PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0run.ps1' default-build %*; exit $LASTEXITCODE"
diff --git a/build.sh b/build.sh
deleted file mode 100755
index 98a4b227658413eca2adb0d1d2d68178a80155cf..0000000000000000000000000000000000000000
--- a/build.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-
-# Call "sync" between "chmod" and execution to prevent "text file busy" error in Docker (aufs)
-chmod +x "$DIR/run.sh"; sync
-"$DIR/run.sh" default-build "$@"
diff --git a/korebuild-lock.txt b/korebuild-lock.txt
deleted file mode 100644
index 0055dcb41f6a5d733733e548b6a9d293940e4371..0000000000000000000000000000000000000000
--- a/korebuild-lock.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-version:2.2.0-preview2-20181019.5
-commithash:84a1c04b13bd7127728fee91989db8f2f58c8781
diff --git a/mv_to_src.sh b/mv_to_src.sh
new file mode 100644
index 0000000000000000000000000000000000000000..2360a52087821c43aa6ce418d685121652232798
--- /dev/null
+++ b/mv_to_src.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+dir="$(pwd)"
+name="IISIntegration"
+
+if [ "$skip_src" != false ]; then
+    echo "Moving $dir into src/$name/"
+    if [ -d "src/" ]; then
+        git mv src/ src_tmp/
+    fi
+    mkdir -p "src/$name"
+    if [ -d "src_tmp/" ]; then
+        git mv src_tmp/ "src/$name/src/"
+    fi
+fi
+
+files_to_mv=(NuGetPackageVerifier.json .gitignore README.md version.props Directory.Build.props Directory.Build.targets *.sln shared test tools samples build NuGet benchmarks korebuild.json nuget)
+for f in "${files_to_mv[@]}"; do
+    if [ -e $f ]; then
+        echo "Moving $f"
+        git mv $f "src/$name/$f"
+    fi
+done
+
+files_to_rm=(build.sh build.cmd run.cmd run.sh run.ps1 NuGet.config korebuild-lock.txt .github .vsts-pipelines .vscode .appveyor.yml .travis.yml CONTRIBUTING.md)
+for f in "${files_to_rm[@]}"; do
+    if [ -e $f ]; then
+        echo "Removing $f"
+        git rm -r $f
+    fi
+done
+
+echo "Reorganize source code from aspnet/$name into a subfolder" > .git/COMMIT_EDITMSG
+echo "" >> .git/COMMIT_EDITMSG
+echo "Prior to reorg, this source existed at https://github.com/aspnet/$name/tree/$(git rev-parse HEAD)" >> .git/COMMIT_EDITMSG
\ No newline at end of file
diff --git a/run.cmd b/run.cmd
deleted file mode 100644
index d52d5c7e689e8108ed0f0b83a22b61375fde8fef..0000000000000000000000000000000000000000
--- a/run.cmd
+++ /dev/null
@@ -1,2 +0,0 @@
-@ECHO OFF
-PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0run.ps1' %*; exit $LASTEXITCODE"
diff --git a/run.ps1 b/run.ps1
deleted file mode 100644
index 34604c7175877351351d0a60c3f60c90673c8cdf..0000000000000000000000000000000000000000
--- a/run.ps1
+++ /dev/null
@@ -1,209 +0,0 @@
-#!/usr/bin/env powershell
-#requires -version 4
-
-<#
-.SYNOPSIS
-Executes KoreBuild commands.
-
-.DESCRIPTION
-Downloads korebuild if required. Then executes the KoreBuild command. To see available commands, execute with `-Command help`.
-
-.PARAMETER Command
-The KoreBuild command to run.
-
-.PARAMETER Path
-The folder to build. Defaults to the folder containing this script.
-
-.PARAMETER Channel
-The channel of KoreBuild to download. Overrides the value from the config file.
-
-.PARAMETER DotNetHome
-The directory where .NET Core tools will be stored.
-
-.PARAMETER ToolsSource
-The base url where build tools can be downloaded. Overrides the value from the config file.
-
-.PARAMETER Update
-Updates KoreBuild to the latest version even if a lock file is present.
-
-.PARAMETER Reinstall
-Re-installs KoreBuild
-
-.PARAMETER ConfigFile
-The path to the configuration file that stores values. Defaults to korebuild.json.
-
-.PARAMETER ToolsSourceSuffix
-The Suffix to append to the end of the ToolsSource. Useful for query strings in blob stores.
-
-.PARAMETER CI
-Sets up CI specific settings and variables.
-
-.PARAMETER Arguments
-Arguments to be passed to the command
-
-.NOTES
-This function will create a file $PSScriptRoot/korebuild-lock.txt. This lock file can be committed to source, but does not have to be.
-When the lockfile is not present, KoreBuild will create one using latest available version from $Channel.
-
-The $ConfigFile is expected to be an JSON file. It is optional, and the configuration values in it are optional as well. Any options set
-in the file are overridden by command line parameters.
-
-.EXAMPLE
-Example config file:
-```json
-{
-  "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json",
-  "channel": "master",
-  "toolsSource": "https://aspnetcore.blob.core.windows.net/buildtools"
-}
-```
-#>
-[CmdletBinding(PositionalBinding = $false)]
-param(
-    [Parameter(Mandatory = $true, Position = 0)]
-    [string]$Command,
-    [string]$Path = $PSScriptRoot,
-    [Alias('c')]
-    [string]$Channel,
-    [Alias('d')]
-    [string]$DotNetHome,
-    [Alias('s')]
-    [string]$ToolsSource,
-    [Alias('u')]
-    [switch]$Update,
-    [switch]$Reinstall,
-    [string]$ToolsSourceSuffix,
-    [string]$ConfigFile = $null,
-    [switch]$CI,
-    [Parameter(ValueFromRemainingArguments = $true)]
-    [string[]]$Arguments
-)
-
-Set-StrictMode -Version 2
-$ErrorActionPreference = 'Stop'
-
-#
-# Functions
-#
-
-function Get-KoreBuild {
-
-    $lockFile = Join-Path $Path 'korebuild-lock.txt'
-
-    if (!(Test-Path $lockFile) -or $Update) {
-        Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $lockFile $ToolsSourceSuffix
-    }
-
-    $version = Get-Content $lockFile | Where-Object { $_ -like 'version:*' } | Select-Object -first 1
-    if (!$version) {
-        Write-Error "Failed to parse version from $lockFile. Expected a line that begins with 'version:'"
-    }
-    $version = $version.TrimStart('version:').Trim()
-    $korebuildPath = Join-Paths $DotNetHome ('buildtools', 'korebuild', $version)
-
-    if ($Reinstall -and (Test-Path $korebuildPath)) {
-        Remove-Item -Force -Recurse $korebuildPath
-    }
-
-    if (!(Test-Path $korebuildPath)) {
-        Write-Host -ForegroundColor Magenta "Downloading KoreBuild $version"
-        New-Item -ItemType Directory -Path $korebuildPath | Out-Null
-        $remotePath = "$ToolsSource/korebuild/artifacts/$version/korebuild.$version.zip"
-
-        try {
-            $tmpfile = Join-Path ([IO.Path]::GetTempPath()) "KoreBuild-$([guid]::NewGuid()).zip"
-            Get-RemoteFile $remotePath $tmpfile $ToolsSourceSuffix
-            if (Get-Command -Name 'Microsoft.PowerShell.Archive\Expand-Archive' -ErrorAction Ignore) {
-                # Use built-in commands where possible as they are cross-plat compatible
-                Microsoft.PowerShell.Archive\Expand-Archive -Path $tmpfile -DestinationPath $korebuildPath
-            }
-            else {
-                # Fallback to old approach for old installations of PowerShell
-                Add-Type -AssemblyName System.IO.Compression.FileSystem
-                [System.IO.Compression.ZipFile]::ExtractToDirectory($tmpfile, $korebuildPath)
-            }
-        }
-        catch {
-            Remove-Item -Recurse -Force $korebuildPath -ErrorAction Ignore
-            throw
-        }
-        finally {
-            Remove-Item $tmpfile -ErrorAction Ignore
-        }
-    }
-
-    return $korebuildPath
-}
-
-function Join-Paths([string]$path, [string[]]$childPaths) {
-    $childPaths | ForEach-Object { $path = Join-Path $path $_ }
-    return $path
-}
-
-function Get-RemoteFile([string]$RemotePath, [string]$LocalPath, [string]$RemoteSuffix) {
-    if ($RemotePath -notlike 'http*') {
-        Copy-Item $RemotePath $LocalPath
-        return
-    }
-
-    $retries = 10
-    while ($retries -gt 0) {
-        $retries -= 1
-        try {
-            Invoke-WebRequest -UseBasicParsing -Uri $($RemotePath + $RemoteSuffix) -OutFile $LocalPath
-            return
-        }
-        catch {
-            Write-Verbose "Request failed. $retries retries remaining"
-        }
-    }
-
-    Write-Error "Download failed: '$RemotePath'."
-}
-
-#
-# Main
-#
-
-# Load configuration or set defaults
-
-$Path = Resolve-Path $Path
-if (!$ConfigFile) { $ConfigFile = Join-Path $Path 'korebuild.json' }
-
-if (Test-Path $ConfigFile) {
-    try {
-        $config = Get-Content -Raw -Encoding UTF8 -Path $ConfigFile | ConvertFrom-Json
-        if ($config) {
-            if (!($Channel) -and (Get-Member -Name 'channel' -InputObject $config)) { [string] $Channel = $config.channel }
-            if (!($ToolsSource) -and (Get-Member -Name 'toolsSource' -InputObject $config)) { [string] $ToolsSource = $config.toolsSource}
-        }
-    }
-    catch {
-        Write-Host -ForegroundColor Red $Error[0]
-        Write-Error "$ConfigFile contains invalid JSON."
-        exit 1
-    }
-}
-
-if (!$DotNetHome) {
-    $DotNetHome = if ($env:DOTNET_HOME) { $env:DOTNET_HOME } `
-        elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} `
-        elseif ($env:HOME) {Join-Path $env:HOME '.dotnet'}`
-        else { Join-Path $PSScriptRoot '.dotnet'}
-}
-
-if (!$Channel) { $Channel = 'master' }
-if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' }
-
-# Execute
-
-$korebuildPath = Get-KoreBuild
-Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1')
-
-try {
-    Set-KoreBuildSettings -ToolsSource $ToolsSource -DotNetHome $DotNetHome -RepoPath $Path -ConfigFile $ConfigFile -CI:$CI
-    Invoke-KoreBuildCommand $Command @Arguments
-}
-finally {
-    Remove-Module 'KoreBuild' -ErrorAction Ignore
-}
diff --git a/run.sh b/run.sh
deleted file mode 100755
index 4c1fed5646ca811ed28e7bd5f47ec62da9a1fe9f..0000000000000000000000000000000000000000
--- a/run.sh
+++ /dev/null
@@ -1,256 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-
-#
-# variables
-#
-
-RESET="\033[0m"
-RED="\033[0;31m"
-YELLOW="\033[0;33m"
-MAGENTA="\033[0;95m"
-DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet"
-verbose=false
-update=false
-reinstall=false
-repo_path="$DIR"
-channel=''
-tools_source=''
-tools_source_suffix=''
-ci=false
-
-#
-# Functions
-#
-__usage() {
-    echo "Usage: $(basename "${BASH_SOURCE[0]}") command [options] [[--] <Arguments>...]"
-    echo ""
-    echo "Arguments:"
-    echo "    command                The command to be run."
-    echo "    <Arguments>...         Arguments passed to the command. Variable number of arguments allowed."
-    echo ""
-    echo "Options:"
-    echo "    --verbose                                             Show verbose output."
-    echo "    -c|--channel <CHANNEL>                                The channel of KoreBuild to download. Overrides the value from the config file.."
-    echo "    --config-file <FILE>                                  The path to the configuration file that stores values. Defaults to korebuild.json."
-    echo "    -d|--dotnet-home <DIR>                                The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet."
-    echo "    --path <PATH>                                         The directory to build. Defaults to the directory containing the script."
-    echo "    -s|--tools-source|-ToolsSource <URL>                  The base url where build tools can be downloaded. Overrides the value from the config file."
-    echo "    --tools-source-suffix|-ToolsSourceSuffix <SUFFIX>     The suffix to append to tools-source. Useful for query strings."
-    echo "    -u|--update                                           Update to the latest KoreBuild even if the lock file is present."
-    echo "    --reinstall                                           Reinstall KoreBuild."
-    echo "    --ci                                                  Apply CI specific settings and environment variables."
-    echo ""
-    echo "Description:"
-    echo "    This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be."
-    echo "    When the lockfile is not present, KoreBuild will create one using latest available version from \$channel."
-
-    if [[ "${1:-}" != '--no-exit' ]]; then
-        exit 2
-    fi
-}
-
-get_korebuild() {
-    local version
-    local lock_file="$repo_path/korebuild-lock.txt"
-    if [ ! -f "$lock_file" ] || [ "$update" = true ]; then
-        __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file" "$tools_source_suffix"
-    fi
-    version="$(grep 'version:*' -m 1 "$lock_file")"
-    if [[ "$version" == '' ]]; then
-        __error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'"
-        return 1
-    fi
-    version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
-    local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version"
-
-    if [ "$reinstall" = true ] && [ -d "$korebuild_path" ]; then
-        rm -rf "$korebuild_path"
-    fi
-
-    {
-        if [ ! -d "$korebuild_path" ]; then
-            mkdir -p "$korebuild_path"
-            local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip"
-            tmpfile="$(mktemp)"
-            echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}"
-            if __get_remote_file "$remote_path" "$tmpfile" "$tools_source_suffix"; then
-                unzip -q -d "$korebuild_path" "$tmpfile"
-            fi
-            rm "$tmpfile" || true
-        fi
-
-        source "$korebuild_path/KoreBuild.sh"
-    } || {
-        if [ -d "$korebuild_path" ]; then
-            echo "Cleaning up after failed installation"
-            rm -rf "$korebuild_path" || true
-        fi
-        return 1
-    }
-}
-
-__error() {
-    echo -e "${RED}error: $*${RESET}" 1>&2
-}
-
-__warn() {
-    echo -e "${YELLOW}warning: $*${RESET}"
-}
-
-__machine_has() {
-    hash "$1" > /dev/null 2>&1
-    return $?
-}
-
-__get_remote_file() {
-    local remote_path=$1
-    local local_path=$2
-    local remote_path_suffix=$3
-
-    if [[ "$remote_path" != 'http'* ]]; then
-        cp "$remote_path" "$local_path"
-        return 0
-    fi
-
-    local failed=false
-    if __machine_has wget; then
-        wget --tries 10 --quiet -O "$local_path" "${remote_path}${remote_path_suffix}" || failed=true
-    else
-        failed=true
-    fi
-
-    if [ "$failed" = true ] && __machine_has curl; then
-        failed=false
-        curl --retry 10 -sSL -f --create-dirs -o "$local_path" "${remote_path}${remote_path_suffix}" || failed=true
-    fi
-
-    if [ "$failed" = true ]; then
-        __error "Download failed: $remote_path" 1>&2
-        return 1
-    fi
-}
-
-#
-# main
-#
-
-command="${1:-}"
-shift
-
-while [[ $# -gt 0 ]]; do
-    case $1 in
-        -\?|-h|--help)
-            __usage --no-exit
-            exit 0
-            ;;
-        -c|--channel|-Channel)
-            shift
-            channel="${1:-}"
-            [ -z "$channel" ] && __usage
-            ;;
-        --config-file|-ConfigFile)
-            shift
-            config_file="${1:-}"
-            [ -z "$config_file" ] && __usage
-            if [ ! -f "$config_file" ]; then
-                __error "Invalid value for --config-file. $config_file does not exist."
-                exit 1
-            fi
-            ;;
-        -d|--dotnet-home|-DotNetHome)
-            shift
-            DOTNET_HOME="${1:-}"
-            [ -z "$DOTNET_HOME" ] && __usage
-            ;;
-        --path|-Path)
-            shift
-            repo_path="${1:-}"
-            [ -z "$repo_path" ] && __usage
-            ;;
-        -s|--tools-source|-ToolsSource)
-            shift
-            tools_source="${1:-}"
-            [ -z "$tools_source" ] && __usage
-            ;;
-        --tools-source-suffix|-ToolsSourceSuffix)
-            shift
-            tools_source_suffix="${1:-}"
-            [ -z "$tools_source_suffix" ] && __usage
-            ;;
-        -u|--update|-Update)
-            update=true
-            ;;
-        --reinstall|-[Rr]einstall)
-            reinstall=true
-            ;;
-        --ci|-[Cc][Ii])
-            ci=true
-            ;;
-        --verbose|-Verbose)
-            verbose=true
-            ;;
-        --)
-            shift
-            break
-            ;;
-        *)
-            break
-            ;;
-    esac
-    shift
-done
-
-if ! __machine_has unzip; then
-    __error 'Missing required command: unzip'
-    exit 1
-fi
-
-if ! __machine_has curl && ! __machine_has wget; then
-    __error 'Missing required command. Either wget or curl is required.'
-    exit 1
-fi
-
-[ -z "${config_file:-}" ] && config_file="$repo_path/korebuild.json"
-if [ -f "$config_file" ]; then
-    if __machine_has jq ; then
-        if jq '.' "$config_file" >/dev/null ; then
-            config_channel="$(jq -r 'select(.channel!=null) | .channel' "$config_file")"
-            config_tools_source="$(jq -r 'select(.toolsSource!=null) | .toolsSource' "$config_file")"
-        else
-            __error "$config_file contains invalid JSON."
-            exit 1
-        fi
-    elif __machine_has python ; then
-        if python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'))" >/dev/null ; then
-            config_channel="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")"
-            config_tools_source="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")"
-        else
-            __error "$config_file contains invalid JSON."
-            exit 1
-        fi
-    elif __machine_has python3 ; then
-        if python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'))" >/dev/null ; then
-            config_channel="$(python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")"
-            config_tools_source="$(python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")"
-        else
-            __error "$config_file contains invalid JSON."
-            exit 1
-        fi
-    else
-        __error 'Missing required command: jq or python. Could not parse the JSON file.'
-        exit 1
-    fi
-
-    [ ! -z "${config_channel:-}" ] && channel="$config_channel"
-    [ ! -z "${config_tools_source:-}" ] && tools_source="$config_tools_source"
-fi
-
-[ -z "$channel" ] && channel='master'
-[ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools'
-
-get_korebuild
-set_korebuildsettings "$tools_source" "$DOTNET_HOME" "$repo_path" "$config_file" "$ci"
-invoke_korebuild_command "$command" "$@"
diff --git a/.gitignore b/src/IISIntegration/.gitignore
similarity index 100%
rename from .gitignore
rename to src/IISIntegration/.gitignore
diff --git a/Directory.Build.props b/src/IISIntegration/Directory.Build.props
similarity index 100%
rename from Directory.Build.props
rename to src/IISIntegration/Directory.Build.props
diff --git a/Directory.Build.targets b/src/IISIntegration/Directory.Build.targets
similarity index 100%
rename from Directory.Build.targets
rename to src/IISIntegration/Directory.Build.targets
diff --git a/IISIntegration.NoV1.sln b/src/IISIntegration/IISIntegration.NoV1.sln
similarity index 100%
rename from IISIntegration.NoV1.sln
rename to src/IISIntegration/IISIntegration.NoV1.sln
diff --git a/IISIntegration.sln b/src/IISIntegration/IISIntegration.sln
similarity index 100%
rename from IISIntegration.sln
rename to src/IISIntegration/IISIntegration.sln
diff --git a/NuGetPackageVerifier.json b/src/IISIntegration/NuGetPackageVerifier.json
similarity index 100%
rename from NuGetPackageVerifier.json
rename to src/IISIntegration/NuGetPackageVerifier.json
diff --git a/NuGetPackageVerifier.xplat.json b/src/IISIntegration/NuGetPackageVerifier.xplat.json
similarity index 100%
rename from NuGetPackageVerifier.xplat.json
rename to src/IISIntegration/NuGetPackageVerifier.xplat.json
diff --git a/benchmarks/IIS.Performance/FirstRequestConfig.cs b/src/IISIntegration/benchmarks/IIS.Performance/FirstRequestConfig.cs
similarity index 100%
rename from benchmarks/IIS.Performance/FirstRequestConfig.cs
rename to src/IISIntegration/benchmarks/IIS.Performance/FirstRequestConfig.cs
diff --git a/benchmarks/IIS.Performance/IIS.Performance.csproj b/src/IISIntegration/benchmarks/IIS.Performance/IIS.Performance.csproj
similarity index 100%
rename from benchmarks/IIS.Performance/IIS.Performance.csproj
rename to src/IISIntegration/benchmarks/IIS.Performance/IIS.Performance.csproj
diff --git a/benchmarks/IIS.Performance/PlaintextBenchmark.cs b/src/IISIntegration/benchmarks/IIS.Performance/PlaintextBenchmark.cs
similarity index 100%
rename from benchmarks/IIS.Performance/PlaintextBenchmark.cs
rename to src/IISIntegration/benchmarks/IIS.Performance/PlaintextBenchmark.cs
diff --git a/benchmarks/IIS.Performance/StartupTimeBenchmark.cs b/src/IISIntegration/benchmarks/IIS.Performance/StartupTimeBenchmark.cs
similarity index 100%
rename from benchmarks/IIS.Performance/StartupTimeBenchmark.cs
rename to src/IISIntegration/benchmarks/IIS.Performance/StartupTimeBenchmark.cs
diff --git a/build/Build.Settings b/src/IISIntegration/build/Build.Settings
similarity index 100%
rename from build/Build.Settings
rename to src/IISIntegration/build/Build.Settings
diff --git a/build/Config.Definitions.Props b/src/IISIntegration/build/Config.Definitions.Props
similarity index 100%
rename from build/Config.Definitions.Props
rename to src/IISIntegration/build/Config.Definitions.Props
diff --git a/build/Key.snk b/src/IISIntegration/build/Key.snk
similarity index 100%
rename from build/Key.snk
rename to src/IISIntegration/build/Key.snk
diff --git a/build/applicationhost.config b/src/IISIntegration/build/applicationhost.config
similarity index 100%
rename from build/applicationhost.config
rename to src/IISIntegration/build/applicationhost.config
diff --git a/build/applicationhost.iis.config b/src/IISIntegration/build/applicationhost.iis.config
similarity index 100%
rename from build/applicationhost.iis.config
rename to src/IISIntegration/build/applicationhost.iis.config
diff --git a/build/assets.props b/src/IISIntegration/build/assets.props
similarity index 100%
rename from build/assets.props
rename to src/IISIntegration/build/assets.props
diff --git a/build/buildpipeline/pipeline.groovy b/src/IISIntegration/build/buildpipeline/pipeline.groovy
similarity index 96%
rename from build/buildpipeline/pipeline.groovy
rename to src/IISIntegration/build/buildpipeline/pipeline.groovy
index 7ccbca0b2ade900af798ce3555c10b6f21fccb87..13fd8d9addc2688e00ef259a27824adafe2a6eab 100644
--- a/build/buildpipeline/pipeline.groovy
+++ b/src/IISIntegration/build/buildpipeline/pipeline.groovy
@@ -1,18 +1,18 @@
-import org.dotnet.ci.pipelines.Pipeline
-
-def windowsPipeline = Pipeline.createPipeline(this, 'build/buildpipeline/windows.groovy')
-
-def configurations = [
-    'Debug',
-    'Release'
-]
-
-configurations.each { configuration ->
-
-    def params = [
-        'Configuration': configuration
-    ]
-
-    windowsPipeline.triggerPipelineOnEveryGithubPR("Windows ${configuration} x64 Build", params)
-    windowsPipeline.triggerPipelineOnGithubPush(params)
-}
+import org.dotnet.ci.pipelines.Pipeline
+
+def windowsPipeline = Pipeline.createPipeline(this, 'build/buildpipeline/windows.groovy')
+
+def configurations = [
+    'Debug',
+    'Release'
+]
+
+configurations.each { configuration ->
+
+    def params = [
+        'Configuration': configuration
+    ]
+
+    windowsPipeline.triggerPipelineOnEveryGithubPR("Windows ${configuration} x64 Build", params)
+    windowsPipeline.triggerPipelineOnGithubPush(params)
+}
diff --git a/build/buildpipeline/windows-appverif.groovy b/src/IISIntegration/build/buildpipeline/windows-appverif.groovy
similarity index 100%
rename from build/buildpipeline/windows-appverif.groovy
rename to src/IISIntegration/build/buildpipeline/windows-appverif.groovy
diff --git a/build/buildpipeline/windows.groovy b/src/IISIntegration/build/buildpipeline/windows.groovy
similarity index 98%
rename from build/buildpipeline/windows.groovy
rename to src/IISIntegration/build/buildpipeline/windows.groovy
index e3efa6193fb3d5fd9d984f77bfef0a48f349f43e..c482e84079093d0457e92f025dfba0f121f4d875 100644
--- a/build/buildpipeline/windows.groovy
+++ b/src/IISIntegration/build/buildpipeline/windows.groovy
@@ -1,15 +1,15 @@
-@Library('dotnet-ci') _
-
-// 'node' indicates to Jenkins that the enclosed block runs on a node that matches
-// the label 'windows-with-vs'
-simpleNode('Windows.10.Amd64.EnterpriseRS3.ASPNET.Open') {
-    stage ('Checking out source') {
-        checkout scm
-        bat 'git submodule update --init --recursive'
-    }
-    stage ('Build') {
-        def logFolder = getLogFolder()
-        def environment = "\$env:ASPNETCORE_TEST_LOG_DIR='${WORKSPACE}\\${logFolder}'"
-        bat "powershell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command \"${environment};&.\\tools\\SetupTestEnvironment.ps1 SetupDumps;&.\\tools\\update_schema.ps1;&.\\tools\\UpdateIISExpressCertificate.ps1;&.\\run.cmd -CI default-build /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISForwardsCompatibilityTests=true /p:Configuration=${params.Configuration}\";"
-    }
-}
+@Library('dotnet-ci') _
+
+// 'node' indicates to Jenkins that the enclosed block runs on a node that matches
+// the label 'windows-with-vs'
+simpleNode('Windows.10.Amd64.EnterpriseRS3.ASPNET.Open') {
+    stage ('Checking out source') {
+        checkout scm
+        bat 'git submodule update --init --recursive'
+    }
+    stage ('Build') {
+        def logFolder = getLogFolder()
+        def environment = "\$env:ASPNETCORE_TEST_LOG_DIR='${WORKSPACE}\\${logFolder}'"
+        bat "powershell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command \"${environment};&.\\tools\\SetupTestEnvironment.ps1 SetupDumps;&.\\tools\\update_schema.ps1;&.\\tools\\UpdateIISExpressCertificate.ps1;&.\\run.cmd -CI default-build /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISForwardsCompatibilityTests=true /p:Configuration=${params.Configuration}\";"
+    }
+}
diff --git a/build/dependencies.props b/src/IISIntegration/build/dependencies.props
similarity index 100%
rename from build/dependencies.props
rename to src/IISIntegration/build/dependencies.props
diff --git a/build/functional-test-assets.targets b/src/IISIntegration/build/functional-test-assets.targets
similarity index 100%
rename from build/functional-test-assets.targets
rename to src/IISIntegration/build/functional-test-assets.targets
diff --git a/build/launchSettings.json b/src/IISIntegration/build/launchSettings.json
similarity index 100%
rename from build/launchSettings.json
rename to src/IISIntegration/build/launchSettings.json
diff --git a/build/native.targets b/src/IISIntegration/build/native.targets
similarity index 100%
rename from build/native.targets
rename to src/IISIntegration/build/native.targets
diff --git a/build/repo.props b/src/IISIntegration/build/repo.props
similarity index 100%
rename from build/repo.props
rename to src/IISIntegration/build/repo.props
diff --git a/build/repo.targets b/src/IISIntegration/build/repo.targets
similarity index 100%
rename from build/repo.targets
rename to src/IISIntegration/build/repo.targets
diff --git a/build/sources.props b/src/IISIntegration/build/sources.props
similarity index 100%
rename from build/sources.props
rename to src/IISIntegration/build/sources.props
diff --git a/build/testsite.props b/src/IISIntegration/build/testsite.props
similarity index 100%
rename from build/testsite.props
rename to src/IISIntegration/build/testsite.props
diff --git a/korebuild.json b/src/IISIntegration/korebuild.json
similarity index 100%
rename from korebuild.json
rename to src/IISIntegration/korebuild.json
diff --git a/nuget/Microsoft.AspNetCore.AspNetCoreModule.nuspec b/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.nuspec
similarity index 100%
rename from nuget/Microsoft.AspNetCore.AspNetCoreModule.nuspec
rename to src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.nuspec
diff --git a/nuget/Microsoft.AspNetCore.AspNetCoreModule.props b/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.props
similarity index 100%
rename from nuget/Microsoft.AspNetCore.AspNetCoreModule.props
rename to src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.props
diff --git a/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.nuspec b/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.nuspec
similarity index 100%
rename from nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.nuspec
rename to src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.nuspec
diff --git a/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.props.in b/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.props.in
similarity index 100%
rename from nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.props.in
rename to src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.props.in
diff --git a/samples/IISSample/IISSample.csproj b/src/IISIntegration/samples/IISSample/IISSample.csproj
similarity index 100%
rename from samples/IISSample/IISSample.csproj
rename to src/IISIntegration/samples/IISSample/IISSample.csproj
diff --git a/samples/IISSample/Properties/launchSettings.json b/src/IISIntegration/samples/IISSample/Properties/launchSettings.json
similarity index 100%
rename from samples/IISSample/Properties/launchSettings.json
rename to src/IISIntegration/samples/IISSample/Properties/launchSettings.json
diff --git a/samples/IISSample/Startup.cs b/src/IISIntegration/samples/IISSample/Startup.cs
similarity index 100%
rename from samples/IISSample/Startup.cs
rename to src/IISIntegration/samples/IISSample/Startup.cs
diff --git a/samples/IISSample/web.config b/src/IISIntegration/samples/IISSample/web.config
similarity index 100%
rename from samples/IISSample/web.config
rename to src/IISIntegration/samples/IISSample/web.config
diff --git a/samples/NativeIISSample/NativeIISSample.csproj b/src/IISIntegration/samples/NativeIISSample/NativeIISSample.csproj
similarity index 100%
rename from samples/NativeIISSample/NativeIISSample.csproj
rename to src/IISIntegration/samples/NativeIISSample/NativeIISSample.csproj
diff --git a/samples/NativeIISSample/Properties/launchSettings.json b/src/IISIntegration/samples/NativeIISSample/Properties/launchSettings.json
similarity index 100%
rename from samples/NativeIISSample/Properties/launchSettings.json
rename to src/IISIntegration/samples/NativeIISSample/Properties/launchSettings.json
diff --git a/samples/NativeIISSample/Startup.cs b/src/IISIntegration/samples/NativeIISSample/Startup.cs
similarity index 100%
rename from samples/NativeIISSample/Startup.cs
rename to src/IISIntegration/samples/NativeIISSample/Startup.cs
diff --git a/samples/NativeIISSample/web.config b/src/IISIntegration/samples/NativeIISSample/web.config
similarity index 100%
rename from samples/NativeIISSample/web.config
rename to src/IISIntegration/samples/NativeIISSample/web.config
diff --git a/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/application.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/path.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/Source.def b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Source.def
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/Source.def
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Source.def
diff --git a/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc
diff --git a/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc
diff --git a/src/AspNetCoreModuleV1/AspNetCore/resource.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/resource.h
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/resource.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/resource.h
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/application.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/main.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/path.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx
diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx
diff --git a/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj
diff --git a/src/AspNetCoreModuleV1/IISLib/acache.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/acache.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.cxx
diff --git a/src/AspNetCoreModuleV1/IISLib/acache.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/acache.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.h
diff --git a/src/AspNetCoreModuleV1/IISLib/ahutil.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.cpp
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/ahutil.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.cpp
diff --git a/src/AspNetCoreModuleV1/IISLib/ahutil.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/ahutil.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.h
diff --git a/src/AspNetCoreModuleV1/IISLib/base64.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.cpp
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/base64.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.cpp
diff --git a/src/AspNetCoreModuleV1/IISLib/base64.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/base64.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.h
diff --git a/src/AspNetCoreModuleV1/IISLib/buffer.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/buffer.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/buffer.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/buffer.h
diff --git a/src/AspNetCoreModuleV1/IISLib/datetime.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/datetime.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/datetime.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/datetime.h
diff --git a/src/AspNetCoreModuleV1/IISLib/dbgutil.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/dbgutil.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/dbgutil.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/dbgutil.h
diff --git a/src/AspNetCoreModuleV1/IISLib/hashfn.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashfn.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/hashfn.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashfn.h
diff --git a/src/AspNetCoreModuleV1/IISLib/hashtable.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashtable.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/hashtable.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashtable.h
diff --git a/src/AspNetCoreModuleV1/IISLib/listentry.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/listentry.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/listentry.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/listentry.h
diff --git a/src/AspNetCoreModuleV1/IISLib/macros.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/macros.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/macros.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/macros.h
diff --git a/src/AspNetCoreModuleV1/IISLib/multisz.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.cpp
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/multisz.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.cpp
diff --git a/src/AspNetCoreModuleV1/IISLib/multisz.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/multisz.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.h
diff --git a/src/AspNetCoreModuleV1/IISLib/multisza.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.cpp
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/multisza.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.cpp
diff --git a/src/AspNetCoreModuleV1/IISLib/multisza.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/multisza.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.h
diff --git a/src/AspNetCoreModuleV1/IISLib/ntassert.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ntassert.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/ntassert.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ntassert.h
diff --git a/src/AspNetCoreModuleV1/IISLib/percpu.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/percpu.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/percpu.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/percpu.h
diff --git a/src/AspNetCoreModuleV1/IISLib/precomp.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/precomp.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/precomp.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/precomp.h
diff --git a/src/AspNetCoreModuleV1/IISLib/prime.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/prime.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/prime.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/prime.h
diff --git a/src/AspNetCoreModuleV1/IISLib/pudebug.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/pudebug.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/pudebug.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/pudebug.h
diff --git a/src/AspNetCoreModuleV1/IISLib/reftrace.c b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.c
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/reftrace.c
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.c
diff --git a/src/AspNetCoreModuleV1/IISLib/reftrace.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/reftrace.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.h
diff --git a/src/AspNetCoreModuleV1/IISLib/rwlock.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/rwlock.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/rwlock.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/rwlock.h
diff --git a/src/AspNetCoreModuleV1/IISLib/stringa.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.cpp
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/stringa.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.cpp
diff --git a/src/AspNetCoreModuleV1/IISLib/stringa.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/stringa.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.h
diff --git a/src/AspNetCoreModuleV1/IISLib/stringu.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.cpp
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/stringu.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.cpp
diff --git a/src/AspNetCoreModuleV1/IISLib/stringu.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/stringu.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.h
diff --git a/src/AspNetCoreModuleV1/IISLib/tracelog.c b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.c
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/tracelog.c
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.c
diff --git a/src/AspNetCoreModuleV1/IISLib/tracelog.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/tracelog.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.h
diff --git a/src/AspNetCoreModuleV1/IISLib/treehash.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/treehash.h
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/treehash.h
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/treehash.h
diff --git a/src/AspNetCoreModuleV1/IISLib/util.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/util.cxx
similarity index 100%
rename from src/AspNetCoreModuleV1/IISLib/util.cxx
rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/util.cxx
diff --git a/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/ApplicationFactory.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ApplicationFactory.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/ApplicationFactory.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ApplicationFactory.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj
similarity index 98%
rename from src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj
index 4b2c6129e8a8551051507d9effa52aa2936724b5..98c5920ed466a14bb02dfc45c0788e1f03dacefd 100644
--- a/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj
+++ b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj
@@ -1,305 +1,305 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>AspNetCoreModule</RootNamespace>
-    <ProjectName>AspNetCore</ProjectName>
-    <TargetName>aspnetcorev2</TargetName>
-    <LinkIncremental>false</LinkIncremental>
-    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <Import Project="..\..\..\Build\Build.Settings" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <WarningLevel>Level4</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-    <ResourceCompile>
-      <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories>
-    </ResourceCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <WarningLevel>Level4</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-    <ResourceCompile>
-      <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories>
-    </ResourceCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level4</WarningLevel>
-      <PrecompiledHeader>NotUsing</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>false</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-    <ResourceCompile>
-      <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories>
-    </ResourceCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <WarningLevel>Level4</WarningLevel>
-      <PrecompiledHeader>NotUsing</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>false</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-    <ResourceCompile>
-      <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories>
-    </ResourceCompile>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="ApplicationFactory.h" />
-    <ClInclude Include="applicationinfo.h" />
-    <ClInclude Include="AppOfflineApplication.h" />
-    <ClInclude Include="AppOfflineHandler.h" />
-    <ClInclude Include="DisconnectHandler.h" />
-    <ClInclude Include="PollingAppOfflineApplication.h" />
-    <ClInclude Include="ServerErrorApplication.h" />
-    <ClInclude Include="ShimOptions.h" />
-    <ClInclude Include="globalmodule.h" />
-    <ClInclude Include="resource.h" />
-    <ClInclude Include="applicationmanager.h" />
-    <ClInclude Include="HandlerResolver.h" />
-    <ClInclude Include="proxymodule.h" />
-    <ClInclude Include="stdafx.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="applicationinfo.cpp" />
-    <ClCompile Include="applicationmanager.cpp" />
-    <ClCompile Include="AppOfflineApplication.cpp" />
-    <ClCompile Include="AppOfflineHandler.cpp" />
-    <ClCompile Include="DisconnectHandler.cpp" />
-    <ClCompile Include="PollingAppOfflineApplication.cpp" />
-    <ClCompile Include="ShimOptions.cpp" />
-    <ClCompile Include="dllmain.cpp" />
-    <ClCompile Include="globalmodule.cpp" />
-    <ClCompile Include="HandlerResolver.cpp" />
-    <ClCompile Include="stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="proxymodule.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\CommonLib\CommonLib.vcxproj">
-      <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\IISLib\IISLib.vcxproj">
-      <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="ancm.mof" />
-    <None Include="Source.def" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="aspnetcoremodule.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="aspnetcore_schema_v2.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="ancm.mof">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="HtmlResponses.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="InProcessShimStaticHtml.htm">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="OutOfProcessShimStaticHtml.htm">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <Xml Include="aspnetcore_schema_v2.xml" />
-  </ItemGroup>
-  <Import Project="..\..\..\build\native.targets" />
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>AspNetCoreModule</RootNamespace>
+    <ProjectName>AspNetCore</ProjectName>
+    <TargetName>aspnetcorev2</TargetName>
+    <LinkIncremental>false</LinkIncremental>
+    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <Import Project="..\..\..\Build\Build.Settings" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+    <ResourceCompile>
+      <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+    <ResourceCompile>
+      <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+    <ResourceCompile>
+      <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+    <ResourceCompile>
+      <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="ApplicationFactory.h" />
+    <ClInclude Include="applicationinfo.h" />
+    <ClInclude Include="AppOfflineApplication.h" />
+    <ClInclude Include="AppOfflineHandler.h" />
+    <ClInclude Include="DisconnectHandler.h" />
+    <ClInclude Include="PollingAppOfflineApplication.h" />
+    <ClInclude Include="ServerErrorApplication.h" />
+    <ClInclude Include="ShimOptions.h" />
+    <ClInclude Include="globalmodule.h" />
+    <ClInclude Include="resource.h" />
+    <ClInclude Include="applicationmanager.h" />
+    <ClInclude Include="HandlerResolver.h" />
+    <ClInclude Include="proxymodule.h" />
+    <ClInclude Include="stdafx.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="applicationinfo.cpp" />
+    <ClCompile Include="applicationmanager.cpp" />
+    <ClCompile Include="AppOfflineApplication.cpp" />
+    <ClCompile Include="AppOfflineHandler.cpp" />
+    <ClCompile Include="DisconnectHandler.cpp" />
+    <ClCompile Include="PollingAppOfflineApplication.cpp" />
+    <ClCompile Include="ShimOptions.cpp" />
+    <ClCompile Include="dllmain.cpp" />
+    <ClCompile Include="globalmodule.cpp" />
+    <ClCompile Include="HandlerResolver.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="proxymodule.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\CommonLib\CommonLib.vcxproj">
+      <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\IISLib\IISLib.vcxproj">
+      <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ancm.mof" />
+    <None Include="Source.def" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="aspnetcoremodule.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="aspnetcore_schema_v2.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="ancm.mof">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="HtmlResponses.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="InProcessShimStaticHtml.htm">
+      <DeploymentContent>true</DeploymentContent>
+    </None>
+    <None Include="OutOfProcessShimStaticHtml.htm">
+      <DeploymentContent>true</DeploymentContent>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Xml Include="aspnetcore_schema_v2.xml" />
+  </ItemGroup>
+  <Import Project="..\..\..\build\native.targets" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
 </Project>
\ No newline at end of file
diff --git a/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc
diff --git a/src/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm
diff --git a/src/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm
diff --git a/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/ServerErrorApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ServerErrorApplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/ServerErrorApplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ServerErrorApplication.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/ShimOptions.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/ShimOptions.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/Source.def b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Source.def
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/Source.def
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Source.def
diff --git a/src/AspNetCoreModuleV2/AspNetCore/ancm.mof b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ancm.mof
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/ancm.mof
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ancm.mof
diff --git a/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/applicationinfo.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/applicationmanager.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/applicationmanager.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema_v2.xml b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema_v2.xml
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema_v2.xml
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema_v2.xml
diff --git a/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc
diff --git a/src/AspNetCoreModuleV2/AspNetCore/dllmain.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/dllmain.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/dllmain.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/dllmain.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/globalmodule.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/globalmodule.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/globalmodule.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/globalmodule.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/globalmodule.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/globalmodule.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/globalmodule.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/globalmodule.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/proxymodule.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/resource.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/resource.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/resource.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/resource.h
diff --git a/src/AspNetCoreModuleV2/AspNetCore/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/stdafx.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/stdafx.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/stdafx.cpp
diff --git a/src/AspNetCoreModuleV2/AspNetCore/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/stdafx.h
similarity index 100%
rename from src/AspNetCoreModuleV2/AspNetCore/stdafx.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/stdafx.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/BaseOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/BaseOutputManager.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/BaseOutputManager.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/BaseOutputManager.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj
similarity index 98%
rename from src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj
index 0ddec2fcb1f333b893d8deea30e0b0a394cf8d3e..2386dfc6ee6aa93b56aeccb1b96519fe41ea22d4 100644
--- a/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj
+++ b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj
@@ -1,293 +1,293 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <VCProjectVersion>15.0</VCProjectVersion>
-    <ProjectGuid>{55494E58-E061-4C4C-A0A8-837008E72F85}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>NewCommon</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>false</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <LinkIncremental>true</LinkIncremental>
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <LinkIncremental>false</LinkIncremental>
-    <IncludePath>C:\AspNetCoreModule\src\IISLib;$(IncludePath)</IncludePath>
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level4</WarningLevel>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <Optimization>Disabled</Optimization>
-      <SDLCheck>false</SDLCheck>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <ConformanceMode>true</ConformanceMode>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <ShowIncludes>false</ShowIncludes>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level4</WarningLevel>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <Optimization>Disabled</Optimization>
-      <SDLCheck>false</SDLCheck>
-      <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <ConformanceMode>true</ConformanceMode>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <MinimalRebuild>false</MinimalRebuild>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <ShowIncludes>false</ShowIncludes>
-      <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level4</WarningLevel>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <SDLCheck>false</SDLCheck>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <ConformanceMode>true</ConformanceMode>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <ShowIncludes>false</ShowIncludes>
-      <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level4</WarningLevel>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <SDLCheck>false</SDLCheck>
-      <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <ConformanceMode>true</ConformanceMode>
-      <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <AdditionalUsingDirectories>
-      </AdditionalUsingDirectories>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <ShowIncludes>false</ShowIncludes>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-    <Lib>
-      <AdditionalLibraryDirectories>..\iislib</AdditionalLibraryDirectories>
-    </Lib>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="application.h" />
-    <ClInclude Include="baseoutputmanager.h" />
-    <ClInclude Include="ConfigurationSection.h" />
-    <ClInclude Include="ConfigurationSource.h" />
-    <ClInclude Include="config_utility.h" />
-    <ClInclude Include="Environment.h" />
-    <ClInclude Include="EventLog.h" />
-    <ClInclude Include="EventTracing.h" />
-    <ClInclude Include="exceptions.h" />
-    <ClInclude Include="file_utility.h" />
-    <ClInclude Include="FileOutputManager.h" />
-    <ClInclude Include="GlobalVersionUtility.h" />
-    <ClInclude Include="fx_ver.h" />
-    <ClInclude Include="HandleWrapper.h" />
-    <ClInclude Include="hostfxroptions.h" />
-    <ClInclude Include="hostfxr_utility.h" />
-    <ClInclude Include="iapplication.h" />
-    <ClInclude Include="debugutil.h" />
-    <ClInclude Include="InvalidOperationException.h" />
-    <ClInclude Include="IOutputManager.h" />
-    <ClInclude Include="irequesthandler.h" />
-    <ClInclude Include="LoggingHelpers.h" />
-    <ClInclude Include="ModuleHelpers.h" />
-    <ClInclude Include="NonCopyable.h" />
-    <ClInclude Include="NullOutputManager.h" />
-    <ClInclude Include="PipeOutputManager.h" />
-    <ClInclude Include="requesthandler.h" />
-    <ClInclude Include="resources.h" />
-    <ClInclude Include="ServerErrorApplication.h" />
-    <ClInclude Include="ServerErrorHandler.h" />
-    <ClInclude Include="SRWExclusiveLock.h" />
-    <ClInclude Include="SRWSharedLock.h" />
-    <ClInclude Include="stdafx.h" />
-    <ClInclude Include="StdWrapper.h" />
-    <ClInclude Include="StringHelpers.h" />
-    <ClInclude Include="sttimer.h" />
-    <ClInclude Include="WebConfigConfigurationSection.h" />
-    <ClInclude Include="WebConfigConfigurationSource.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="ConfigurationSection.cpp" />
-    <ClCompile Include="ConfigurationSource.cpp" />
-    <ClCompile Include="debugutil.cpp" />
-    <ClCompile Include="Environment.cpp" />
-    <ClCompile Include="EventLog.cpp" />
-    <ClCompile Include="file_utility.cpp" />
-    <ClCompile Include="FileOutputManager.cpp" />
-    <ClCompile Include="fx_ver.cpp" />
-    <ClCompile Include="GlobalVersionUtility.cpp" />
-    <ClCompile Include="HandleWrapper.cpp" />
-    <ClCompile Include="hostfxr_utility.cpp" />
-    <ClCompile Include="hostfxroptions.cpp" />
-    <ClCompile Include="LoggingHelpers.cpp" />
-    <ClCompile Include="PipeOutputManager.cpp" />
-    <ClCompile Include="StdWrapper.cpp" />
-    <ClCompile Include="SRWExclusiveLock.cpp" />
-    <ClCompile Include="SRWSharedLock.cpp" />
-    <ClCompile Include="stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="StringHelpers.cpp" />
-    <ClCompile Include="WebConfigConfigurationSection.cpp" />
-    <ClCompile Include="WebConfigConfigurationSource.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\IISLib\IISLib.vcxproj">
-      <Project>{4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <CustomBuild Include="aspnetcore_msg.mc">
-      <FileType>Document</FileType>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">mc %(FullPath)</Command>
-      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compiling Event Messages ...</Message>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">mc %(FullPath)</Command>
-      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Event Messages ...</Message>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">mc %(FullPath)</Command>
-      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling Event Messages ...</Message>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">mc %(FullPath)</Command>
-      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Event Messages ...</Message>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs>
-    </CustomBuild>
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>15.0</VCProjectVersion>
+    <ProjectGuid>{55494E58-E061-4C4C-A0A8-837008E72F85}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>NewCommon</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>false</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>C:\AspNetCoreModule\src\IISLib;$(IncludePath)</IncludePath>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>false</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <ConformanceMode>true</ConformanceMode>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>false</SDLCheck>
+      <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <ConformanceMode>true</ConformanceMode>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <MinimalRebuild>false</MinimalRebuild>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+      <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>false</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <ConformanceMode>true</ConformanceMode>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+      <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>false</SDLCheck>
+      <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <AdditionalUsingDirectories>
+      </AdditionalUsingDirectories>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <Lib>
+      <AdditionalLibraryDirectories>..\iislib</AdditionalLibraryDirectories>
+    </Lib>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="application.h" />
+    <ClInclude Include="baseoutputmanager.h" />
+    <ClInclude Include="ConfigurationSection.h" />
+    <ClInclude Include="ConfigurationSource.h" />
+    <ClInclude Include="config_utility.h" />
+    <ClInclude Include="Environment.h" />
+    <ClInclude Include="EventLog.h" />
+    <ClInclude Include="EventTracing.h" />
+    <ClInclude Include="exceptions.h" />
+    <ClInclude Include="file_utility.h" />
+    <ClInclude Include="FileOutputManager.h" />
+    <ClInclude Include="GlobalVersionUtility.h" />
+    <ClInclude Include="fx_ver.h" />
+    <ClInclude Include="HandleWrapper.h" />
+    <ClInclude Include="hostfxroptions.h" />
+    <ClInclude Include="hostfxr_utility.h" />
+    <ClInclude Include="iapplication.h" />
+    <ClInclude Include="debugutil.h" />
+    <ClInclude Include="InvalidOperationException.h" />
+    <ClInclude Include="IOutputManager.h" />
+    <ClInclude Include="irequesthandler.h" />
+    <ClInclude Include="LoggingHelpers.h" />
+    <ClInclude Include="ModuleHelpers.h" />
+    <ClInclude Include="NonCopyable.h" />
+    <ClInclude Include="NullOutputManager.h" />
+    <ClInclude Include="PipeOutputManager.h" />
+    <ClInclude Include="requesthandler.h" />
+    <ClInclude Include="resources.h" />
+    <ClInclude Include="ServerErrorApplication.h" />
+    <ClInclude Include="ServerErrorHandler.h" />
+    <ClInclude Include="SRWExclusiveLock.h" />
+    <ClInclude Include="SRWSharedLock.h" />
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="StdWrapper.h" />
+    <ClInclude Include="StringHelpers.h" />
+    <ClInclude Include="sttimer.h" />
+    <ClInclude Include="WebConfigConfigurationSection.h" />
+    <ClInclude Include="WebConfigConfigurationSource.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="ConfigurationSection.cpp" />
+    <ClCompile Include="ConfigurationSource.cpp" />
+    <ClCompile Include="debugutil.cpp" />
+    <ClCompile Include="Environment.cpp" />
+    <ClCompile Include="EventLog.cpp" />
+    <ClCompile Include="file_utility.cpp" />
+    <ClCompile Include="FileOutputManager.cpp" />
+    <ClCompile Include="fx_ver.cpp" />
+    <ClCompile Include="GlobalVersionUtility.cpp" />
+    <ClCompile Include="HandleWrapper.cpp" />
+    <ClCompile Include="hostfxr_utility.cpp" />
+    <ClCompile Include="hostfxroptions.cpp" />
+    <ClCompile Include="LoggingHelpers.cpp" />
+    <ClCompile Include="PipeOutputManager.cpp" />
+    <ClCompile Include="StdWrapper.cpp" />
+    <ClCompile Include="SRWExclusiveLock.cpp" />
+    <ClCompile Include="SRWSharedLock.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="StringHelpers.cpp" />
+    <ClCompile Include="WebConfigConfigurationSection.cpp" />
+    <ClCompile Include="WebConfigConfigurationSource.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\IISLib\IISLib.vcxproj">
+      <Project>{4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <CustomBuild Include="aspnetcore_msg.mc">
+      <FileType>Document</FileType>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">mc %(FullPath)</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compiling Event Messages ...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">mc %(FullPath)</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Event Messages ...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">mc %(FullPath)</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling Event Messages ...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">mc %(FullPath)</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Event Messages ...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs>
+    </CustomBuild>
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
 </Project>
\ No newline at end of file
diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationLoadException.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationLoadException.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationLoadException.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationLoadException.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/Environment.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/Environment.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/Environment.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/Environment.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/Environment.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/Environment.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/Environment.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/Environment.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/EventLog.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventLog.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/EventLog.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventLog.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/EventLog.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventLog.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/EventLog.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventLog.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/EventTracing.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventTracing.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/EventTracing.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventTracing.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/FileOutputManager.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/FileOutputManager.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/HandleWrapper.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/HandleWrapper.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/IOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/IOutputManager.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/IOutputManager.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/IOutputManager.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/InvalidOperationException.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/InvalidOperationException.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/InvalidOperationException.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/InvalidOperationException.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/ModuleHelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ModuleHelpers.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/ModuleHelpers.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ModuleHelpers.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/NonCopyable.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/NonCopyable.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/NonCopyable.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/NonCopyable.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/NullOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/NullOutputManager.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/NullOutputManager.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/NullOutputManager.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/ResultException.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ResultException.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/ResultException.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ResultException.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/ServerErrorHandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ServerErrorHandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/ServerErrorHandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ServerErrorHandler.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/StdWrapper.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StdWrapper.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/StdWrapper.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StdWrapper.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/StdWrapper.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StdWrapper.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/StdWrapper.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StdWrapper.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/StringHelpers.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StringHelpers.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/StringHelpers.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StringHelpers.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/StringHelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StringHelpers.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/StringHelpers.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StringHelpers.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/application.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/application.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/aspnetcore_event.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_event.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/aspnetcore_event.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_event.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc
diff --git a/src/AspNetCoreModuleV2/CommonLib/config_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/config_utility.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/config_utility.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/config_utility.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/debugutil.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/debugutil.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/debugutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/debugutil.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/exceptions.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/exceptions.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/exceptions.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/exceptions.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/file_utility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/file_utility.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/file_utility.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/file_utility.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/file_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/file_utility.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/file_utility.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/file_utility.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/fx_ver.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/fx_ver.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/fx_ver.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/fx_ver.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/hostfxroptions.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/hostfxroptions.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/iapplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/iapplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/iapplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/iapplication.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/irequesthandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/requesthandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/requesthandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/resources.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/resources.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/resources.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/resources.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/stdafx.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp
diff --git a/src/AspNetCoreModuleV2/CommonLib/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/stdafx.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/sttimer.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/sttimer.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/sttimer.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/sttimer.h
diff --git a/src/AspNetCoreModuleV2/CommonLib/targetver.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/targetver.h
similarity index 100%
rename from src/AspNetCoreModuleV2/CommonLib/targetver.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/targetver.h
diff --git a/src/AspNetCoreModuleV2/DefaultRules.ruleset b/src/IISIntegration/src/AspNetCoreModuleV2/DefaultRules.ruleset
similarity index 100%
rename from src/AspNetCoreModuleV2/DefaultRules.ruleset
rename to src/IISIntegration/src/AspNetCoreModuleV2/DefaultRules.ruleset
diff --git a/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj
similarity index 97%
rename from src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj
index 8a78b1966494981d469e4730b5073b4144b39226..15d4ef1317bffac92613ae5d8f1f4dd371cb13e3 100644
--- a/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj
+++ b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj
@@ -1,206 +1,206 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{09D9D1D6-2951-4E14-BC35-76A23CF9391A}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>IISLib</RootNamespace>
-    <ProjectName>IISLib</ProjectName>
-    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <ShowIncludes>false</ShowIncludes>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <ShowIncludes>false</ShowIncludes>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <ShowIncludes>false</ShowIncludes>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <ShowIncludes>false</ShowIncludes>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="acache.h" />
-    <ClInclude Include="ahutil.h" />
-    <ClInclude Include="base64.h" />
-    <ClInclude Include="buffer.h" />
-    <ClInclude Include="datetime.h" />
-    <ClInclude Include="dbgutil.h" />
-    <ClInclude Include="hashfn.h" />
-    <ClInclude Include="hashtable.h" />
-    <ClInclude Include="listentry.h" />
-    <ClInclude Include="macros.h" />
-    <ClInclude Include="multisz.h" />
-    <ClInclude Include="multisza.h" />
-    <ClInclude Include="ntassert.h" />
-    <ClInclude Include="percpu.h" />
-    <ClInclude Include="precomp.h" />
-    <ClInclude Include="prime.h" />
-    <ClInclude Include="reftrace.h" />
-    <ClInclude Include="rwlock.h" />
-    <ClInclude Include="stringa.h" />
-    <ClInclude Include="stringu.h" />
-    <ClInclude Include="tracelog.h" />
-    <ClInclude Include="treehash.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="acache.cpp" />
-    <ClCompile Include="ahutil.cpp" />
-    <ClCompile Include="base64.cpp" />
-    <ClCompile Include="multisz.cpp" />
-    <ClCompile Include="multisza.cpp" />
-    <ClCompile Include="reftrace.c" />
-    <ClCompile Include="stringa.cpp" />
-    <ClCompile Include="stringu.cpp" />
-    <ClCompile Include="tracelog.c" />
-    <ClCompile Include="util.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{09D9D1D6-2951-4E14-BC35-76A23CF9391A}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>IISLib</RootNamespace>
+    <ProjectName>IISLib</ProjectName>
+    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="acache.h" />
+    <ClInclude Include="ahutil.h" />
+    <ClInclude Include="base64.h" />
+    <ClInclude Include="buffer.h" />
+    <ClInclude Include="datetime.h" />
+    <ClInclude Include="dbgutil.h" />
+    <ClInclude Include="hashfn.h" />
+    <ClInclude Include="hashtable.h" />
+    <ClInclude Include="listentry.h" />
+    <ClInclude Include="macros.h" />
+    <ClInclude Include="multisz.h" />
+    <ClInclude Include="multisza.h" />
+    <ClInclude Include="ntassert.h" />
+    <ClInclude Include="percpu.h" />
+    <ClInclude Include="precomp.h" />
+    <ClInclude Include="prime.h" />
+    <ClInclude Include="reftrace.h" />
+    <ClInclude Include="rwlock.h" />
+    <ClInclude Include="stringa.h" />
+    <ClInclude Include="stringu.h" />
+    <ClInclude Include="tracelog.h" />
+    <ClInclude Include="treehash.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="acache.cpp" />
+    <ClCompile Include="ahutil.cpp" />
+    <ClCompile Include="base64.cpp" />
+    <ClCompile Include="multisz.cpp" />
+    <ClCompile Include="multisza.cpp" />
+    <ClCompile Include="reftrace.c" />
+    <ClCompile Include="stringa.cpp" />
+    <ClCompile Include="stringu.cpp" />
+    <ClCompile Include="tracelog.c" />
+    <ClCompile Include="util.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
 </Project>
\ No newline at end of file
diff --git a/src/AspNetCoreModuleV2/IISLib/acache.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/acache.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.cpp
diff --git a/src/AspNetCoreModuleV2/IISLib/acache.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/acache.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.h
diff --git a/src/AspNetCoreModuleV2/IISLib/ahutil.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/ahutil.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.cpp
diff --git a/src/AspNetCoreModuleV2/IISLib/ahutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/ahutil.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.h
diff --git a/src/AspNetCoreModuleV2/IISLib/base64.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/base64.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.cpp
diff --git a/src/AspNetCoreModuleV2/IISLib/base64.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/base64.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.h
diff --git a/src/AspNetCoreModuleV2/IISLib/buffer.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/buffer.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/buffer.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/buffer.h
diff --git a/src/AspNetCoreModuleV2/IISLib/datetime.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/datetime.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/datetime.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/datetime.h
diff --git a/src/AspNetCoreModuleV2/IISLib/dbgutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/dbgutil.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/dbgutil.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/dbgutil.h
diff --git a/src/AspNetCoreModuleV2/IISLib/hashfn.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashfn.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/hashfn.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashfn.h
diff --git a/src/AspNetCoreModuleV2/IISLib/hashtable.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashtable.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/hashtable.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashtable.h
diff --git a/src/AspNetCoreModuleV2/IISLib/listentry.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/listentry.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/listentry.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/listentry.h
diff --git a/src/AspNetCoreModuleV2/IISLib/macros.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/macros.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/macros.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/macros.h
diff --git a/src/AspNetCoreModuleV2/IISLib/multisz.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/multisz.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.cpp
diff --git a/src/AspNetCoreModuleV2/IISLib/multisz.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/multisz.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.h
diff --git a/src/AspNetCoreModuleV2/IISLib/multisza.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/multisza.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.cpp
diff --git a/src/AspNetCoreModuleV2/IISLib/multisza.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/multisza.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.h
diff --git a/src/AspNetCoreModuleV2/IISLib/ntassert.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ntassert.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/ntassert.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ntassert.h
diff --git a/src/AspNetCoreModuleV2/IISLib/percpu.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/percpu.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/percpu.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/percpu.h
diff --git a/src/AspNetCoreModuleV2/IISLib/precomp.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/precomp.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/precomp.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/precomp.h
diff --git a/src/AspNetCoreModuleV2/IISLib/prime.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/prime.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/prime.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/prime.h
diff --git a/src/AspNetCoreModuleV2/IISLib/reftrace.c b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.c
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/reftrace.c
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.c
diff --git a/src/AspNetCoreModuleV2/IISLib/reftrace.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/reftrace.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.h
diff --git a/src/AspNetCoreModuleV2/IISLib/rwlock.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/rwlock.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/rwlock.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/rwlock.h
diff --git a/src/AspNetCoreModuleV2/IISLib/stringa.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/stringa.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.cpp
diff --git a/src/AspNetCoreModuleV2/IISLib/stringa.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/stringa.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.h
diff --git a/src/AspNetCoreModuleV2/IISLib/stringu.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/stringu.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.cpp
diff --git a/src/AspNetCoreModuleV2/IISLib/stringu.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/stringu.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.h
diff --git a/src/AspNetCoreModuleV2/IISLib/tracelog.c b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.c
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/tracelog.c
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.c
diff --git a/src/AspNetCoreModuleV2/IISLib/tracelog.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/tracelog.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.h
diff --git a/src/AspNetCoreModuleV2/IISLib/treehash.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/treehash.h
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/treehash.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/treehash.h
diff --git a/src/AspNetCoreModuleV2/IISLib/util.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/util.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/IISLib/util.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/util.cpp
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.cpp
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.h
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.cpp
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.h
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj
similarity index 98%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj
index 5e3fe5c6c1df66cad22891cb90249d4c64db9437..69435f32d61986025dddc246b1e354ac16f2dc16 100644
--- a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj
+++ b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj
@@ -1,276 +1,276 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="..\..\..\Build\Build.Settings" />
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <VCProjectVersion>15.0</VCProjectVersion>
-    <ProjectGuid>{D57EA297-6DC2-4BC0-8C91-334863327863}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>InProcessRequestHandler</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
-    <ProjectName>InProcessRequestHandler</ProjectName>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <TargetName>aspnetcorev2_inprocess</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level4</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level4</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level4</WarningLevel>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>false</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <WarningLevel>Level4</WarningLevel>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>false</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="aspnetcore_event.h" />
-    <ClInclude Include="inprocessapplication.h" />
-    <ClInclude Include="InProcessApplicationBase.h" />
-    <ClInclude Include="inprocesshandler.h" />
-    <ClInclude Include="InProcessOptions.h" />
-    <ClInclude Include="resource.h" />
-    <ClInclude Include="ShuttingDownApplication.h" />
-    <ClInclude Include="stdafx.h" />
-    <ClInclude Include="StartupExceptionApplication.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="dllmain.cpp" />
-    <ClCompile Include="inprocessapplication.cpp" />
-    <ClCompile Include="InProcessApplicationBase.cpp" />
-    <ClCompile Include="inprocesshandler.cpp" />
-    <ClCompile Include="InProcessOptions.cpp" />
-    <ClCompile Include="managedexports.cpp" />
-    <ClCompile Include="stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\CommonLib\CommonLib.vcxproj">
-      <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\IISLib\IISLib.vcxproj">
-      <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\RequestHandlerLib\RequestHandlerLib.vcxproj">
-      <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="HtmlResponses.rc" />
-    <ResourceCompile Include="inprocessrequesthandler.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="InProcessRhStaticHtml.htm">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Source.def" />
-  </ItemGroup>
-  <Import Project="..\..\..\build\native.targets" />
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\..\..\Build\Build.Settings" />
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>15.0</VCProjectVersion>
+    <ProjectGuid>{D57EA297-6DC2-4BC0-8C91-334863327863}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>InProcessRequestHandler</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+    <ProjectName>InProcessRequestHandler</ProjectName>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <TargetName>aspnetcorev2_inprocess</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="aspnetcore_event.h" />
+    <ClInclude Include="inprocessapplication.h" />
+    <ClInclude Include="InProcessApplicationBase.h" />
+    <ClInclude Include="inprocesshandler.h" />
+    <ClInclude Include="InProcessOptions.h" />
+    <ClInclude Include="resource.h" />
+    <ClInclude Include="ShuttingDownApplication.h" />
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="StartupExceptionApplication.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="dllmain.cpp" />
+    <ClCompile Include="inprocessapplication.cpp" />
+    <ClCompile Include="InProcessApplicationBase.cpp" />
+    <ClCompile Include="inprocesshandler.cpp" />
+    <ClCompile Include="InProcessOptions.cpp" />
+    <ClCompile Include="managedexports.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\CommonLib\CommonLib.vcxproj">
+      <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\IISLib\IISLib.vcxproj">
+      <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\RequestHandlerLib\RequestHandlerLib.vcxproj">
+      <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="HtmlResponses.rc" />
+    <ResourceCompile Include="inprocessrequesthandler.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="InProcessRhStaticHtml.htm">
+      <DeploymentContent>true</DeploymentContent>
+    </None>
+    <None Include="Source.def" />
+  </ItemGroup>
+  <Import Project="..\..\..\build\native.targets" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
 </Project>
\ No newline at end of file
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/ShuttingDownApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/ShuttingDownApplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/ShuttingDownApplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/ShuttingDownApplication.h
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/Source.def b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/Source.def
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/Source.def
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/Source.def
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionApplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionApplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionApplication.h
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.cpp
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.h
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessrequesthandler.rc b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessrequesthandler.rc
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessrequesthandler.rc
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessrequesthandler.rc
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/resource.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/resource.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/resource.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/resource.h
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.cpp
diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.h
similarity index 100%
rename from src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj
similarity index 98%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj
index 7d29672fa0347e8174d8f0102e78a5ee1490ae5a..ca2bc0f4aa220ea20d009f3a925e787143376213 100644
--- a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj
+++ b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj
@@ -1,285 +1,285 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="..\..\..\Build\Build.Settings" />
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <VCProjectVersion>15.0</VCProjectVersion>
-    <ProjectGuid>{7F87406C-A3C8-4139-A68D-E4C344294A67}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>OutOfProcessRequestHandler</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
-    <ProjectName>OutOfProcessRequestHandler</ProjectName>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <TargetName>aspnetcorev2_outofprocess</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level4</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level4</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level4</WarningLevel>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>false</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <WarningLevel>Level4</WarningLevel>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <SDLCheck>true</SDLCheck>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-      <PreprocessKeepComments>false</PreprocessKeepComments>
-      <ExceptionHandling>SyncCThrow</ExceptionHandling>
-      <StructMemberAlignment>8Bytes</StructMemberAlignment>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <OmitDefaultLibName>true</OmitDefaultLibName>
-      <CompileAs>CompileAsCpp</CompileAs>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>false</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
-      <OptimizeReferences>true</OptimizeReferences>
-      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
-      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="environmentvariablehelpers.h" />
-    <ClInclude Include="forwarderconnection.h" />
-    <ClInclude Include="processmanager.h" />
-    <ClInclude Include="protocolconfig.h" />
-    <ClInclude Include="resource.h" />
-    <ClInclude Include="responseheaderhash.h" />
-    <ClInclude Include="serverprocess.h" />
-    <ClInclude Include="stdafx.h" />
-    <ClInclude Include="url_utility.h" />
-    <ClInclude Include="websockethandler.h" />
-    <ClInclude Include="winhttphelper.h" />
-    <ClInclude Include="forwardinghandler.h" />
-    <ClInclude Include="outprocessapplication.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="dllmain.cpp" />
-    <ClCompile Include="forwardinghandler.cpp" />
-    <ClCompile Include="outprocessapplication.cpp" />
-    <ClCompile Include="forwarderconnection.cpp" />
-    <ClCompile Include="processmanager.cpp" />
-    <ClCompile Include="protocolconfig.cpp" />
-    <ClCompile Include="responseheaderhash.cpp" />
-    <ClCompile Include="serverprocess.cpp" />
-    <ClCompile Include="stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="url_utility.cpp" />
-    <ClCompile Include="websockethandler.cpp" />
-    <ClCompile Include="winhttphelper.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\CommonLib\CommonLib.vcxproj">
-      <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\IISLib\IISLib.vcxproj">
-      <Project>{4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\RequestHandlerLib\RequestHandlerLib.vcxproj">
-      <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="HtmlResponses.rc" />
-    <ResourceCompile Include="outofprocessrequesthandler.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="OutOfProcessRhStaticHtml.htm">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Source.def" />
-  </ItemGroup>
-  <Import Project="..\..\..\build\native.targets" />
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\..\..\Build\Build.Settings" />
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>15.0</VCProjectVersion>
+    <ProjectGuid>{7F87406C-A3C8-4139-A68D-E4C344294A67}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>OutOfProcessRequestHandler</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+    <ProjectName>OutOfProcessRequestHandler</ProjectName>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <TargetName>aspnetcorev2_outofprocess</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <SDLCheck>true</SDLCheck>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
+      <PreprocessKeepComments>false</PreprocessKeepComments>
+      <ExceptionHandling>SyncCThrow</ExceptionHandling>
+      <StructMemberAlignment>8Bytes</StructMemberAlignment>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <OmitDefaultLibName>true</OmitDefaultLibName>
+      <CompileAs>CompileAsCpp</CompileAs>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
+      <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="environmentvariablehelpers.h" />
+    <ClInclude Include="forwarderconnection.h" />
+    <ClInclude Include="processmanager.h" />
+    <ClInclude Include="protocolconfig.h" />
+    <ClInclude Include="resource.h" />
+    <ClInclude Include="responseheaderhash.h" />
+    <ClInclude Include="serverprocess.h" />
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="url_utility.h" />
+    <ClInclude Include="websockethandler.h" />
+    <ClInclude Include="winhttphelper.h" />
+    <ClInclude Include="forwardinghandler.h" />
+    <ClInclude Include="outprocessapplication.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="dllmain.cpp" />
+    <ClCompile Include="forwardinghandler.cpp" />
+    <ClCompile Include="outprocessapplication.cpp" />
+    <ClCompile Include="forwarderconnection.cpp" />
+    <ClCompile Include="processmanager.cpp" />
+    <ClCompile Include="protocolconfig.cpp" />
+    <ClCompile Include="responseheaderhash.cpp" />
+    <ClCompile Include="serverprocess.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="url_utility.cpp" />
+    <ClCompile Include="websockethandler.cpp" />
+    <ClCompile Include="winhttphelper.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\CommonLib\CommonLib.vcxproj">
+      <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\IISLib\IISLib.vcxproj">
+      <Project>{4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\RequestHandlerLib\RequestHandlerLib.vcxproj">
+      <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="HtmlResponses.rc" />
+    <ResourceCompile Include="outofprocessrequesthandler.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="OutOfProcessRhStaticHtml.htm">
+      <DeploymentContent>true</DeploymentContent>
+    </None>
+    <None Include="Source.def" />
+  </ItemGroup>
+  <Import Project="..\..\..\build\native.targets" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
 </Project>
\ No newline at end of file
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/Source.def b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/Source.def
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/Source.def
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/Source.def
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/dllmain.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/dllmain.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/dllmain.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/dllmain.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocessrequesthandler.rc b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocessrequesthandler.rc
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocessrequesthandler.rc
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocessrequesthandler.rc
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.h
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.cpp
diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.h
similarity index 100%
rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.h
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.cpp
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.h
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.h
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/RequestHandlerLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/RequestHandlerLib.vcxproj
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/RequestHandlerLib.vcxproj
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/RequestHandlerLib.vcxproj
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehash.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehash.h
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehash.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehash.h
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehelpers.h
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehelpers.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehelpers.h
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.cpp
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.h
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.h
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.cpp
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.cpp
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.cpp
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.h
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.h
diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/stdafx.h
similarity index 100%
rename from src/AspNetCoreModuleV2/RequestHandlerLib/stdafx.h
rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/stdafx.h
diff --git a/src/Directory.Build.props b/src/IISIntegration/src/Directory.Build.props
similarity index 100%
rename from src/Directory.Build.props
rename to src/IISIntegration/src/Directory.Build.props
diff --git a/test/Common.FunctionalTests/AppHostConfig/IIS.config b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config
similarity index 100%
rename from test/Common.FunctionalTests/AppHostConfig/IIS.config
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config
diff --git a/test/Common.FunctionalTests/AppOfflineTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/AppOfflineTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs
diff --git a/test/Common.FunctionalTests/BasicAuthTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/BasicAuthTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs
diff --git a/test/Common.FunctionalTests/ClientCertificateFixture.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs
similarity index 100%
rename from test/Common.FunctionalTests/ClientCertificateFixture.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs
diff --git a/test/Common.FunctionalTests/ClientCertificateTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/ClientCertificateTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs
diff --git a/test/Common.FunctionalTests/ClientDisconnectStress.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs
similarity index 100%
rename from test/Common.FunctionalTests/ClientDisconnectStress.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs
diff --git a/test/Common.FunctionalTests/CommonStartupTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/CommonStartupTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs
diff --git a/test/Common.FunctionalTests/CompressionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/CompressionTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs
diff --git a/test/Common.FunctionalTests/ConfigurationChangeTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/ConfigurationChangeTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/CompressionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/CompressionTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/EventLogTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/EventLogTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs
diff --git a/test/Common.FunctionalTests/Inprocess/FrebTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/FrebTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/LogPipeTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs
diff --git a/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/StartupTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/StartupTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs
diff --git a/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs
diff --git a/test/Common.FunctionalTests/LogFileTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/LogFileTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs
diff --git a/test/Common.FunctionalTests/MultiApplicationTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/MultiApplicationTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs
diff --git a/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs
diff --git a/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs
diff --git a/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs
similarity index 100%
rename from test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs
diff --git a/test/Common.FunctionalTests/PublishedSitesFixture.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs
similarity index 100%
rename from test/Common.FunctionalTests/PublishedSitesFixture.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs
diff --git a/test/Common.FunctionalTests/RequiresNewHandler.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs
similarity index 100%
rename from test/Common.FunctionalTests/RequiresNewHandler.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs
diff --git a/test/Common.FunctionalTests/RequiresNewShim.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs
similarity index 100%
rename from test/Common.FunctionalTests/RequiresNewShim.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs
diff --git a/test/Common.FunctionalTests/ServerAbortTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/ServerAbortTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs
diff --git a/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs
similarity index 100%
rename from test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs
diff --git a/test/Common.FunctionalTests/SkipVSTSAttribute.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs
similarity index 100%
rename from test/Common.FunctionalTests/SkipVSTSAttribute.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs
diff --git a/test/Common.FunctionalTests/Utilities/AppVerifier.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/AppVerifier.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs
diff --git a/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/EventLogHelpers.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs
diff --git a/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs
diff --git a/test/Common.FunctionalTests/Utilities/Helpers.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/Helpers.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs
diff --git a/test/Common.FunctionalTests/Utilities/IISCapability.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/IISCapability.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs
diff --git a/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs
diff --git a/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs
diff --git a/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs
diff --git a/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs
diff --git a/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs
diff --git a/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/LogFileTestBase.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs
diff --git a/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs
diff --git a/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs
similarity index 100%
rename from test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs
diff --git a/test/Common.FunctionalTests/WindowsAuthTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs
similarity index 100%
rename from test/Common.FunctionalTests/WindowsAuthTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs
diff --git a/test/Common.Tests/Common.Tests.csproj b/src/IISIntegration/src/IISIntegration/test/Common.Tests/Common.Tests.csproj
similarity index 100%
rename from test/Common.Tests/Common.Tests.csproj
rename to src/IISIntegration/src/IISIntegration/test/Common.Tests/Common.Tests.csproj
diff --git a/test/Common.Tests/Utilities/DisposableList.cs b/src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs
similarity index 100%
rename from test/Common.Tests/Utilities/DisposableList.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs
diff --git a/test/Common.Tests/Utilities/TestConnections.cs b/src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs
similarity index 100%
rename from test/Common.Tests/Utilities/TestConnections.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs
diff --git a/test/Common.Tests/Utilities/TimeoutExtensions.cs b/src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs
similarity index 100%
rename from test/Common.Tests/Utilities/TimeoutExtensions.cs
rename to src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs
diff --git a/test/CommonLibTests/CommonLibTests.vcxproj b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj
similarity index 100%
rename from test/CommonLibTests/CommonLibTests.vcxproj
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj
diff --git a/test/CommonLibTests/ConfigUtilityTests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp
similarity index 100%
rename from test/CommonLibTests/ConfigUtilityTests.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp
diff --git a/test/CommonLibTests/FileOutputManagerTests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp
similarity index 100%
rename from test/CommonLibTests/FileOutputManagerTests.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp
diff --git a/test/CommonLibTests/GlobalVersionTests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp
similarity index 100%
rename from test/CommonLibTests/GlobalVersionTests.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp
diff --git a/test/CommonLibTests/Helpers.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/Helpers.cpp
similarity index 100%
rename from test/CommonLibTests/Helpers.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/Helpers.cpp
diff --git a/test/CommonLibTests/Helpers.h b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/Helpers.h
similarity index 100%
rename from test/CommonLibTests/Helpers.h
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/Helpers.h
diff --git a/test/CommonLibTests/NativeTests.targets b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/NativeTests.targets
similarity index 100%
rename from test/CommonLibTests/NativeTests.targets
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/NativeTests.targets
diff --git a/test/CommonLibTests/PipeOutputManagerTests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp
similarity index 100%
rename from test/CommonLibTests/PipeOutputManagerTests.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp
diff --git a/test/CommonLibTests/exception_handler_tests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp
similarity index 100%
rename from test/CommonLibTests/exception_handler_tests.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp
diff --git a/test/CommonLibTests/fakeclasses.h b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/fakeclasses.h
similarity index 100%
rename from test/CommonLibTests/fakeclasses.h
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/fakeclasses.h
diff --git a/test/CommonLibTests/hostfxr_utility_tests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp
similarity index 100%
rename from test/CommonLibTests/hostfxr_utility_tests.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp
diff --git a/test/CommonLibTests/inprocess_application_tests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp
similarity index 100%
rename from test/CommonLibTests/inprocess_application_tests.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp
diff --git a/test/CommonLibTests/main.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/main.cpp
similarity index 100%
rename from test/CommonLibTests/main.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/main.cpp
diff --git a/test/CommonLibTests/stdafx.h b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/stdafx.h
similarity index 100%
rename from test/CommonLibTests/stdafx.h
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/stdafx.h
diff --git a/test/CommonLibTests/utility_tests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/utility_tests.cpp
similarity index 100%
rename from test/CommonLibTests/utility_tests.cpp
rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/utility_tests.cpp
diff --git a/test/Directory.Build.props b/src/IISIntegration/src/IISIntegration/test/Directory.Build.props
similarity index 100%
rename from test/Directory.Build.props
rename to src/IISIntegration/src/IISIntegration/test/Directory.Build.props
diff --git a/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs
similarity index 100%
rename from test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs
diff --git a/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs
similarity index 100%
rename from test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs
diff --git a/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj b/src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj
similarity index 100%
rename from test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj
rename to src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj
diff --git a/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs
similarity index 100%
rename from test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs
diff --git a/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs
similarity index 100%
rename from test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs
diff --git a/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj b/src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj
similarity index 100%
rename from test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj
rename to src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj
diff --git a/test/IIS.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs
similarity index 100%
rename from test/IIS.FunctionalTests/DeployerSelector.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs
diff --git a/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj b/src/IISIntegration/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj
similarity index 100%
rename from test/IIS.FunctionalTests/IIS.FunctionalTests.csproj
rename to src/IISIntegration/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj
diff --git a/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs
similarity index 100%
rename from test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs
diff --git a/test/IIS.Shared.FunctionalTests/MofFileTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs
similarity index 100%
rename from test/IIS.Shared.FunctionalTests/MofFileTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs
diff --git a/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs
similarity index 100%
rename from test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs
diff --git a/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs
similarity index 100%
rename from test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs
diff --git a/test/IIS.Shared.FunctionalTests/ServicesTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs
similarity index 100%
rename from test/IIS.Shared.FunctionalTests/ServicesTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs
diff --git a/test/IIS.Tests/AppHostConfig/HostableWebCore.config b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config
similarity index 100%
rename from test/IIS.Tests/AppHostConfig/HostableWebCore.config
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config
diff --git a/test/IIS.Tests/ClientDisconnectTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs
similarity index 100%
rename from test/IIS.Tests/ClientDisconnectTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs
diff --git a/test/IIS.Tests/ConnectionIdFeatureTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs
similarity index 100%
rename from test/IIS.Tests/ConnectionIdFeatureTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs
diff --git a/test/IIS.Tests/HttpBodyControlFeatureTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs
similarity index 100%
rename from test/IIS.Tests/HttpBodyControlFeatureTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs
diff --git a/test/IIS.Tests/IIS.Tests.csproj b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj
similarity index 100%
rename from test/IIS.Tests/IIS.Tests.csproj
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj
diff --git a/test/IIS.Tests/ResponseAbortTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs
similarity index 100%
rename from test/IIS.Tests/ResponseAbortTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs
diff --git a/test/IIS.Tests/StrictTestServerTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs
similarity index 100%
rename from test/IIS.Tests/StrictTestServerTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs
diff --git a/test/IIS.Tests/TestServerTest.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/TestServerTest.cs
similarity index 100%
rename from test/IIS.Tests/TestServerTest.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/TestServerTest.cs
diff --git a/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs
similarity index 100%
rename from test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs
diff --git a/test/IIS.Tests/Utilities/TestServer.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs
similarity index 100%
rename from test/IIS.Tests/Utilities/TestServer.cs
rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs
diff --git a/test/IISExpress.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/DeployerSelector.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs
diff --git a/test/IISExpress.FunctionalTests/HttpsTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/HttpsTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs
diff --git a/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj
similarity index 100%
rename from test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj
diff --git a/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs
diff --git a/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs
diff --git a/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs
diff --git a/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs
diff --git a/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs
diff --git a/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs
diff --git a/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/RequiresIISAttribute.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs
diff --git a/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs
similarity index 100%
rename from test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs
rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs
diff --git a/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs b/src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs
similarity index 100%
rename from test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs
diff --git a/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs b/src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs
similarity index 100%
rename from test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs
rename to src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs
diff --git a/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj b/src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj
similarity index 100%
rename from test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj
rename to src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj
diff --git a/test/TestTasks/InjectRequestHandler.cs b/src/IISIntegration/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs
similarity index 100%
rename from test/TestTasks/InjectRequestHandler.cs
rename to src/IISIntegration/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs
diff --git a/test/TestTasks/TestTasks.csproj b/src/IISIntegration/src/IISIntegration/test/TestTasks/TestTasks.csproj
similarity index 100%
rename from test/TestTasks/TestTasks.csproj
rename to src/IISIntegration/src/IISIntegration/test/TestTasks/TestTasks.csproj
diff --git a/test/WebSites/Directory.Build.props b/src/IISIntegration/src/IISIntegration/test/WebSites/Directory.Build.props
similarity index 100%
rename from test/WebSites/Directory.Build.props
rename to src/IISIntegration/src/IISIntegration/test/WebSites/Directory.Build.props
diff --git a/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj
similarity index 100%
rename from test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj
diff --git a/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json
similarity index 100%
rename from test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json
diff --git a/test/WebSites/InProcessWebSite/DummyServer.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs
similarity index 100%
rename from test/WebSites/InProcessWebSite/DummyServer.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs
diff --git a/test/WebSites/InProcessWebSite/InProcessWebSite.csproj b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj
similarity index 100%
rename from test/WebSites/InProcessWebSite/InProcessWebSite.csproj
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj
diff --git a/test/WebSites/InProcessWebSite/Program.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs
similarity index 100%
rename from test/WebSites/InProcessWebSite/Program.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs
diff --git a/test/WebSites/InProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json
similarity index 100%
rename from test/WebSites/InProcessWebSite/Properties/launchSettings.json
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json
diff --git a/test/WebSites/InProcessWebSite/Startup.WebSockets.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs
similarity index 100%
rename from test/WebSites/InProcessWebSite/Startup.WebSockets.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs
diff --git a/test/WebSites/InProcessWebSite/Startup.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs
similarity index 100%
rename from test/WebSites/InProcessWebSite/Startup.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs
diff --git a/test/WebSites/InProcessWebSite/web.config b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/web.config
similarity index 100%
rename from test/WebSites/InProcessWebSite/web.config
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/web.config
diff --git a/test/WebSites/InProcessWebSite/wwwroot/static.txt b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/wwwroot/static.txt
similarity index 100%
rename from test/WebSites/InProcessWebSite/wwwroot/static.txt
rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/wwwroot/static.txt
diff --git a/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj
similarity index 100%
rename from test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj
rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj
diff --git a/test/WebSites/OutOfProcessWebSite/Program.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs
similarity index 100%
rename from test/WebSites/OutOfProcessWebSite/Program.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs
diff --git a/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json
similarity index 100%
rename from test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json
rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json
diff --git a/test/WebSites/OutOfProcessWebSite/Startup.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs
similarity index 100%
rename from test/WebSites/OutOfProcessWebSite/Startup.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs
diff --git a/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt
similarity index 100%
rename from test/WebSites/OutOfProcessWebSite/wwwroot/static.txt
rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt
diff --git a/test/WebSites/StressTestWebSite/Program.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs
similarity index 100%
rename from test/WebSites/StressTestWebSite/Program.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs
diff --git a/test/WebSites/StressTestWebSite/Properties/launchSettings.json b/src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json
similarity index 100%
rename from test/WebSites/StressTestWebSite/Properties/launchSettings.json
rename to src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json
diff --git a/test/WebSites/StressTestWebSite/Startup.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs
similarity index 100%
rename from test/WebSites/StressTestWebSite/Startup.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs
diff --git a/test/WebSites/StressTestWebSite/StressTestWebSite.csproj b/src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj
similarity index 100%
rename from test/WebSites/StressTestWebSite/StressTestWebSite.csproj
rename to src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj
diff --git a/test/WebSites/shared/SharedStartup/Startup.shared.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs
similarity index 100%
rename from test/WebSites/shared/SharedStartup/Startup.shared.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs
diff --git a/test/WebSites/shared/WebSockets/Constants.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs
similarity index 100%
rename from test/WebSites/shared/WebSockets/Constants.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs
diff --git a/test/WebSites/shared/WebSockets/HandshakeHelpers.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs
similarity index 100%
rename from test/WebSites/shared/WebSockets/HandshakeHelpers.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs
diff --git a/test/WebSites/shared/WebSockets/TestStartup.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs
similarity index 100%
rename from test/WebSites/shared/WebSockets/TestStartup.cs
rename to src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs
diff --git a/test/gtest/gtest.vcxproj b/src/IISIntegration/src/IISIntegration/test/gtest/gtest.vcxproj
similarity index 100%
rename from test/gtest/gtest.vcxproj
rename to src/IISIntegration/src/IISIntegration/test/gtest/gtest.vcxproj
diff --git a/src/Microsoft.AspNetCore.Server.IIS/AssemblyInfo.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/AssemblyInfo.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/AssemblyInfo.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/AssemblyInfo.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/DuplexStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/DuplexStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/DuplexStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/DuplexStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/EmptyStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/EmptyStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/EmptyStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/EmptyStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/HttpRequestStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpRequestStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/HttpRequestStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpRequestStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/HttpResponseStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpResponseStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/HttpResponseStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpResponseStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/HttpStreamState.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpStreamState.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/HttpStreamState.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpStreamState.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/HttpUpgradeStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpUpgradeStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/HttpUpgradeStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpUpgradeStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISConfigurationData.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISConfigurationData.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISConfigurationData.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISConfigurationData.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.FeatureCollection.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.FeatureCollection.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.FeatureCollection.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.FeatureCollection.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Features.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Features.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Features.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Features.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpConnectionFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpConnectionFeature.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpConnectionFeature.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpConnectionFeature.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestIdentifierFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestIdentifierFeature.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestIdentifierFeature.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestIdentifierFeature.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestLifetimeFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestLifetimeFeature.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestLifetimeFeature.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestLifetimeFeature.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IO.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IO.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IO.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IO.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Log.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Log.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Log.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Log.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContextOfT.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContextOfT.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContextOfT.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContextOfT.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpServer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpServer.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpServer.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpServer.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISNativeApplication.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISNativeApplication.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISNativeApplication.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISNativeApplication.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerAuthenticationHandler.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerAuthenticationHandler.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISServerAuthenticationHandler.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerAuthenticationHandler.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerSetupFilter.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerSetupFilter.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISServerSetupFilter.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerSetupFilter.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Flush.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Flush.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Flush.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Flush.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Read.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Read.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Read.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Read.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Write.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Write.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Write.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Write.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOOperation.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOOperation.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOOperation.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOOperation.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncWriteOperationBase.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncWriteOperationBase.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncWriteOperationBase.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncWriteOperationBase.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/IAsyncIOEngine.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/IAsyncIOEngine.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/IAsyncIOEngine.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/IAsyncIOEngine.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Read.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Read.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Read.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Read.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Write.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Write.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Write.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Write.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/OutputProducer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/OutputProducer.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/OutputProducer.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/OutputProducer.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/ReadOnlyStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/ReadOnlyStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/ReadOnlyStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/ReadOnlyStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/Streams.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/Streams.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/Streams.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/Streams.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/ThrowingWasUpgradedWriteOnlyStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/ThrowingWasUpgradedWriteOnlyStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/ThrowingWasUpgradedWriteOnlyStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/ThrowingWasUpgradedWriteOnlyStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/WrappingStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/WrappingStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/WrappingStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/WrappingStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/WriteOnlyStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/WriteOnlyStream.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Core/WriteOnlyStream.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/WriteOnlyStream.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/CoreStrings.resx b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/CoreStrings.resx
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/CoreStrings.resx
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/CoreStrings.resx
diff --git a/src/Microsoft.AspNetCore.Server.IIS/HttpContextExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/HttpContextExtensions.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/HttpContextExtensions.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/HttpContextExtensions.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/IISServerDefaults.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IISServerDefaults.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/IISServerDefaults.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IISServerDefaults.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/IISServerOptions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IISServerOptions.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/IISServerOptions.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IISServerOptions.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/IServerVariableFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IServerVariableFeature.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/IServerVariableFeature.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IServerVariableFeature.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.targets b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.targets
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.targets
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.targets
diff --git a/src/Microsoft.AspNetCore.Server.IIS/NativeMethods.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/NativeMethods.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/NativeMethods.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/NativeMethods.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/Properties/CoreStrings.Designer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Properties/CoreStrings.Designer.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/Properties/CoreStrings.Designer.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Properties/CoreStrings.Designer.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/WebHostBuilderIISExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/WebHostBuilderIISExtensions.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/WebHostBuilderIISExtensions.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/WebHostBuilderIISExtensions.cs
diff --git a/src/Microsoft.AspNetCore.Server.IIS/_._ b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/_._
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IIS/_._
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/_._
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.targets b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.targets
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.targets
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.targets
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs
diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ApplicationDeployerFactory.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ApplicationDeployerFactory.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ApplicationDeployerFactory.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ApplicationDeployerFactory.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Http.config b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Http.config
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Http.config
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Http.config
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployer.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployer.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployer.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployerBase.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployerBase.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployerBase.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployerBase.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameterExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameterExtensions.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameterExtensions.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameterExtensions.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameters.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameters.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameters.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameters.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentResult.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentResult.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentResult.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentResult.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISExpressDeployer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISExpressDeployer.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISExpressDeployer.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISExpressDeployer.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/LoggingHandler.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/LoggingHandler.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/LoggingHandler.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/LoggingHandler.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ProcessTracker.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ProcessTracker.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ProcessTracker.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ProcessTracker.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/RetryHandler.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/RetryHandler.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/RetryHandler.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/RetryHandler.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/WebConfigHelpers.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/WebConfigHelpers.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/WebConfigHelpers.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/WebConfigHelpers.cs
diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/XElementExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/XElementExtensions.cs
similarity index 100%
rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/XElementExtensions.cs
rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/XElementExtensions.cs
diff --git a/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config b/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config
new file mode 100644
index 0000000000000000000000000000000000000000..bc24ef96390914736b57886e6949cdd67eb5ac68
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config
@@ -0,0 +1,740 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    IIS configuration sections.
+
+    For schema documentation, see
+    %windir%\system32\inetsrv\config\schema\IIS_schema.xml.
+
+    Please make a backup of this file before making any changes to it.
+
+-->
+
+<configuration>
+
+    <!--
+
+        The <configSections> section controls the registration of sections.
+        Section is the basic unit of deployment, locking, searching and
+        containment for configuration settings.
+
+        Every section belongs to one section group.
+        A section group is a container of logically-related sections.
+
+        Sections cannot be nested.
+        Section groups may be nested.
+
+        <section
+            name=""  [Required, Collection Key] [XML name of the section]
+            allowDefinition="Everywhere" [MachineOnly|MachineToApplication|AppHostOnly|Everywhere] [Level where it can be set]
+            overrideModeDefault="Allow"  [Allow|Deny] [Default delegation mode]
+            allowLocation="true"  [true|false] [Allowed in location tags]
+        />
+
+        The recommended way to unlock sections is by using a location tag:
+        <location path="Default Web Site" overrideMode="Allow">
+            <system.webServer>
+                <asp />
+            </system.webServer>
+        </location>
+
+    -->
+    <configSections>
+        <sectionGroup name="system.applicationHost">
+            <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+        </sectionGroup>
+
+        <sectionGroup name="system.webServer">
+            <section name="asp" overrideModeDefault="Deny" />
+            <section name="caching" overrideModeDefault="Allow" />
+            <section name="cgi" overrideModeDefault="Deny" />
+            <section name="defaultDocument" overrideModeDefault="Allow" />
+            <section name="directoryBrowse" overrideModeDefault="Allow" />
+            <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="globalModules" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+            <section name="handlers" overrideModeDefault="Deny" />
+            <section name="httpCompression" overrideModeDefault="Allow" />
+            <section name="httpErrors" overrideModeDefault="Allow" />
+            <section name="httpLogging" overrideModeDefault="Deny" />
+            <section name="httpProtocol" overrideModeDefault="Allow" />
+            <section name="httpRedirect" overrideModeDefault="Allow" />
+            <section name="httpTracing" overrideModeDefault="Deny" />
+            <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+            <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+            <section name="odbcLogging" overrideModeDefault="Deny" />
+            <sectionGroup name="security">
+                <section name="access" overrideModeDefault="Deny" />
+                <section name="applicationDependencies" overrideModeDefault="Deny" />
+                <sectionGroup name="authentication">
+                    <section name="anonymousAuthentication" overrideModeDefault="Deny" />
+                    <section name="basicAuthentication" overrideModeDefault="Deny" />
+                    <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+                    <section name="digestAuthentication" overrideModeDefault="Deny" />
+                    <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+                    <section name="windowsAuthentication" overrideModeDefault="Deny" />
+                </sectionGroup>
+                <section name="authorization" overrideModeDefault="Allow" />
+                <section name="ipSecurity" overrideModeDefault="Deny" />
+                <section name="dynamicIpSecurity" overrideModeDefault="Deny" />
+                <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+                <section name="requestFiltering" overrideModeDefault="Allow" />
+            </sectionGroup>
+            <section name="serverRuntime" overrideModeDefault="Deny" />
+            <section name="serverSideInclude" overrideModeDefault="Deny" />
+            <section name="staticContent" overrideModeDefault="Allow" />
+            <sectionGroup name="tracing">
+                <section name="traceFailedRequests" overrideModeDefault="Allow" />
+                <section name="traceProviderDefinitions" overrideModeDefault="Deny" />
+            </sectionGroup>
+            <section name="urlCompression" overrideModeDefault="Allow" />
+            <section name="validation" overrideModeDefault="Allow" />
+            <sectionGroup name="webdav">
+                <section name="globalSettings" overrideModeDefault="Deny" />
+                <section name="authoring" overrideModeDefault="Deny" />
+                <section name="authoringRules" overrideModeDefault="Deny" />
+            </sectionGroup>
+            <section name="webSocket" overrideModeDefault="Deny" />
+            <section name="aspNetCore" overrideModeDefault="Allow" />
+        </sectionGroup>
+        <sectionGroup name="system.ftpServer">
+            <section name="log" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+            <section name="firewallSupport" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+            <section name="caching" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+            <section name="providerDefinitions" overrideModeDefault="Deny" />
+            <sectionGroup name="security">
+                <section name="ipSecurity" overrideModeDefault="Deny" />
+                <section name="requestFiltering" overrideModeDefault="Deny" />
+                <section name="authorization" overrideModeDefault="Deny" />
+                <section name="authentication" overrideModeDefault="Deny" />
+            </sectionGroup>
+            <section name="serverRuntime" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+        </sectionGroup>
+    </configSections>
+
+    <configProtectedData>
+        <providers>
+            <add name="IISWASOnlyRsaProvider" type="" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useMachineContainer="true" useOAEP="false" />
+            <add name="IISCngProvider" type="Microsoft.ApplicationHost.CngProtectedConfigurationProvider" description="Uses Win32 Crypto CNG to encrypt and decrypt" keyContainerName="iisCngConfigurationKey" useMachineContainer="true" />
+            <add name="IISWASOnlyCngProvider" type="Microsoft.ApplicationHost.CngProtectedConfigurationProvider" description="(WAS Only) Uses Win32 Crypto CNG to encrypt and decrypt" keyContainerName="iisCngWasKey" useMachineContainer="true" />
+            <add name="AesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisConfigurationKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAAX3F7JKrgomyurjp+EzqF/rH26sw4/Bl57PAr0ZDqQJWRVT5LLg2T+nvdVUl0mbFYl2D9zwOqBWPEU29RgmvWDvGqNu6q/qDnRJ/pP/sDbArVJTnK/JQCJ9FuImmu6pz/Xbvq+aGG7FGxlZWOwMGYlnJBkDAseyOWTL8dYsGZ4xXo18NWaIJoimCKPqxUQCKf/arDeIopmx4QSLu9scbgYNHLdv8+pegkLVt5BdhR/xNTU6gb/eIemjy2SCYXASu/6M5Jki0plXyIvHf8Q+kwGSIkPvnCiUnE66koKA4dQ45rG4Ftb4wZ0gSa4bQVp6D6Svhu7fV7rOzBNdNreGF8qA==" />
+            <add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAAbu3YiDQwroP3yTqKR0m1fxXM6E9EBOZ5ZOg7LO1TJwYXCgQTB0hrm1TRAOxFhlPKtok3YVAyYMfazt7GXJ0O447FFg0abNIy4U/PZV/10evK5XvcoUy2qgddsa1EwOI7dqIrhe9T0A9+QtnHpYOqEFUhLj3ZGmhWsvyVBaenBGLWRuZ65Qwtd75/Hc2FcRaYpuDChjrz0OR/x8LKnGGkNMDwe3Ew9MIyImp8AjCGfGBTkevXqlmTOXfBHtWRsbQYlipz1jINc9EXGiPmIRPmLo4MnmQ/48jssL8QI91BRbL62kuQTxPwCZ+v0WzC3C+poF29V3CwjgydcrV5nZq/kw==" />
+        </providers>
+    </configProtectedData>
+
+    <system.applicationHost>
+
+        <applicationPools>
+            <add name="DefaultAppPool" autoStart="true" startMode="AlwaysRunning">
+                <processModel identityType="LocalSystem" />
+             </add>
+            <applicationPoolDefaults managedRuntimeVersion="v4.0">
+                <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="false" />
+            </applicationPoolDefaults>
+        </applicationPools>
+
+        <!--
+
+          The <customMetadata> section is used internally by the Admin Base Objects
+          (ABO) Compatibility component. Please do not modify its content.
+
+        -->
+        <customMetadata />
+
+        <!--
+
+          The <listenerAdapters> section defines the protocols with which the
+          Windows Process Activation Service (WAS) binds.
+
+        -->
+        <listenerAdapters>
+            <add name="http" />
+        </listenerAdapters>
+
+        <log>
+            <centralBinaryLogFile enabled="true" directory="%SystemDrive%\inetpub\logs\LogFiles" />
+            <centralW3CLogFile enabled="true" directory="%SystemDrive%\inetpub\logs\LogFiles" />
+        </log>
+
+        <sites>
+            <site name="Default Web Site" id="1">
+                <application path="/">
+                    <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
+                </application>
+                <bindings>
+                    <binding protocol="http" bindingInformation="*:80:" />
+                </bindings>
+            </site>
+            <siteDefaults>
+                <logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
+                <traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
+            </siteDefaults>
+            <applicationDefaults applicationPool="DefaultAppPool" />
+            <virtualDirectoryDefaults allowSubDirConfig="true" />
+        </sites>
+
+        <webLimits />
+
+    </system.applicationHost>
+
+    <system.webServer>
+
+        <asp />
+
+        <caching enabled="true" enableKernelCache="true">
+        </caching>
+
+        <cgi />
+
+        <defaultDocument enabled="true">
+            <files>
+                <add value="Default.htm" />
+                <add value="Default.asp" />
+                <add value="index.htm" />
+                <add value="index.html" />
+                <add value="iisstart.htm" />
+            </files>
+        </defaultDocument>
+
+        <directoryBrowse enabled="false" />
+
+        <fastCgi />
+
+        <!--
+
+          The <globalModules> section defines all native-code modules.
+          To enable a module, specify it in the <modules> section.
+
+        -->
+        <globalModules>
+            <add name="HttpLoggingModule" image="%windir%\System32\inetsrv\loghttp.dll" />
+            <add name="UriCacheModule" image="%windir%\System32\inetsrv\cachuri.dll" />
+            <add name="FileCacheModule" image="%windir%\System32\inetsrv\cachfile.dll" />
+            <add name="TokenCacheModule" image="%windir%\System32\inetsrv\cachtokn.dll" />
+            <add name="HttpCacheModule" image="%windir%\System32\inetsrv\cachhttp.dll" />
+            <add name="StaticCompressionModule" image="%windir%\System32\inetsrv\compstat.dll" />
+            <add name="DefaultDocumentModule" image="%windir%\System32\inetsrv\defdoc.dll" />
+            <add name="DirectoryListingModule" image="%windir%\System32\inetsrv\dirlist.dll" />
+            <add name="ProtocolSupportModule" image="%windir%\System32\inetsrv\protsup.dll" />
+            <add name="StaticFileModule" image="%windir%\System32\inetsrv\static.dll" />
+            <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" />
+            <add name="RequestFilteringModule" image="%windir%\System32\inetsrv\modrqflt.dll" />
+            <add name="CustomErrorModule" image="%windir%\System32\inetsrv\custerr.dll" />
+            <!--<add name="WebSocketModule" image="%windir%\System32\inetsrv\iiswsock.dll" />-->
+        </globalModules>
+
+        <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
+            <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
+            <staticTypes>
+                <add mimeType="text/*" enabled="true" />
+                <add mimeType="message/*" enabled="true" />
+                <add mimeType="application/javascript" enabled="true" />
+                <add mimeType="application/atom+xml" enabled="true" />
+                <add mimeType="application/xaml+xml" enabled="true" />
+                <add mimeType="image/svg+xml" enabled="true" />
+                <add mimeType="*/*" enabled="false" />
+            </staticTypes>
+        </httpCompression>
+
+        <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">
+            <error statusCode="401" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="401.htm" />
+            <error statusCode="403" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="403.htm" />
+            <error statusCode="404" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="404.htm" />
+            <error statusCode="405" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="405.htm" />
+            <error statusCode="406" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="406.htm" />
+            <error statusCode="412" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="412.htm" />
+            <error statusCode="500" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="500.htm" />
+            <error statusCode="501" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="501.htm" />
+            <error statusCode="502" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="502.htm" />
+        </httpErrors>
+
+        <httpLogging dontLog="false" />
+
+        <httpProtocol>
+            <customHeaders>
+                <clear />
+            </customHeaders>
+            <redirectHeaders>
+                <clear />
+            </redirectHeaders>
+        </httpProtocol>
+
+        <httpRedirect />
+
+        <httpTracing />
+
+        <isapiFilters />
+
+        <modules>
+            <add name="HttpLoggingModule" lockItem="true" />
+            <add name="HttpCacheModule" lockItem="true" />
+            <add name="StaticCompressionModule" lockItem="true" />
+            <add name="DefaultDocumentModule" lockItem="true" />
+            <add name="DirectoryListingModule" lockItem="true" />
+            <add name="ProtocolSupportModule" lockItem="true" />
+            <add name="StaticFileModule" lockItem="true" />
+            <add name="AnonymousAuthenticationModule" lockItem="true" />
+            <add name="RequestFilteringModule" lockItem="true" />
+            <add name="CustomErrorModule" lockItem="true" />
+            <!--<add name="WebSocketModule" lockItem="true" />-->
+        </modules>
+
+        <odbcLogging />
+
+        <security>
+
+            <access sslFlags="None" />
+
+            <applicationDependencies />
+
+            <authentication>
+
+                <anonymousAuthentication enabled="true" userName="IUSR" />
+
+                <basicAuthentication />
+
+                <clientCertificateMappingAuthentication />
+
+                <digestAuthentication />
+
+                <iisClientCertificateMappingAuthentication />
+
+            </authentication>
+
+            <authorization />
+
+            <ipSecurity />
+
+            <isapiCgiRestriction />
+
+            <requestFiltering>
+                <fileExtensions allowUnlisted="true" applyToWebDAV="true" />
+                <verbs allowUnlisted="true" applyToWebDAV="true" />
+                <hiddenSegments applyToWebDAV="true">
+                    <add segment="web.config" />
+                </hiddenSegments>
+            </requestFiltering>
+
+        </security>
+
+        <serverRuntime />
+
+        <serverSideInclude />
+
+        <staticContent lockAttributes="isDocFooterFileName">
+            <mimeMap fileExtension=".323" mimeType="text/h323" />
+            <mimeMap fileExtension=".3g2" mimeType="video/3gpp2" />
+            <mimeMap fileExtension=".3gp2" mimeType="video/3gpp2" />
+            <mimeMap fileExtension=".3gp" mimeType="video/3gpp" />
+            <mimeMap fileExtension=".3gpp" mimeType="video/3gpp" />
+            <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".aac" mimeType="audio/aac" />
+            <mimeMap fileExtension=".aca" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".accdb" mimeType="application/msaccess" />
+            <mimeMap fileExtension=".accde" mimeType="application/msaccess" />
+            <mimeMap fileExtension=".accdt" mimeType="application/msaccess" />
+            <mimeMap fileExtension=".acx" mimeType="application/internet-property-stream" />
+            <mimeMap fileExtension=".adt" mimeType="audio/vnd.dlna.adts" />
+            <mimeMap fileExtension=".adts" mimeType="audio/vnd.dlna.adts" />
+            <mimeMap fileExtension=".afm" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".ai" mimeType="application/postscript" />
+            <mimeMap fileExtension=".aif" mimeType="audio/x-aiff" />
+            <mimeMap fileExtension=".aifc" mimeType="audio/aiff" />
+            <mimeMap fileExtension=".aiff" mimeType="audio/aiff" />
+            <mimeMap fileExtension=".appcache" mimeType="text/cache-manifest" />
+            <mimeMap fileExtension=".application" mimeType="application/x-ms-application" />
+            <mimeMap fileExtension=".art" mimeType="image/x-jg" />
+            <mimeMap fileExtension=".asd" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".asf" mimeType="video/x-ms-asf" />
+            <mimeMap fileExtension=".asi" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".asm" mimeType="text/plain" />
+            <mimeMap fileExtension=".asr" mimeType="video/x-ms-asf" />
+            <mimeMap fileExtension=".asx" mimeType="video/x-ms-asf" />
+            <mimeMap fileExtension=".atom" mimeType="application/atom+xml" />
+            <mimeMap fileExtension=".au" mimeType="audio/basic" />
+            <mimeMap fileExtension=".avi" mimeType="video/avi" />
+            <mimeMap fileExtension=".axs" mimeType="application/olescript" />
+            <mimeMap fileExtension=".bas" mimeType="text/plain" />
+            <mimeMap fileExtension=".bcpio" mimeType="application/x-bcpio" />
+            <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".bmp" mimeType="image/bmp" />
+            <mimeMap fileExtension=".c" mimeType="text/plain" />
+            <mimeMap fileExtension=".cab" mimeType="application/vnd.ms-cab-compressed" />
+            <mimeMap fileExtension=".calx" mimeType="application/vnd.ms-office.calx" />
+            <mimeMap fileExtension=".cat" mimeType="application/vnd.ms-pki.seccat" />
+            <mimeMap fileExtension=".cdf" mimeType="application/x-cdf" />
+            <mimeMap fileExtension=".chm" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".class" mimeType="application/x-java-applet" />
+            <mimeMap fileExtension=".clp" mimeType="application/x-msclip" />
+            <mimeMap fileExtension=".cmx" mimeType="image/x-cmx" />
+            <mimeMap fileExtension=".cnf" mimeType="text/plain" />
+            <mimeMap fileExtension=".cod" mimeType="image/cis-cod" />
+            <mimeMap fileExtension=".cpio" mimeType="application/x-cpio" />
+            <mimeMap fileExtension=".cpp" mimeType="text/plain" />
+            <mimeMap fileExtension=".crd" mimeType="application/x-mscardfile" />
+            <mimeMap fileExtension=".crl" mimeType="application/pkix-crl" />
+            <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" />
+            <mimeMap fileExtension=".csh" mimeType="application/x-csh" />
+            <mimeMap fileExtension=".css" mimeType="text/css" />
+            <mimeMap fileExtension=".csv" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".cur" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".dcr" mimeType="application/x-director" />
+            <mimeMap fileExtension=".deploy" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".der" mimeType="application/x-x509-ca-cert" />
+            <mimeMap fileExtension=".dib" mimeType="image/bmp" />
+            <mimeMap fileExtension=".dir" mimeType="application/x-director" />
+            <mimeMap fileExtension=".disco" mimeType="text/xml" />
+            <mimeMap fileExtension=".dll" mimeType="application/x-msdownload" />
+            <mimeMap fileExtension=".dll.config" mimeType="text/xml" />
+            <mimeMap fileExtension=".dlm" mimeType="text/dlm" />
+            <mimeMap fileExtension=".doc" mimeType="application/msword" />
+            <mimeMap fileExtension=".docm" mimeType="application/vnd.ms-word.document.macroEnabled.12" />
+            <mimeMap fileExtension=".docx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
+            <mimeMap fileExtension=".dot" mimeType="application/msword" />
+            <mimeMap fileExtension=".dotm" mimeType="application/vnd.ms-word.template.macroEnabled.12" />
+            <mimeMap fileExtension=".dotx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.template" />
+            <mimeMap fileExtension=".dsp" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".dtd" mimeType="text/xml" />
+            <mimeMap fileExtension=".dvi" mimeType="application/x-dvi" />
+            <mimeMap fileExtension=".dvr-ms" mimeType="video/x-ms-dvr" />
+            <mimeMap fileExtension=".dwf" mimeType="drawing/x-dwf" />
+            <mimeMap fileExtension=".dwp" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".dxr" mimeType="application/x-director" />
+            <mimeMap fileExtension=".eml" mimeType="message/rfc822" />
+            <mimeMap fileExtension=".emz" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
+            <mimeMap fileExtension=".eps" mimeType="application/postscript" />
+            <mimeMap fileExtension=".esd" mimeType="application/vnd.ms-cab-compressed" />
+            <mimeMap fileExtension=".etx" mimeType="text/x-setext" />
+            <mimeMap fileExtension=".evy" mimeType="application/envoy" />
+            <mimeMap fileExtension=".exe" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".exe.config" mimeType="text/xml" />
+            <mimeMap fileExtension=".fdf" mimeType="application/vnd.fdf" />
+            <mimeMap fileExtension=".fif" mimeType="application/fractals" />
+            <mimeMap fileExtension=".fla" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".flr" mimeType="x-world/x-vrml" />
+            <mimeMap fileExtension=".flv" mimeType="video/x-flv" />
+            <mimeMap fileExtension=".gif" mimeType="image/gif" />
+            <mimeMap fileExtension=".gtar" mimeType="application/x-gtar" />
+            <mimeMap fileExtension=".gz" mimeType="application/x-gzip" />
+            <mimeMap fileExtension=".h" mimeType="text/plain" />
+            <mimeMap fileExtension=".hdf" mimeType="application/x-hdf" />
+            <mimeMap fileExtension=".hdml" mimeType="text/x-hdml" />
+            <mimeMap fileExtension=".hhc" mimeType="application/x-oleobject" />
+            <mimeMap fileExtension=".hhk" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".hhp" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".hlp" mimeType="application/winhlp" />
+            <mimeMap fileExtension=".hqx" mimeType="application/mac-binhex40" />
+            <mimeMap fileExtension=".hta" mimeType="application/hta" />
+            <mimeMap fileExtension=".htc" mimeType="text/x-component" />
+            <mimeMap fileExtension=".htm" mimeType="text/html" />
+            <mimeMap fileExtension=".html" mimeType="text/html" />
+            <mimeMap fileExtension=".htt" mimeType="text/webviewhtml" />
+            <mimeMap fileExtension=".hxt" mimeType="text/html" />
+            <mimeMap fileExtension=".ico" mimeType="image/x-icon" />
+            <mimeMap fileExtension=".ics" mimeType="text/calendar" />
+            <mimeMap fileExtension=".ief" mimeType="image/ief" />
+            <mimeMap fileExtension=".iii" mimeType="application/x-iphone" />
+            <mimeMap fileExtension=".inf" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".ins" mimeType="application/x-internet-signup" />
+            <mimeMap fileExtension=".isp" mimeType="application/x-internet-signup" />
+            <mimeMap fileExtension=".IVF" mimeType="video/x-ivf" />
+            <mimeMap fileExtension=".jar" mimeType="application/java-archive" />
+            <mimeMap fileExtension=".java" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".jck" mimeType="application/liquidmotion" />
+            <mimeMap fileExtension=".jcz" mimeType="application/liquidmotion" />
+            <mimeMap fileExtension=".jfif" mimeType="image/pjpeg" />
+            <mimeMap fileExtension=".jpb" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".jpe" mimeType="image/jpeg" />
+            <mimeMap fileExtension=".jpeg" mimeType="image/jpeg" />
+            <mimeMap fileExtension=".jpg" mimeType="image/jpeg" />
+            <mimeMap fileExtension=".js" mimeType="application/javascript" />
+            <mimeMap fileExtension=".json" mimeType="application/json" />
+            <mimeMap fileExtension=".jsonld" mimeType="application/ld+json" />
+            <mimeMap fileExtension=".jsx" mimeType="text/jscript" />
+            <mimeMap fileExtension=".latex" mimeType="application/x-latex" />
+            <mimeMap fileExtension=".less" mimeType="text/css" />
+            <mimeMap fileExtension=".lit" mimeType="application/x-ms-reader" />
+            <mimeMap fileExtension=".lpk" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".lsf" mimeType="video/x-la-asf" />
+            <mimeMap fileExtension=".lsx" mimeType="video/x-la-asf" />
+            <mimeMap fileExtension=".lzh" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".m13" mimeType="application/x-msmediaview" />
+            <mimeMap fileExtension=".m14" mimeType="application/x-msmediaview" />
+            <mimeMap fileExtension=".m1v" mimeType="video/mpeg" />
+            <mimeMap fileExtension=".m2ts" mimeType="video/vnd.dlna.mpeg-tts" />
+            <mimeMap fileExtension=".m3u" mimeType="audio/x-mpegurl" />
+            <mimeMap fileExtension=".m4a" mimeType="audio/mp4" />
+            <mimeMap fileExtension=".m4v" mimeType="video/mp4" />
+            <mimeMap fileExtension=".man" mimeType="application/x-troff-man" />
+            <mimeMap fileExtension=".manifest" mimeType="application/x-ms-manifest" />
+            <mimeMap fileExtension=".map" mimeType="text/plain" />
+            <mimeMap fileExtension=".mdb" mimeType="application/x-msaccess" />
+            <mimeMap fileExtension=".mdp" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".me" mimeType="application/x-troff-me" />
+            <mimeMap fileExtension=".mht" mimeType="message/rfc822" />
+            <mimeMap fileExtension=".mhtml" mimeType="message/rfc822" />
+            <mimeMap fileExtension=".mid" mimeType="audio/mid" />
+            <mimeMap fileExtension=".midi" mimeType="audio/mid" />
+            <mimeMap fileExtension=".mix" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".mmf" mimeType="application/x-smaf" />
+            <mimeMap fileExtension=".mno" mimeType="text/xml" />
+            <mimeMap fileExtension=".mny" mimeType="application/x-msmoney" />
+            <mimeMap fileExtension=".mov" mimeType="video/quicktime" />
+            <mimeMap fileExtension=".movie" mimeType="video/x-sgi-movie" />
+            <mimeMap fileExtension=".mp2" mimeType="video/mpeg" />
+            <mimeMap fileExtension=".mp3" mimeType="audio/mpeg" />
+            <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
+            <mimeMap fileExtension=".mp4v" mimeType="video/mp4" />
+            <mimeMap fileExtension=".mpa" mimeType="video/mpeg" />
+            <mimeMap fileExtension=".mpe" mimeType="video/mpeg" />
+            <mimeMap fileExtension=".mpeg" mimeType="video/mpeg" />
+            <mimeMap fileExtension=".mpg" mimeType="video/mpeg" />
+            <mimeMap fileExtension=".mpp" mimeType="application/vnd.ms-project" />
+            <mimeMap fileExtension=".mpv2" mimeType="video/mpeg" />
+            <mimeMap fileExtension=".ms" mimeType="application/x-troff-ms" />
+            <mimeMap fileExtension=".msi" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".mso" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".mvb" mimeType="application/x-msmediaview" />
+            <mimeMap fileExtension=".mvc" mimeType="application/x-miva-compiled" />
+            <mimeMap fileExtension=".nc" mimeType="application/x-netcdf" />
+            <mimeMap fileExtension=".nsc" mimeType="video/x-ms-asf" />
+            <mimeMap fileExtension=".nws" mimeType="message/rfc822" />
+            <mimeMap fileExtension=".ocx" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".oda" mimeType="application/oda" />
+            <mimeMap fileExtension=".odc" mimeType="text/x-ms-odc" />
+            <mimeMap fileExtension=".ods" mimeType="application/oleobject" />
+            <mimeMap fileExtension=".oga" mimeType="audio/ogg" />
+            <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
+            <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
+            <mimeMap fileExtension=".one" mimeType="application/onenote" />
+            <mimeMap fileExtension=".onea" mimeType="application/onenote" />
+            <mimeMap fileExtension=".onetoc" mimeType="application/onenote" />
+            <mimeMap fileExtension=".onetoc2" mimeType="application/onenote" />
+            <mimeMap fileExtension=".onetmp" mimeType="application/onenote" />
+            <mimeMap fileExtension=".onepkg" mimeType="application/onenote" />
+            <mimeMap fileExtension=".osdx" mimeType="application/opensearchdescription+xml" />
+            <mimeMap fileExtension=".otf" mimeType="font/otf" />
+            <mimeMap fileExtension=".p10" mimeType="application/pkcs10" />
+            <mimeMap fileExtension=".p12" mimeType="application/x-pkcs12" />
+            <mimeMap fileExtension=".p7b" mimeType="application/x-pkcs7-certificates" />
+            <mimeMap fileExtension=".p7c" mimeType="application/pkcs7-mime" />
+            <mimeMap fileExtension=".p7m" mimeType="application/pkcs7-mime" />
+            <mimeMap fileExtension=".p7r" mimeType="application/x-pkcs7-certreqresp" />
+            <mimeMap fileExtension=".p7s" mimeType="application/pkcs7-signature" />
+            <mimeMap fileExtension=".pbm" mimeType="image/x-portable-bitmap" />
+            <mimeMap fileExtension=".pcx" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".pcz" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".pdf" mimeType="application/pdf" />
+            <mimeMap fileExtension=".pfb" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".pfm" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".pfx" mimeType="application/x-pkcs12" />
+            <mimeMap fileExtension=".pgm" mimeType="image/x-portable-graymap" />
+            <mimeMap fileExtension=".pko" mimeType="application/vnd.ms-pki.pko" />
+            <mimeMap fileExtension=".pma" mimeType="application/x-perfmon" />
+            <mimeMap fileExtension=".pmc" mimeType="application/x-perfmon" />
+            <mimeMap fileExtension=".pml" mimeType="application/x-perfmon" />
+            <mimeMap fileExtension=".pmr" mimeType="application/x-perfmon" />
+            <mimeMap fileExtension=".pmw" mimeType="application/x-perfmon" />
+            <mimeMap fileExtension=".png" mimeType="image/png" />
+            <mimeMap fileExtension=".pnm" mimeType="image/x-portable-anymap" />
+            <mimeMap fileExtension=".pnz" mimeType="image/png" />
+            <mimeMap fileExtension=".pot" mimeType="application/vnd.ms-powerpoint" />
+            <mimeMap fileExtension=".potm" mimeType="application/vnd.ms-powerpoint.template.macroEnabled.12" />
+            <mimeMap fileExtension=".potx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.template" />
+            <mimeMap fileExtension=".ppam" mimeType="application/vnd.ms-powerpoint.addin.macroEnabled.12" />
+            <mimeMap fileExtension=".ppm" mimeType="image/x-portable-pixmap" />
+            <mimeMap fileExtension=".pps" mimeType="application/vnd.ms-powerpoint" />
+            <mimeMap fileExtension=".ppsm" mimeType="application/vnd.ms-powerpoint.slideshow.macroEnabled.12" />
+            <mimeMap fileExtension=".ppsx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" />
+            <mimeMap fileExtension=".ppt" mimeType="application/vnd.ms-powerpoint" />
+            <mimeMap fileExtension=".pptm" mimeType="application/vnd.ms-powerpoint.presentation.macroEnabled.12" />
+            <mimeMap fileExtension=".pptx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
+            <mimeMap fileExtension=".prf" mimeType="application/pics-rules" />
+            <mimeMap fileExtension=".prm" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".prx" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".ps" mimeType="application/postscript" />
+            <mimeMap fileExtension=".psd" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".psm" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".psp" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".pub" mimeType="application/x-mspublisher" />
+            <mimeMap fileExtension=".qt" mimeType="video/quicktime" />
+            <mimeMap fileExtension=".qtl" mimeType="application/x-quicktimeplayer" />
+            <mimeMap fileExtension=".qxd" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".ra" mimeType="audio/x-pn-realaudio" />
+            <mimeMap fileExtension=".ram" mimeType="audio/x-pn-realaudio" />
+            <mimeMap fileExtension=".rar" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".ras" mimeType="image/x-cmu-raster" />
+            <mimeMap fileExtension=".rf" mimeType="image/vnd.rn-realflash" />
+            <mimeMap fileExtension=".rgb" mimeType="image/x-rgb" />
+            <mimeMap fileExtension=".rm" mimeType="application/vnd.rn-realmedia" />
+            <mimeMap fileExtension=".rmi" mimeType="audio/mid" />
+            <mimeMap fileExtension=".roff" mimeType="application/x-troff" />
+            <mimeMap fileExtension=".rpm" mimeType="audio/x-pn-realaudio-plugin" />
+            <mimeMap fileExtension=".rtf" mimeType="application/rtf" />
+            <mimeMap fileExtension=".rtx" mimeType="text/richtext" />
+            <mimeMap fileExtension=".scd" mimeType="application/x-msschedule" />
+            <mimeMap fileExtension=".sct" mimeType="text/scriptlet" />
+            <mimeMap fileExtension=".sea" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".setpay" mimeType="application/set-payment-initiation" />
+            <mimeMap fileExtension=".setreg" mimeType="application/set-registration-initiation" />
+            <mimeMap fileExtension=".sgml" mimeType="text/sgml" />
+            <mimeMap fileExtension=".sh" mimeType="application/x-sh" />
+            <mimeMap fileExtension=".shar" mimeType="application/x-shar" />
+            <mimeMap fileExtension=".sit" mimeType="application/x-stuffit" />
+            <mimeMap fileExtension=".sldm" mimeType="application/vnd.ms-powerpoint.slide.macroEnabled.12" />
+            <mimeMap fileExtension=".sldx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slide" />
+            <mimeMap fileExtension=".smd" mimeType="audio/x-smd" />
+            <mimeMap fileExtension=".smi" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".smx" mimeType="audio/x-smd" />
+            <mimeMap fileExtension=".smz" mimeType="audio/x-smd" />
+            <mimeMap fileExtension=".snd" mimeType="audio/basic" />
+            <mimeMap fileExtension=".snp" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".spc" mimeType="application/x-pkcs7-certificates" />
+            <mimeMap fileExtension=".spl" mimeType="application/futuresplash" />
+            <mimeMap fileExtension=".spx" mimeType="audio/ogg" />
+            <mimeMap fileExtension=".src" mimeType="application/x-wais-source" />
+            <mimeMap fileExtension=".ssm" mimeType="application/streamingmedia" />
+            <mimeMap fileExtension=".sst" mimeType="application/vnd.ms-pki.certstore" />
+            <mimeMap fileExtension=".stl" mimeType="application/vnd.ms-pki.stl" />
+            <mimeMap fileExtension=".sv4cpio" mimeType="application/x-sv4cpio" />
+            <mimeMap fileExtension=".sv4crc" mimeType="application/x-sv4crc" />
+            <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
+            <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" />
+            <mimeMap fileExtension=".swf" mimeType="application/x-shockwave-flash" />
+            <mimeMap fileExtension=".t" mimeType="application/x-troff" />
+            <mimeMap fileExtension=".tar" mimeType="application/x-tar" />
+            <mimeMap fileExtension=".tcl" mimeType="application/x-tcl" />
+            <mimeMap fileExtension=".tex" mimeType="application/x-tex" />
+            <mimeMap fileExtension=".texi" mimeType="application/x-texinfo" />
+            <mimeMap fileExtension=".texinfo" mimeType="application/x-texinfo" />
+            <mimeMap fileExtension=".tgz" mimeType="application/x-compressed" />
+            <mimeMap fileExtension=".thmx" mimeType="application/vnd.ms-officetheme" />
+            <mimeMap fileExtension=".thn" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".tif" mimeType="image/tiff" />
+            <mimeMap fileExtension=".tiff" mimeType="image/tiff" />
+            <mimeMap fileExtension=".toc" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".tr" mimeType="application/x-troff" />
+            <mimeMap fileExtension=".trm" mimeType="application/x-msterminal" />
+            <mimeMap fileExtension=".ts" mimeType="video/vnd.dlna.mpeg-tts" />
+            <mimeMap fileExtension=".tsv" mimeType="text/tab-separated-values" />
+            <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".tts" mimeType="video/vnd.dlna.mpeg-tts" />
+            <mimeMap fileExtension=".txt" mimeType="text/plain" />
+            <mimeMap fileExtension=".u32" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".uls" mimeType="text/iuls" />
+            <mimeMap fileExtension=".ustar" mimeType="application/x-ustar" />
+            <mimeMap fileExtension=".vbs" mimeType="text/vbscript" />
+            <mimeMap fileExtension=".vcf" mimeType="text/x-vcard" />
+            <mimeMap fileExtension=".vcs" mimeType="text/plain" />
+            <mimeMap fileExtension=".vdx" mimeType="application/vnd.ms-visio.viewer" />
+            <mimeMap fileExtension=".vml" mimeType="text/xml" />
+            <mimeMap fileExtension=".vsd" mimeType="application/vnd.visio" />
+            <mimeMap fileExtension=".vss" mimeType="application/vnd.visio" />
+            <mimeMap fileExtension=".vst" mimeType="application/vnd.visio" />
+            <mimeMap fileExtension=".vsto" mimeType="application/x-ms-vsto" />
+            <mimeMap fileExtension=".vsw" mimeType="application/vnd.visio" />
+            <mimeMap fileExtension=".vsx" mimeType="application/vnd.visio" />
+            <mimeMap fileExtension=".vtx" mimeType="application/vnd.visio" />
+            <mimeMap fileExtension=".wav" mimeType="audio/wav" />
+            <mimeMap fileExtension=".wax" mimeType="audio/x-ms-wax" />
+            <mimeMap fileExtension=".wbmp" mimeType="image/vnd.wap.wbmp" />
+            <mimeMap fileExtension=".wcm" mimeType="application/vnd.ms-works" />
+            <mimeMap fileExtension=".wdb" mimeType="application/vnd.ms-works" />
+            <mimeMap fileExtension=".webm" mimeType="video/webm" />
+            <mimeMap fileExtension=".wks" mimeType="application/vnd.ms-works" />
+            <mimeMap fileExtension=".wm" mimeType="video/x-ms-wm" />
+            <mimeMap fileExtension=".wma" mimeType="audio/x-ms-wma" />
+            <mimeMap fileExtension=".wmd" mimeType="application/x-ms-wmd" />
+            <mimeMap fileExtension=".wmf" mimeType="application/x-msmetafile" />
+            <mimeMap fileExtension=".wml" mimeType="text/vnd.wap.wml" />
+            <mimeMap fileExtension=".wmlc" mimeType="application/vnd.wap.wmlc" />
+            <mimeMap fileExtension=".wmls" mimeType="text/vnd.wap.wmlscript" />
+            <mimeMap fileExtension=".wmlsc" mimeType="application/vnd.wap.wmlscriptc" />
+            <mimeMap fileExtension=".wmp" mimeType="video/x-ms-wmp" />
+            <mimeMap fileExtension=".wmv" mimeType="video/x-ms-wmv" />
+            <mimeMap fileExtension=".wmx" mimeType="video/x-ms-wmx" />
+            <mimeMap fileExtension=".wmz" mimeType="application/x-ms-wmz" />
+            <mimeMap fileExtension=".woff" mimeType="font/x-woff" />
+            <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
+            <mimeMap fileExtension=".wps" mimeType="application/vnd.ms-works" />
+            <mimeMap fileExtension=".wri" mimeType="application/x-mswrite" />
+            <mimeMap fileExtension=".wrl" mimeType="x-world/x-vrml" />
+            <mimeMap fileExtension=".wrz" mimeType="x-world/x-vrml" />
+            <mimeMap fileExtension=".wsdl" mimeType="text/xml" />
+            <mimeMap fileExtension=".wtv" mimeType="video/x-ms-wtv" />
+            <mimeMap fileExtension=".wvx" mimeType="video/x-ms-wvx" />
+            <mimeMap fileExtension=".x" mimeType="application/directx" />
+            <mimeMap fileExtension=".xaf" mimeType="x-world/x-vrml" />
+            <mimeMap fileExtension=".xaml" mimeType="application/xaml+xml" />
+            <mimeMap fileExtension=".xap" mimeType="application/x-silverlight-app" />
+            <mimeMap fileExtension=".xbap" mimeType="application/x-ms-xbap" />
+            <mimeMap fileExtension=".xbm" mimeType="image/x-xbitmap" />
+            <mimeMap fileExtension=".xdr" mimeType="text/plain" />
+            <mimeMap fileExtension=".xht" mimeType="application/xhtml+xml" />
+            <mimeMap fileExtension=".xhtml" mimeType="application/xhtml+xml" />
+            <mimeMap fileExtension=".xla" mimeType="application/vnd.ms-excel" />
+            <mimeMap fileExtension=".xlam" mimeType="application/vnd.ms-excel.addin.macroEnabled.12" />
+            <mimeMap fileExtension=".xlc" mimeType="application/vnd.ms-excel" />
+            <mimeMap fileExtension=".xlm" mimeType="application/vnd.ms-excel" />
+            <mimeMap fileExtension=".xls" mimeType="application/vnd.ms-excel" />
+            <mimeMap fileExtension=".xlsb" mimeType="application/vnd.ms-excel.sheet.binary.macroEnabled.12" />
+            <mimeMap fileExtension=".xlsm" mimeType="application/vnd.ms-excel.sheet.macroEnabled.12" />
+            <mimeMap fileExtension=".xlsx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
+            <mimeMap fileExtension=".xlt" mimeType="application/vnd.ms-excel" />
+            <mimeMap fileExtension=".xltm" mimeType="application/vnd.ms-excel.template.macroEnabled.12" />
+            <mimeMap fileExtension=".xltx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.template" />
+            <mimeMap fileExtension=".xlw" mimeType="application/vnd.ms-excel" />
+            <mimeMap fileExtension=".xml" mimeType="text/xml" />
+            <mimeMap fileExtension=".xof" mimeType="x-world/x-vrml" />
+            <mimeMap fileExtension=".xpm" mimeType="image/x-xpixmap" />
+            <mimeMap fileExtension=".xps" mimeType="application/vnd.ms-xpsdocument" />
+            <mimeMap fileExtension=".xsd" mimeType="text/xml" />
+            <mimeMap fileExtension=".xsf" mimeType="text/xml" />
+            <mimeMap fileExtension=".xsl" mimeType="text/xml" />
+            <mimeMap fileExtension=".xslt" mimeType="text/xml" />
+            <mimeMap fileExtension=".xsn" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".xtp" mimeType="application/octet-stream" />
+            <mimeMap fileExtension=".xwd" mimeType="image/x-xwindowdump" />
+            <mimeMap fileExtension=".z" mimeType="application/x-compress" />
+            <mimeMap fileExtension=".zip" mimeType="application/x-zip-compressed" />
+        </staticContent>
+
+        <tracing>
+
+            <traceFailedRequests />
+
+            <traceProviderDefinitions>
+                <add name="WWW Server" guid="{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}">
+                    <areas>
+                        <add name="ANCM" value="65536" />
+                    </areas>
+                </add>
+            </traceProviderDefinitions>
+
+        </tracing>
+
+        <urlCompression />
+
+        <validation />
+        <!--<webSocket />-->
+
+    </system.webServer>
+    <location path="" overrideMode="Allow">
+        <system.webServer>
+
+        <handlers accessPolicy="Read, Script">
+            <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
+            <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" />
+            <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
+        </handlers>
+        </system.webServer>
+    </location>
+
+</configuration>
diff --git a/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs b/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7d8d661ef043dc0adf5c3a5c119133c190d1e3a8
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs
@@ -0,0 +1,287 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Net;
+using System.Net.Http;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Extensions.Logging;
+using Xunit;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+
+namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class AppOfflineTests : IISFunctionalTestBase
+    {
+        private static readonly TimeSpan RetryDelay = TimeSpan.FromMilliseconds(100);
+
+        private readonly PublishedSitesFixture _fixture;
+
+        public AppOfflineTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [InlineData(HostingModel.InProcess)]
+        [InlineData(HostingModel.OutOfProcess)]
+        public async Task AppOfflineDroppedWhileSiteIsDown_SiteReturns503(HostingModel hostingModel)
+        {
+            var deploymentResult = await DeployApp(hostingModel);
+
+            AddAppOffline(deploymentResult.ContentRoot);
+
+            await AssertAppOffline(deploymentResult);
+            DeletePublishOutput(deploymentResult);
+        }
+
+        [ConditionalTheory]
+        [InlineData(HostingModel.InProcess)]
+        [InlineData(HostingModel.OutOfProcess)]
+        public async Task LockedAppOfflineDroppedWhileSiteIsDown_SiteReturns503(HostingModel hostingModel)
+        {
+            var deploymentResult = await DeployApp(hostingModel);
+
+            // Add app_offline without shared access
+            using (var stream = File.Open(Path.Combine(deploymentResult.ContentRoot, "app_offline.htm"), FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None))
+            using (var writer = new StreamWriter(stream))
+            {
+                await writer.WriteLineAsync("App if offline but you wouldn't see this message");
+                await writer.FlushAsync();
+                await AssertAppOffline(deploymentResult, "");
+            }
+
+            DeletePublishOutput(deploymentResult);
+        }
+
+        [ConditionalTheory]
+        [InlineData(HostingModel.InProcess, 500, "500.0")]
+        [InlineData(HostingModel.OutOfProcess, 502, "502.5")]
+        public async Task AppOfflineDroppedWhileSiteFailedToStartInShim_AppOfflineServed(HostingModel hostingModel, int statusCode, string content)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: hostingModel, publish: true);
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "nonexistent"));
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var result = await deploymentResult.HttpClient.GetAsync("/");
+            Assert.Equal(statusCode, (int)result.StatusCode);
+            Assert.Contains(content, await result.Content.ReadAsStringAsync());
+
+            AddAppOffline(deploymentResult.ContentRoot);
+
+            await AssertAppOffline(deploymentResult);
+            DeletePublishOutput(deploymentResult);
+        }
+
+        [ConditionalFact(Skip = "https://github.com/aspnet/IISIntegration/issues/933")]
+        public async Task AppOfflineDroppedWhileSiteFailedToStartInRequestHandler_SiteStops_InProcess()
+        {
+            var deploymentResult = await DeployApp(HostingModel.InProcess);
+
+            // Set file content to empty so it fails at runtime
+            File.WriteAllText(Path.Combine(deploymentResult.ContentRoot, "Microsoft.AspNetCore.Server.IIS.dll"), "");
+
+            var result = await deploymentResult.HttpClient.GetAsync("/");
+            Assert.Equal(500, (int)result.StatusCode);
+            Assert.Contains("500.30", await result.Content.ReadAsStringAsync());
+
+            AddAppOffline(deploymentResult.ContentRoot);
+
+            await deploymentResult.AssertRecycledAsync(() => AssertAppOffline(deploymentResult));
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.ShutdownToken)]
+        public async Task AppOfflineDroppedWhileSiteStarting_SiteShutsDown_InProcess()
+        {
+            // This test often hits a race between debug logging and stdout redirection closing the handle
+            // we are fine having this race
+            using (AppVerifier.Disable(DeployerSelector.ServerType, 0x300))
+            {
+                var deploymentResult = await DeployApp(HostingModel.InProcess);
+
+                for (int i = 0; i < 10; i++)
+                {
+                    // send first request and add app_offline while app is starting
+                    var runningTask = AssertAppOffline(deploymentResult);
+
+                    // This test tries to hit a race where we drop app_offline file while
+                    // in process application is starting, application start takes at least 400ms
+                    // so we back off for 100ms to allow request to reach request handler
+                    // Test itself is racy and can result in two scenarios
+                    //    1. ANCM detects app_offline before it starts the request - if AssertAppOffline succeeds we've hit it
+                    //    2. Intended scenario where app starts and then shuts down
+                    // In first case we remove app_offline and try again
+                    await Task.Delay(RetryDelay);
+
+                    AddAppOffline(deploymentResult.ContentRoot);
+
+                    try
+                    {
+                        await runningTask.DefaultTimeout();
+
+                        // if AssertAppOffline succeeded ANCM have picked up app_offline before starting the app
+                        // try again
+                        RemoveAppOffline(deploymentResult.ContentRoot);
+                    }
+                    catch
+                    {
+                        deploymentResult.AssertWorkerProcessStop();
+                        return;
+                    }
+                }
+
+                Assert.True(false);
+
+            }
+        }
+
+        [ConditionalFact]
+        public async Task AppOfflineDroppedWhileSiteRunning_SiteShutsDown_InProcess()
+        {
+            var deploymentResult = await AssertStarts(HostingModel.InProcess);
+
+            AddAppOffline(deploymentResult.ContentRoot);
+
+            await deploymentResult.AssertRecycledAsync(() => AssertAppOffline(deploymentResult));
+        }
+
+        [ConditionalFact]
+        public async Task AppOfflineDroppedWhileSiteRunning_SiteShutsDown_OutOfProcess()
+        {
+            var deploymentResult = await AssertStarts(HostingModel.OutOfProcess);
+
+            // Repeat dropping file and restarting multiple times
+            for (int i = 0; i < 5; i++)
+            {
+                AddAppOffline(deploymentResult.ContentRoot);
+                await AssertAppOffline(deploymentResult);
+                RemoveAppOffline(deploymentResult.ContentRoot);
+                await AssertRunning(deploymentResult);
+            }
+
+            AddAppOffline(deploymentResult.ContentRoot);
+            await AssertAppOffline(deploymentResult);
+            DeletePublishOutput(deploymentResult);
+        }
+
+        [ConditionalTheory]
+        [InlineData(HostingModel.InProcess)]
+        [InlineData(HostingModel.OutOfProcess)]
+        public async Task AppOfflineDropped_CanRemoveAppOfflineAfterAddingAndSiteWorks(HostingModel hostingModel)
+        {
+            var deploymentResult = await DeployApp(hostingModel);
+
+            AddAppOffline(deploymentResult.ContentRoot);
+
+            await AssertAppOffline(deploymentResult);
+
+            RemoveAppOffline(deploymentResult.ContentRoot);
+
+            await AssertRunning(deploymentResult);
+        }
+
+        [ConditionalTheory]
+        [InlineData(HostingModel.InProcess)]
+        [InlineData(HostingModel.OutOfProcess)]
+        public async Task AppOfflineAddedAndRemovedStress(HostingModel hostingModel)
+        {
+            var deploymentResult = await AssertStarts(hostingModel);
+
+            var load = Helpers.StressLoad(deploymentResult.HttpClient, "/HelloWorld", response => {
+                var statusCode = (int)response.StatusCode;
+                Assert.True(statusCode == 200 || statusCode == 503, "Status code was " + statusCode);
+            });
+
+            for (int i = 0; i < 100; i++)
+            {
+                // AddAppOffline might fail if app_offline is being read by ANCM and deleted at the same time
+                RetryHelper.RetryOperation(
+                    () => AddAppOffline(deploymentResult.ContentRoot),
+                    e => Logger.LogError($"Failed to create app_offline : {e.Message}"),
+                    retryCount: 3,
+                    retryDelayMilliseconds: RetryDelay.Milliseconds);
+                RemoveAppOffline(deploymentResult.ContentRoot);
+            }
+
+            try
+            {
+                await load;
+            }
+            catch (HttpRequestException ex) when (ex.InnerException is IOException | ex.InnerException is SocketException)
+            {
+                // IOException in InProcess is fine, just means process stopped
+                if (hostingModel != HostingModel.InProcess)
+                {
+                    throw;
+                }
+            }
+        }
+
+        private async Task<IISDeploymentResult> DeployApp(HostingModel hostingModel = HostingModel.InProcess)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: hostingModel, publish: true);
+
+            return await DeployAsync(deploymentParameters);
+        }
+
+        private void AddAppOffline(string appPath, string content = "The app is offline.")
+        {
+            File.WriteAllText(Path.Combine(appPath, "app_offline.htm"), content);
+        }
+
+        private void RemoveAppOffline(string appPath)
+        {
+            RetryHelper.RetryOperation(
+                () => File.Delete(Path.Combine(appPath, "app_offline.htm")),
+                e => Logger.LogError($"Failed to remove app_offline : {e.Message}"),
+                retryCount: 3,
+                retryDelayMilliseconds: RetryDelay.Milliseconds);
+        }
+
+        private async Task AssertAppOffline(IISDeploymentResult deploymentResult, string expectedResponse = "The app is offline.")
+        {
+            var response = await deploymentResult.HttpClient.RetryRequestAsync("HelloWorld", r => r.StatusCode == HttpStatusCode.ServiceUnavailable);
+            Assert.Equal(expectedResponse, await response.Content.ReadAsStringAsync());
+        }
+
+        private async Task<IISDeploymentResult> AssertStarts(HostingModel hostingModel)
+        {
+            var deploymentResult = await DeployApp(hostingModel);
+
+            await AssertRunning(deploymentResult);
+
+            return deploymentResult;
+        }
+
+        private static async Task AssertRunning(IISDeploymentResult deploymentResult)
+        {
+            var response = await deploymentResult.HttpClient.RetryRequestAsync("HelloWorld", r => r.IsSuccessStatusCode);
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal("Hello World", responseText);
+        }
+
+        private void DeletePublishOutput(IISDeploymentResult deploymentResult)
+        {
+            foreach (var file in Directory.GetFiles(deploymentResult.ContentRoot, "*", SearchOption.AllDirectories))
+            {
+                // Out of process module dll is allowed to be locked
+                var name = Path.GetFileName(file);
+                if (name == "aspnetcore.dll" || name == "aspnetcorev2.dll" || name == "aspnetcorev2_outofprocess.dll")
+                {
+                    continue;
+                }
+                File.Delete(file);
+            }
+        }
+
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs b/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d8607db21ed27da1ba8ac0919dbab15efb7ff0ff
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs
@@ -0,0 +1,70 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class BasicAuthTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public BasicAuthTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22)
+                .WithApplicationTypes(ApplicationType.Portable)
+                .WithAllAncmVersions()
+                .WithAllHostingModels();
+
+        [ConditionalTheory]
+        [RequiresEnvironmentVariable("ASPNETCORE_MODULE_TEST_USER")]
+        [RequiresIIS(IISCapability.BasicAuthentication)]
+        [MemberData(nameof(TestVariants))]
+        public async Task BasicAuthTest(TestVariant variant)
+        {
+            var username = Environment.GetEnvironmentVariable("ASPNETCORE_MODULE_TEST_USER");
+            var password = Environment.GetEnvironmentVariable("ASPNETCORE_MODULE_TEST_PASSWORD");
+
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            deploymentParameters.SetAnonymousAuth(enabled: false);
+            deploymentParameters.SetWindowsAuth(enabled: false);
+            deploymentParameters.SetBasicAuth(enabled: true);
+
+            // The default in hosting sets windows auth to true.
+            var deploymentResult = await DeployAsync(deploymentParameters);
+            var request = new HttpRequestMessage(HttpMethod.Get, "/Auth");
+            var byteArray = new UTF8Encoding().GetBytes(username + ":" + password);
+            request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
+
+            var response = await deploymentResult.HttpClient.SendAsync(request);
+
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            if (variant.HostingModel == HostingModel.InProcess)
+            {
+                Assert.StartsWith("Windows", responseText);
+                Assert.Contains(username, responseText);
+            }
+            else
+            {
+                // We expect out-of-proc not allowing basic auth
+                Assert.Equal("Windows", responseText);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs b/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs
new file mode 100644
index 0000000000000000000000000000000000000000..40b6f2265e5bc6307d854ad050eaa734b078fb5b
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs
@@ -0,0 +1,104 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Security.Cryptography;
+using System.Security.Cryptography.X509Certificates;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public class ClientCertificateFixture : IDisposable
+    {
+        private X509Certificate2 _certificate;
+        private const string _certIssuerPrefix = "CN=IISIntegrationTest_Root";
+
+        public X509Certificate2 GetOrCreateCertificate()
+        {
+            if (_certificate != null)
+            {
+                return _certificate;
+            }
+
+            using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
+            {
+                store.Open(OpenFlags.ReadWrite);
+                var parentKey = CreateKeyMaterial(2048);
+
+                // Create a cert name with a random guid to avoid name conflicts
+                var parentRequest = new CertificateRequest(
+                    _certIssuerPrefix + Guid.NewGuid().ToString(),
+                    parentKey, HashAlgorithmName.SHA256,
+                    RSASignaturePadding.Pkcs1);
+
+                parentRequest.CertificateExtensions.Add(
+                    new X509BasicConstraintsExtension(
+                        certificateAuthority: true,
+                        hasPathLengthConstraint: false,
+                        pathLengthConstraint: 0,
+                        critical: true));
+
+                parentRequest.CertificateExtensions.Add(
+                    new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation, critical: true));
+
+                parentRequest.CertificateExtensions.Add(
+                    new X509SubjectKeyIdentifierExtension(parentRequest.PublicKey, false));
+
+                var notBefore = DateTimeOffset.Now.AddDays(-1);
+                var notAfter = DateTimeOffset.Now.AddYears(5);
+
+                var parentCert = parentRequest.CreateSelfSigned(notBefore, notAfter);
+
+                // Need to export/import the certificate to associate the private key with the cert.
+                var imported = parentCert;
+
+                var export = parentCert.Export(X509ContentType.Pkcs12, "");
+                imported = new X509Certificate2(export, "", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
+                Array.Clear(export, 0, export.Length);
+
+                // Add the cert to the cert store
+                _certificate = imported;
+
+                store.Add(certificate: imported);
+                store.Close();
+                return imported;
+            }
+        }
+
+        public void Dispose()
+        {
+            if (_certificate == null)
+            {
+                return;
+            }
+
+            using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
+            {
+                store.Open(OpenFlags.ReadWrite);
+                store.Remove(_certificate);
+
+                // Remove any extra certs that were left by previous tests.
+                for (var i = store.Certificates.Count - 1; i >= 0; i--)
+                {
+                    var cert = store.Certificates[i];
+                    if (cert.Issuer.StartsWith(_certIssuerPrefix))
+                    {
+                        store.Remove(cert);
+                    }
+                }
+                store.Close();
+            }
+        }
+
+        private RSA CreateKeyMaterial(int minimumKeySize)
+        {
+            var rsa = RSA.Create(minimumKeySize);
+            if (rsa.KeySize < minimumKeySize)
+            {
+                throw new InvalidOperationException($"Failed to create a key with a size of {minimumKeySize} bits");
+            }
+
+            return rsa;
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs b/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..43ccc83eff04414603bec4d9385e602ec2e8e428
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs
@@ -0,0 +1,108 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Net.Http;
+using System.Security.Cryptography.X509Certificates;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.Common;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Extensions.Logging;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    [SkipIfNotAdmin]
+    public class ClientCertificateTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+        private readonly ClientCertificateFixture _certFixture;
+
+        public ClientCertificateTests(PublishedSitesFixture fixture, ClientCertificateFixture certFixture)
+        {
+            _fixture = fixture;
+            _certFixture = certFixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22, Tfm.Net461)
+                .WithAllApplicationTypes()
+                .WithAllAncmVersions()
+                .WithAllHostingModels();
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public Task HttpsNoClientCert_NoClientCert(TestVariant variant)
+        {
+            return ClientCertTest(variant, sendClientCert: false);
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public Task HttpsClientCert_GetCertInformation(TestVariant variant)
+        {
+            return ClientCertTest(variant, sendClientCert: true);
+        }
+
+        private async Task ClientCertTest(TestVariant variant, bool sendClientCert)
+        {
+            var port = TestPortHelper.GetNextSSLPort();
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
+            deploymentParameters.ApplicationBaseUriHint = $"https://localhost:{port}/";
+            deploymentParameters.AddHttpsToServerConfig();
+
+            var handler = new HttpClientHandler
+            {
+                ServerCertificateCustomValidationCallback = (a, b, c, d) => true,
+                ClientCertificateOptions = ClientCertificateOption.Manual,
+            };
+
+            X509Certificate2 cert = null;
+            if (sendClientCert)
+            {
+                cert = _certFixture.GetOrCreateCertificate();
+                handler.ClientCertificates.Add(cert);
+            }
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var client = deploymentResult.CreateClient(handler);
+            var response = await client.GetAsync("GetClientCert");
+
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            try
+            {
+                if (sendClientCert)
+                {
+                    Assert.Equal($"Enabled;{cert.GetCertHashString()}", responseText);
+                }
+                else
+                {
+                    Assert.Equal("Disabled", responseText);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.LogError($"Certificate is invalid. Issuer name: {cert.Issuer}");
+                using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
+                {
+                    Logger.LogError($"List of current certificates in root store:");
+                    store.Open(OpenFlags.ReadWrite);
+                    foreach (var otherCert in store.Certificates)
+                    {
+                        Logger.LogError(otherCert.Issuer);
+                    }
+                    store.Close();
+                }
+                throw ex;
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs b/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9deeae3f927e68bd81f02ce4990c5f1a647c1208
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs
@@ -0,0 +1,65 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class ClientDisconnectStressTests: FunctionalTestsBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public ClientDisconnectStressTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [InlineData(HostingModel.InProcess)]
+        [InlineData(HostingModel.OutOfProcess)]
+        public async Task ClientDisconnectStress(HostingModel hostingModel)
+        {
+            var site = await StartAsync(_fixture.GetBaseDeploymentParameters(hostingModel));
+            var maxRequestSize = 1000;
+            var blockSize = 40;
+            var random = new Random();
+            async Task RunRequests()
+            {
+                using (var connection = new TestConnection(site.HttpClient.BaseAddress.Port))
+                {
+                    await connection.Send(
+                        "POST /ReadAndFlushEcho HTTP/1.1",
+                        $"Content-Length: {maxRequestSize}",
+                        "Host: localhost",
+                        "Connection: close",
+                        "",
+                        "");
+
+                    var disconnectAfter = random.Next(maxRequestSize);
+                    var data = new byte[blockSize];
+                    for (int i = 0; i < disconnectAfter / blockSize; i++)
+                    {
+                        await connection.Stream.WriteAsync(data);
+                    }
+                }
+            }
+
+            List<Task> tasks = new List<Task>();
+            for (int i = 0; i < 100; i++)
+            {
+                tasks.Add(Task.Run(RunRequests));
+            }
+
+            await Task.WhenAll(tasks);
+
+            StopServer();
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs b/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e2bcf2a8f95220b41e1f9fb50f199d302f2cadf2
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs
@@ -0,0 +1,44 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class CommonStartupTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public CommonStartupTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22)
+                .WithAllApplicationTypes()
+                .WithAllAncmVersions()
+                .WithAllHostingModels();
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task StartupStress(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await Helpers.StressLoad(deploymentResult.HttpClient, "/HelloWorld", response => {
+                Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+                Assert.Equal("Hello World", response.Content.ReadAsStringAsync().GetAwaiter().GetResult());
+            });
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c2d0277c4c677facff3fd5d1c5eeacde3b1dbfea
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs
@@ -0,0 +1,58 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Linq;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISCompressionSiteCollection.Name)]
+    public abstract class CompressionTests : FixtureLoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        [Collection(IISTestSiteCollection.Name)]
+        public class InProc: CompressionTests
+        {
+            public InProc(IISTestSiteFixture fixture) : base(fixture) { }
+        }
+
+        [Collection(OutOfProcessTestSiteCollection.Name)]
+        public class OutOfProcess: CompressionTests
+        {
+            public OutOfProcess(OutOfProcessTestSiteFixture fixture) : base(fixture) { }
+        }
+
+        [Collection(OutOfProcessV1TestSiteCollection.Name)]
+        public class OutOfProcessV1: CompressionTests
+        {
+            public OutOfProcessV1(OutOfProcessV1TestSiteFixture fixture) : base(fixture) { }
+        }
+
+        protected CompressionTests(IISTestSiteFixture fixture) : base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task PassesThroughCompression()
+        {
+            var request = new HttpRequestMessage(HttpMethod.Get, "/CompressedData");
+
+            request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
+
+            var response = await _fixture.Client.SendAsync(request);
+            Assert.Equal("gzip", response.Content.Headers.ContentEncoding.Single());
+            Assert.Equal(
+                new byte[] {
+                    0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x04, 0x0B, 0x63, 0x60, 0xA0, 0x3D, 0x00, 0x00,
+                    0xCA, 0xC6, 0x88, 0x99, 0x64, 0x00, 0x00, 0x00 },
+                await response.Content.ReadAsByteArrayAsync());
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs b/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..099cefb97a94f431f413bf4d4016331f33035f1e
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs
@@ -0,0 +1,126 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Extensions.Logging;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class ConfigurationChangeTests : IISFunctionalTestBase
+    {
+        private static readonly TimeSpan RetryDelay = TimeSpan.FromMilliseconds(100);
+        private readonly PublishedSitesFixture _fixture;
+
+        public ConfigurationChangeTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task ConfigurationChangeStopsInProcess()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.InProcess, publish: true);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await deploymentResult.AssertStarts();
+
+            // Just "touching" web.config should be enough
+            deploymentResult.ModifyWebConfig(element => {});
+
+            await deploymentResult.AssertRecycledAsync();
+        }
+
+        [ConditionalTheory]
+        [InlineData(AncmVersion.AspNetCoreModule)]
+        [InlineData(AncmVersion.AspNetCoreModuleV2)]
+        public async Task ConfigurationChangeForcesChildProcessRestart(AncmVersion version)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
+            deploymentParameters.AncmVersion = version;
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var processBefore = await deploymentResult.HttpClient.GetStringAsync("/ProcessId");
+
+            // Just "touching" web.config should be enough
+            deploymentResult.ModifyWebConfig(element => {});
+
+            // Have to retry here to allow ANCM to receive notification and react to it
+            // Verify that worker process gets restarted with new process id
+            await deploymentResult.HttpClient.RetryRequestAsync("/ProcessId", async r => await r.Content.ReadAsStringAsync() != processBefore);
+        }
+
+        [ConditionalFact]
+        public async Task OutOfProcessToInProcessHostingModelSwitchWorks()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await deploymentResult.AssertStarts();
+
+            deploymentResult.ModifyWebConfig(element => element
+                .Descendants("system.webServer")
+                .Single()
+                .GetOrAdd("aspNetCore")
+                .SetAttributeValue("hostingModel", "inprocess"));
+
+            // Have to retry here to allow ANCM to receive notification and react to it
+            // Verify that inprocess application was created and tried to start
+            await deploymentResult.HttpClient.RetryRequestAsync("/HelloWorld", r => r.StatusCode == HttpStatusCode.InternalServerError);
+
+            StopServer();
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Could not find the assembly 'aspnetcorev2_inprocess.dll'", Logger);
+        }
+
+        [ConditionalTheory]
+        [InlineData(HostingModel.InProcess)]
+        [InlineData(HostingModel.OutOfProcess)]
+        public async Task ConfigurationTouchedStress(HostingModel hostingModel)
+        {
+            var deploymentResult = await DeployAsync(_fixture.GetBaseDeploymentParameters(hostingModel, publish: true));
+
+            await deploymentResult.AssertStarts();
+            var load = Helpers.StressLoad(deploymentResult.HttpClient, "/HelloWorld", response => {
+                var statusCode = (int)response.StatusCode;
+                Assert.True(statusCode == 200 || statusCode == 503, "Status code was " + statusCode);
+            });
+
+            for (int i = 0; i < 100; i++)
+            {
+                // ModifyWebConfig might fail if web.config is being read by IIS
+                RetryHelper.RetryOperation(
+                    () => deploymentResult.ModifyWebConfig(element => {}),
+                    e => Logger.LogError($"Failed to touch web.config : {e.Message}"),
+                    retryCount: 3,
+                    retryDelayMilliseconds: RetryDelay.Milliseconds);
+            }
+
+            try
+            {
+                await load;
+            }
+            catch (HttpRequestException ex) when (ex.InnerException is IOException | ex.InnerException is SocketException)
+            {
+                // IOException in InProcess is fine, just means process stopped
+                if (hostingModel != HostingModel.InProcess)
+                {
+                    throw;
+                }
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6e2d1bc7521c298da8e398ba16d920dbf5849fbc
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs
@@ -0,0 +1,108 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Extensions.Logging;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class ClientDisconnectTests: FixtureLoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public ClientDisconnectTests(IISTestSiteFixture fixture): base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task ServerWorksAfterClientDisconnect()
+        {
+            using (var connection = _fixture.CreateTestConnection())
+            {
+                var message = "Hello";
+                await connection.Send(
+                    "POST /ReadAndWriteSynchronously HTTP/1.1",
+                    $"Content-Length: {100000}",
+                    "Host: localhost",
+                    "Connection: close",
+                    "",
+                    "");
+
+                await connection.Send(message);
+
+                await connection.Receive(
+                    "HTTP/1.1 200 OK",
+                    "");
+            }
+
+            var response = await _fixture.Client.GetAsync("HelloWorld");
+
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal("Hello World", responseText);
+        }
+
+        [ConditionalFact]
+        public async Task RequestAbortedTokenFires()
+        {
+            using (var connection = _fixture.CreateTestConnection())
+            {
+                await connection.Send(
+                    "GET /WaitForAbort HTTP/1.1",
+                    "Host: localhost",
+                    "Connection: close",
+                    "",
+                    "");
+
+                await _fixture.Client.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() == "1");
+            }
+
+            await _fixture.Client.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() == "0");
+        }
+
+        [ConditionalFact]
+        public async Task ClientDisconnectCallbackStress()
+        {
+            // Fixture initialization fails if inside of the Task.Run, so send an
+            // initial request to initialize the fixture.
+            var response = await _fixture.Client.GetAsync("HelloWorld");
+            var numTotalRequests = 0;
+            for (var j = 0; j < 20; j++)
+            {
+                // Windows has a max connection limit of 10 for the IIS server,
+                // so setting limit fairly low. 
+                const int numRequests = 5;
+                async Task RunRequests()
+                {
+                    using (var connection = _fixture.CreateTestConnection())
+                    {
+                        await connection.Send(
+                            "GET /WaitForAbort HTTP/1.1",
+                            "Host: localhost",
+                            "Connection: close",
+                            "",
+                            "");
+                        await _fixture.Client.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() != "0");
+                        Interlocked.Increment(ref numTotalRequests);
+                    }
+                }
+
+                List<Task> tasks = new List<Task>();
+                for (int i = 0; i < numRequests; i++)
+                {
+                    tasks.Add(Task.Run(RunRequests));
+                }
+
+                await Task.WhenAll(tasks);
+
+                await _fixture.Client.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() == "0");
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ce1c84e6099aa7d603488e08496c9ecee4a2e8d8
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs
@@ -0,0 +1,96 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISCompressionSiteCollection.Name)]
+    public class CompressionModuleTests : FixtureLoggedTest
+    {
+        private readonly IISCompressionSiteFixture _fixture;
+
+        public CompressionModuleTests(IISCompressionSiteFixture fixture): base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.DynamicCompression)]
+        [InlineData(true)]
+        [InlineData(false)]
+        public async Task BufferingDisabled(bool compression)
+        {
+            using (var connection = _fixture.CreateTestConnection())
+            {
+                var requestLength = 0;
+                var messages = new List<string>();
+                for (var i = 1; i < 100; i++)
+                {
+                    var message = i + Environment.NewLine;
+                    requestLength += message.Length;
+                    messages.Add(message);
+                }
+
+                await connection.Send(
+                    "POST /ReadAndWriteEchoLinesNoBuffering HTTP/1.1",
+                    $"Content-Length: {requestLength}",
+                    "Accept-Encoding: " + (compression ? "gzip": "identity"),
+                    "Response-Content-Type: text/event-stream",
+                    "Host: localhost",
+                    "Connection: close",
+                    "",
+                    "");
+
+                await connection.Receive(
+                    "HTTP/1.1 200 OK",
+                    "");
+                await connection.ReceiveHeaders();
+
+                foreach (var message in messages)
+                {
+                    await connection.Send(message);
+                    await connection.ReceiveChunk(message);
+                }
+
+                await connection.Send("\r\n");
+                await connection.ReceiveChunk("");
+                await connection.WaitForConnectionClose();
+            }
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.DynamicCompression)]
+        public async Task DynamicResponsesAreCompressed()
+        {
+            var handler = new HttpClientHandler
+            {
+                AutomaticDecompression = DecompressionMethods.GZip
+            };
+            var client = new HttpClient(handler)
+            {
+                BaseAddress = _fixture.Client.BaseAddress,
+            };
+            client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
+            client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("identity", 0));
+            client.DefaultRequestHeaders.Add("Response-Content-Type", "text/event-stream");
+            var messages = "Message1\r\nMessage2\r\n";
+
+            // Send messages with terminator
+            var response = await client.PostAsync("ReadAndWriteEchoLines", new StringContent(messages + "\r\n"));
+            Assert.Equal(messages, await response.Content.ReadAsStringAsync());
+            Assert.True(response.Content.Headers.TryGetValues("Content-Type", out var contentTypes));
+            Assert.Single(contentTypes, "text/event-stream");
+            // Not the cleanest check but I wasn't able to figure out other way to check
+            // that response was compressed
+            Assert.Contains("gzip", response.Content.GetType().FullName, StringComparison.OrdinalIgnoreCase);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ae8fde39edad5088b6f8aeb177666de192c75662
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs
@@ -0,0 +1,51 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class EnvironmentVariableTests: FixtureLoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public EnvironmentVariableTests(IISTestSiteFixture fixture): base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task GetUniqueEnvironmentVariable()
+        {
+            Assert.Equal("foobar", await _fixture.Client.GetStringAsync("/CheckEnvironmentVariable"));
+        }
+
+        [ConditionalFact]
+        public async Task GetLongEnvironmentVariable()
+        {
+            Assert.Equal(
+                "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" +
+                "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" +
+                "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" +
+                "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" +
+                "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" +
+                "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative",
+                await _fixture.Client.GetStringAsync("/CheckEnvironmentLongValueVariable"));
+        }
+
+        [ConditionalFact]
+        public async Task GetExistingEnvironmentVariable()
+        {
+            Assert.Contains(";foobarbaz", await _fixture.Client.GetStringAsync("/CheckAppendedEnvironmentVariable"));
+        }
+
+        [ConditionalFact]
+        public async Task AuthHeaderEnvironmentVariableRemoved()
+        {
+            Assert.DoesNotContain("shouldberemoved", await _fixture.Client.GetStringAsync("/CheckRemoveAuthEnvironmentVariable"));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bf45949491a3b7ff85a9cf8bcdbfa9d75486a657
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs
@@ -0,0 +1,131 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class ErrorPagesTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public ErrorPagesTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        public async Task IncludesAdditionalErrorPageTextInProcessHandlerLoadFailure_CorrectString()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            var response = await DeployAppWithStartupFailure(deploymentParameters);
+
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            var responseString = await response.Content.ReadAsStringAsync();
+            Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", responseString);
+            VerifyNoExtraTrailingBytes(responseString);
+
+            await AssertLink(response);
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        public async Task IncludesAdditionalErrorPageTextOutOfProcessStartupFailure_CorrectString()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
+            var response = await DeployAppWithStartupFailure(deploymentParameters);
+
+            Assert.Equal(HttpStatusCode.BadGateway, response.StatusCode);
+
+            StopServer();
+
+            var responseString = await response.Content.ReadAsStringAsync();
+            Assert.Contains("HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure", responseString);
+            VerifyNoExtraTrailingBytes(responseString);
+
+            await AssertLink(response);
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        public async Task IncludesAdditionalErrorPageTextOutOfProcessHandlerLoadFailure_CorrectString()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
+            deploymentParameters.HandlerSettings["handlerVersion"] = "88.93";
+            deploymentParameters.EnvironmentVariables["ANCM_ADDITIONAL_ERROR_PAGE_LINK"] = "http://example";
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+            var response = await deploymentResult.HttpClient.GetAsync("HelloWorld");
+
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            var responseString = await response.Content.ReadAsStringAsync();
+            Assert.Contains("HTTP Error 500.0 - ANCM Out-Of-Process Handler Load Failure", responseString);
+            VerifyNoExtraTrailingBytes(responseString);
+
+            await AssertLink(response);
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        [RequiresNewHandler]
+        public async Task IncludesAdditionalErrorPageTextInProcessStartupFailure_CorrectString()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} EarlyReturn");
+            deploymentParameters.EnvironmentVariables["ANCM_ADDITIONAL_ERROR_PAGE_LINK"] = "http://example";
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+            var response = await deploymentResult.HttpClient.GetAsync("HelloWorld");
+
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            var responseString = await response.Content.ReadAsStringAsync();
+            Assert.Contains("HTTP Error 500.30 - ANCM In-Process Start Failure", responseString);
+            VerifyNoExtraTrailingBytes(responseString);
+
+            await AssertLink(response);
+        }
+
+        private static void VerifyNoExtraTrailingBytes(string responseString)
+        {
+            if (!DeployerSelector.IsBackwardsCompatiblityTest)
+            {
+                Assert.EndsWith("</html>\r\n", responseString);
+            }
+        }
+
+        private static async Task AssertLink(HttpResponseMessage response)
+        {
+            Assert.Contains("<a href=\"http://example\"> <cite> http://example </cite></a> and ", await response.Content.ReadAsStringAsync());
+        }
+
+        private async Task<HttpResponseMessage> DeployAppWithStartupFailure(IISDeploymentParameters deploymentParameters)
+        {
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "doesnot"));
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("arguments", "start"));
+
+            deploymentParameters.EnvironmentVariables["ANCM_ADDITIONAL_ERROR_PAGE_LINK"] = "http://example";
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            return await deploymentResult.HttpClient.GetAsync("HelloWorld");
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1df7f3c077fd1fe95659446b75adf23abaf6f016
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs
@@ -0,0 +1,46 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class EventLogTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public EventLogTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task CheckStartupEventLogMessage()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            
+            var deploymentResult = await DeployAsync(deploymentParameters);
+            await deploymentResult.AssertStarts();
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Application '.+' started the coreclr in-process successfully.");
+        }
+
+        [ConditionalFact]
+        public async Task CheckShutdownEventLogMessage()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            var deploymentResult = await DeployAsync(deploymentParameters);
+            await deploymentResult.AssertStarts();
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Application '.+' has shutdown.");
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e31dc3dbaa08e88f520f67471746e049f9c1e22d
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs
@@ -0,0 +1,29 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class FeatureCollectionTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public FeatureCollectionTest(IISTestSiteFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [InlineData("FeatureCollectionSetRequestFeatures")]
+        [InlineData("FeatureCollectionSetResponseFeatures")]
+        [InlineData("FeatureCollectionSetConnectionFeatures")]
+        public async Task FeatureCollectionTest_SetHttpContextFeatures(string path)
+        {
+            Assert.Equal("Success", await _fixture.Client.GetStringAsync(path + "/path" + "?query"));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..705af2b213c820e268966fd1a09b609f8eadd3a4
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs
@@ -0,0 +1,31 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Reflection;
+using Microsoft.Extensions.Logging.Testing;
+using Xunit.Abstractions;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public class FixtureLoggedTest: LoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public FixtureLoggedTest(IISTestSiteFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public override void Initialize(MethodInfo methodInfo, object[] testMethodArguments, ITestOutputHelper testOutputHelper)
+        {
+            base.Initialize(methodInfo, testMethodArguments, testOutputHelper);
+            _fixture.Attach(this);
+        }
+
+        public override void Dispose()
+        {
+            _fixture.Detach(this);
+            base.Dispose();
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..12e2f6ae53ca7e08c0d0ece27959d7c06641f552
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs
@@ -0,0 +1,181 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Extensions.Logging;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class FrebTests : LogFileTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+        public FrebTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static IList<FrebLogItem> FrebChecks()
+        {
+            var list = new List<FrebLogItem>();
+            list.Add(new FrebLogItem("ANCM_INPROC_EXECUTE_REQUEST_START"));
+            list.Add(new FrebLogItem("ANCM_INPROC_EXECUTE_REQUEST_COMPLETION", "1"));
+            list.Add(new FrebLogItem("ANCM_INPROC_ASYNC_COMPLETION_START"));
+            list.Add(new FrebLogItem("ANCM_INPROC_ASYNC_COMPLETION_COMPLETION", "0"));
+            list.Add(new FrebLogItem("ANCM_INPROC_MANAGED_REQUEST_COMPLETION"));
+            return list;
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.FailedRequestTracingModule)]
+        public async Task CheckCommonFrebEvents()
+        {
+            var result = await SetupFrebApp();
+
+            await result.HttpClient.GetAsync("HelloWorld");
+
+            StopServer();
+
+            AssertFrebLogs(result, FrebChecks());
+        }
+
+        [ConditionalFact]
+        [RequiresNewShim]
+        [RequiresIIS(IISCapability.FailedRequestTracingModule)]
+        public async Task FrebIncludesHResultFailures()
+        {
+            var parameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            parameters.TransformArguments((args, _) => string.Empty);
+            var result = await SetupFrebApp(parameters);
+
+            await result.HttpClient.GetAsync("HelloWorld");
+
+            StopServer();
+
+            AssertFrebLogs(result, new FrebLogItem("ANCM_HRESULT_FAILED"), new FrebLogItem("ANCM_EXCEPTION_CAUGHT"));
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.FailedRequestTracingModule)]
+        public async Task CheckFailedRequestEvents()
+        {
+            var result = await SetupFrebApp();
+
+            await result.HttpClient.GetAsync("Throw");
+
+            StopServer();
+
+            AssertFrebLogs(result, new FrebLogItem("ANCM_INPROC_ASYNC_COMPLETION_COMPLETION", "2"));
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.FailedRequestTracingModule)]
+        public async Task CheckFrebDisconnect()
+        {
+            var result = await SetupFrebApp();
+
+            using (var connection = new TestConnection(result.HttpClient.BaseAddress.Port))
+            {
+                await connection.Send(
+                    "GET /WaitForAbort HTTP/1.1",
+                    "Host: localhost",
+                    "Connection: close",
+                    "",
+                    "");
+                await result.HttpClient.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() == "1");
+            }
+
+            StopServer();
+
+            // The order of freb logs is based on when the requests are complete.
+            // This is non-deterministic here, so we need to check both freb files for a request that was disconnected.
+            AssertFrebLogs(result, new FrebLogItem("ANCM_INPROC_REQUEST_DISCONNECT"), new FrebLogItem("ANCM_INPROC_MANAGED_REQUEST_COMPLETION"));
+        }
+
+        private async Task<IISDeploymentResult> SetupFrebApp(IISDeploymentParameters parameters = null)
+        {
+            parameters = parameters ?? _fixture.GetBaseDeploymentParameters(publish: true);
+            parameters.EnableFreb("Verbose", _logFolderPath);
+
+            Directory.CreateDirectory(_logFolderPath);
+            var result = await DeployAsync(parameters);
+            return result;
+        }
+
+        private void AssertFrebLogs(IISDeploymentResult result, params FrebLogItem[] expectedFrebEvents)
+        {
+            AssertFrebLogs(result, (IEnumerable<FrebLogItem>)expectedFrebEvents);
+        }
+
+        private void AssertFrebLogs(IISDeploymentResult result, IEnumerable<FrebLogItem> expectedFrebEvents)
+        {
+            var frebEvent = GetFrebLogItems(result);
+            foreach (var expectedEvent in expectedFrebEvents)
+            {
+                Assert.Contains(expectedEvent, frebEvent);
+            }
+        }
+
+        private IEnumerable<FrebLogItem> GetFrebLogItems(IISDeploymentResult result)
+        {
+            var folderPath = Helpers.GetFrebFolder(_logFolderPath, result);
+            var xmlFiles = Directory.GetFiles(folderPath).Where(f => f.EndsWith("xml"));
+            var frebEvents = new List<FrebLogItem>();
+
+            foreach (var xmlFile in xmlFiles)
+            {
+                var xDocument = XDocument.Load(xmlFile).Root;
+                var nameSpace = (XNamespace)"http://schemas.microsoft.com/win/2004/08/events/event";
+                var eventElements = xDocument.Descendants(nameSpace + "Event");
+                foreach (var eventElement in eventElements)
+                {
+                    var eventElementWithOpCode = eventElement.Descendants(nameSpace + "RenderingInfo").Single().Descendants(nameSpace + "Opcode").Single();
+                    var requestStatus = eventElement.Element(nameSpace + "EventData").Descendants().Where(el => el.Attribute("Name").Value == "requestStatus").SingleOrDefault();
+                    frebEvents.Add(new FrebLogItem(eventElementWithOpCode.Value, requestStatus?.Value));
+                }
+            }
+
+            return frebEvents;
+        }
+
+        public class FrebLogItem
+        {
+            private string _opCode;
+            private string _requestStatus;
+
+            public FrebLogItem(string opCode)
+            {
+                _opCode = opCode;
+            }
+
+            public FrebLogItem(string opCode, string requestStatus)
+            {
+                _opCode = opCode;
+                _requestStatus = requestStatus;
+            }
+
+            public override bool Equals(object obj)
+            {
+                var item = obj as FrebLogItem;
+                return item != null &&
+                       _opCode == item._opCode &&
+                       _requestStatus == item._requestStatus;
+            }
+
+            public override int GetHashCode()
+            {
+                return HashCode.Combine(_opCode, _requestStatus);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1b2ad70600114759f74e0e189987e3c5348cc0c9
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs
@@ -0,0 +1,30 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class HelloWorldInProcessTests
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public HelloWorldInProcessTests(IISTestSiteFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task HelloWorld_InProcess()
+        {
+            Assert.Equal("Hello World", await _fixture.Client.GetStringAsync("/HelloWorld"));
+
+            Assert.Equal("/Path??", await _fixture.Client.GetStringAsync("/HelloWorld/Path%3F%3F?query"));
+
+            Assert.Equal("?query", await _fixture.Client.GetStringAsync("/HelloWorld/Query%3F%3F?query"));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..061b828a6cc1324f54917c275eb83832eee0d066
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs
@@ -0,0 +1,33 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class HostingEnvironmentTests: FixtureLoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public HostingEnvironmentTests(IISTestSiteFixture fixture): base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.ShutdownToken)]
+        public async Task HostingEnvironmentIsCorrect()
+        {
+            Assert.Equal(
+                $"ContentRootPath {_fixture.DeploymentResult.ContentRoot}" + Environment.NewLine +
+                $"WebRootPath {_fixture.DeploymentResult.ContentRoot}\\wwwroot" + Environment.NewLine +
+                $"CurrentDirectory {Path.GetDirectoryName(_fixture.DeploymentResult.HostProcess.MainModule.FileName)}",
+                await _fixture.Client.GetStringAsync("/HostingEnvironment"));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..95c05308bd122610c2e9c0c6a7ce29ee42235703
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs
@@ -0,0 +1,84 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class InvalidReadWriteOperationTests
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public InvalidReadWriteOperationTests(IISTestSiteFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task TestReadOffsetWorks()
+        {
+            var result = await _fixture.Client.PostAsync($"/TestReadOffsetWorks", new StringContent("Hello World"));
+            Assert.Equal("Hello World", await result.Content.ReadAsStringAsync());
+        }
+
+        [ConditionalTheory]
+        [InlineData("/InvalidOffsetSmall")]
+        [InlineData("/InvalidOffsetLarge")]
+        [InlineData("/InvalidCountSmall")]
+        [InlineData("/InvalidCountLarge")]
+        [InlineData("/InvalidCountWithOffset")]
+        public async Task TestInvalidReadOperations(string operation)
+        {
+            var result = await _fixture.Client.GetStringAsync($"/TestInvalidReadOperations{operation}");
+            Assert.Equal("Success", result);
+        }
+
+        [ConditionalTheory]
+        [InlineData("/NullBuffer")]
+        [InlineData("/InvalidCountZeroRead")]
+        public async Task TestValidReadOperations(string operation)
+        {
+            var result = await _fixture.Client.GetStringAsync($"/TestValidReadOperations{operation}");
+            Assert.Equal("Success", result);
+        }
+
+        [ConditionalTheory]
+        [InlineData("/NullBufferPost")]
+        [InlineData("/InvalidCountZeroReadPost")]
+        public async Task TestValidReadOperationsPost(string operation)
+        {
+            var result = await _fixture.Client.PostAsync($"/TestValidReadOperations{operation}", new StringContent("hello"));
+            Assert.Equal("Success", await result.Content.ReadAsStringAsync());
+        }
+
+        [ConditionalTheory]
+        [InlineData("/InvalidOffsetSmall")]
+        [InlineData("/InvalidOffsetLarge")]
+        [InlineData("/InvalidCountSmall")]
+        [InlineData("/InvalidCountLarge")]
+        [InlineData("/InvalidCountWithOffset")]
+        public async Task TestInvalidWriteOperations(string operation)
+        {
+            var result = await _fixture.Client.GetStringAsync($"/TestInvalidWriteOperations{operation}");
+            Assert.Equal("Success", result);
+        }
+
+        [ConditionalFact]
+        public async Task TestValidWriteOperations()
+        {
+            var result = await _fixture.Client.GetStringAsync($"/TestValidWriteOperations/NullBuffer");
+            Assert.Equal("Success", result);
+        }
+
+        [ConditionalFact]
+        public async Task TestValidWriteOperationsPost()
+        {
+            var result = await _fixture.Client.PostAsync($"/TestValidWriteOperations/NullBufferPost", new StringContent("hello"));
+            Assert.Equal("Success", await result.Content.ReadAsStringAsync());
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..40db2cfdb851eaa5c04810f7af91d20d157b833f
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs
@@ -0,0 +1,36 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class LargeResponseBodyTests
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public LargeResponseBodyTests(IISTestSiteFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [InlineData(65000)]
+        [InlineData(1000000)]
+        [InlineData(10000000)]
+        [InlineData(100000000)]
+        public async Task LargeResponseBodyTest_CheckAllResponseBodyBytesWritten(int query)
+        {
+            Assert.Equal(new string('a', query), await _fixture.Client.GetStringAsync($"/LargeResponseBody?length={query}"));
+        }
+
+        [ConditionalFact]
+        public async Task LargeResponseBodyFromFile_CheckAllResponseBodyBytesWritten()
+        {
+            Assert.Equal(200000000, (await _fixture.Client.GetStringAsync($"/LargeResponseFile")).Length);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4d34c3154f7bab1418b9553c86bd5c68677dcb02
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs
@@ -0,0 +1,83 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class LogPipeTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public LogPipeTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [InlineData("ConsoleErrorWrite")]
+        [InlineData("ConsoleWrite")]
+        public async Task CheckStdoutLoggingToPipe_DoesNotCrashProcess(string path)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await Helpers.AssertStarts(deploymentResult, path);
+
+            StopServer();
+
+            if (deploymentParameters.ServerType == ServerType.IISExpress)
+            {
+                Assert.Contains(TestSink.Writes, context => context.Message.Contains("TEST MESSAGE"));
+            }
+        }
+
+        [ConditionalTheory]
+        [InlineData("ConsoleErrorWriteStartServer")]
+        [InlineData("ConsoleWriteStartServer")]
+        public async Task CheckStdoutLoggingToPipeWithFirstWrite(string path)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+
+            var firstWriteString = "TEST MESSAGE";
+
+            deploymentParameters.TransformArguments((a, _) => $"{a} {path}");
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await Helpers.AssertStarts(deploymentResult);
+
+            StopServer();
+
+            if (deploymentParameters.ServerType == ServerType.IISExpress)
+            {
+                // We can't read stdout logs from IIS as they aren't redirected.
+                Assert.Contains(TestSink.Writes, context => context.Message.Contains(firstWriteString));
+            }
+        }
+
+        [ConditionalFact]
+        public async Task CheckUnicodePipe()
+        {
+            var path = "CheckConsoleFunctions";
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} {path}");
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync(path);
+
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessThreadExitStdOut(deploymentResult, "12", "(.*)彡⾔(.*)"));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..fec5c227ecf9da4443d3bcefd8d0f5f68119dc1f
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs
@@ -0,0 +1,85 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Linq;
+using System.Net;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Net.Http.Headers;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class ResponseHeaders
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public ResponseHeaders(IISTestSiteFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task AddResponseHeaders_HeaderValuesAreSetCorrectly()
+        {
+            var response = await _fixture.Client.GetAsync("ResponseHeaders");
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+            Assert.Equal("Request Complete", responseText);
+
+            Assert.True(response.Headers.TryGetValues("UnknownHeader", out var headerValues));
+            Assert.Equal("test123=foo", headerValues.First());
+
+            Assert.True(response.Content.Headers.TryGetValues(HeaderNames.ContentType, out headerValues));
+            Assert.Equal("text/plain", headerValues.First());
+
+            Assert.True(response.Headers.TryGetValues("MultiHeader", out headerValues));
+            Assert.Equal(2, headerValues.Count());
+            Assert.Equal("1", headerValues.First());
+            Assert.Equal("2", headerValues.Last());
+        }
+
+        [ConditionalFact]
+        public async Task ErrorCodeIsSetForExceptionDuringRequest()
+        {
+            var response = await _fixture.Client.GetAsync("Throw");
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+            Assert.Equal("Internal Server Error", response.ReasonPhrase);
+        }
+
+        [ConditionalTheory]
+        [InlineData(200, "custom", "custom", null)]
+        [InlineData(200, "custom", "custom", "Custom body")]
+        [InlineData(200, "custom", "custom", "")]
+
+
+        [InlineData(500, "", "Internal Server Error", null)]
+        [InlineData(500, "", "Internal Server Error", "Custom body")]
+        [InlineData(500, "", "Internal Server Error", "")]
+
+        [InlineData(400, "custom", "custom", null)]
+        [InlineData(400, "", "Bad Request", "Custom body")]
+        [InlineData(400, "", "Bad Request", "")]
+
+        [InlineData(999, "", "", null)]
+        [InlineData(999, "", "", "Custom body")]
+        [InlineData(999, "", "", "")]
+        public async Task CustomErrorCodeWorks(int code, string reason, string expectedReason, string body)
+        {
+            var response = await _fixture.Client.GetAsync($"SetCustomErorCode?code={code}&reason={reason}&writeBody={body != null}&body={body}");
+            Assert.Equal((HttpStatusCode)code, response.StatusCode);
+            Assert.Equal(expectedReason, response.ReasonPhrase);
+
+            // ReadAsStringAsync returns empty string for empty results
+            Assert.Equal(body ?? string.Empty, await response.Content.ReadAsStringAsync());
+        }
+
+        [ConditionalFact]
+        public async Task ServerHeaderIsOverriden()
+        {
+            var response = await _fixture.Client.GetAsync("OverrideServer");
+            Assert.Equal("MyServer/7.8", response.Headers.Server.Single().Product.ToString());
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c39e155e77cecfc0f3a104c47d66d9ab533e979c
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs
@@ -0,0 +1,29 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class ResponseInvalidOrderingTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public ResponseInvalidOrderingTest(IISTestSiteFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [InlineData("SetStatusCodeAfterWrite")]
+        [InlineData("SetHeaderAfterWrite")]
+        public async Task ResponseInvalidOrderingTests_ExpectFailure(string path)
+        {
+            Assert.Equal($"Started_{path}Threw_Finished", await _fixture.Client.GetStringAsync("/ResponseInvalidOrdering/" + path));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d18c4c7f093f728b5f7080223ed5943745c4bb89
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs
@@ -0,0 +1,59 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class ServerVariablesTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public ServerVariablesTest(IISTestSiteFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task ProvidesAccessToServerVariables()
+        {
+            var port = _fixture.Client.BaseAddress.Port;
+            Assert.Equal("SERVER_PORT: " + port, await _fixture.Client.GetStringAsync("/ServerVariable?q=SERVER_PORT"));
+            Assert.Equal("QUERY_STRING: q=QUERY_STRING", await _fixture.Client.GetStringAsync("/ServerVariable?q=QUERY_STRING"));
+        }
+
+        [ConditionalFact]
+        public async Task ReturnsNullForUndefinedServerVariable()
+        {
+            Assert.Equal("THIS_VAR_IS_UNDEFINED: (null)", await _fixture.Client.GetStringAsync("/ServerVariable?q=THIS_VAR_IS_UNDEFINED"));
+        }
+
+        [ConditionalFact]
+        public async Task CanSetAndReadVariable()
+        {
+            Assert.Equal("ROUNDTRIP: 1", await _fixture.Client.GetStringAsync("/ServerVariable?v=1&q=ROUNDTRIP"));
+        }
+
+        [ConditionalFact]
+        public async Task BasePathIsNotPrefixedBySlashSlashQuestionMark()
+        {
+            Assert.DoesNotContain(@"\\?\", await _fixture.Client.GetStringAsync("/BasePath"));
+        }
+
+        [ConditionalFact]
+        public async Task GetServerVariableDoesNotCrash()
+        {
+            await Helpers.StressLoad(_fixture.Client, "/GetServerVariableStress", response => {
+                    var text = response.Content.ReadAsStringAsync().Result;
+                    Assert.StartsWith("Response Begin", text);
+                    Assert.EndsWith("Response End", text);
+                });
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..cadfed97819d974907bb78218bce3907e23d8138
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs
@@ -0,0 +1,100 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class StartupExceptionTests : LogFileTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public StartupExceptionTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [InlineData("CheckLargeStdErrWrites")]
+        [InlineData("CheckLargeStdOutWrites")]
+        [InlineData("CheckOversizedStdErrWrites")]
+        [InlineData("CheckOversizedStdOutWrites")]
+        public async Task CheckStdoutWithLargeWrites_TestSink(string mode)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} {mode}");
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await AssertFailsToStart(deploymentResult);
+            var expectedString = new string('a', 30000);
+            Assert.Contains(TestSink.Writes, context => context.Message.Contains(expectedString));
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessThreadExitStdOut(deploymentResult, "12", expectedString));
+        }
+
+        [ConditionalTheory]
+        [InlineData("CheckLargeStdErrWrites")]
+        [InlineData("CheckLargeStdOutWrites")]
+        [InlineData("CheckOversizedStdErrWrites")]
+        [InlineData("CheckOversizedStdOutWrites")]
+        public async Task CheckStdoutWithLargeWrites_LogFile(string mode)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} {mode}");
+            deploymentParameters.EnableLogging(_logFolderPath);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await AssertFailsToStart(deploymentResult);
+
+            var contents = GetLogFileContent(deploymentResult);
+            var expectedString = new string('a', 30000);
+
+            Assert.Contains(expectedString, contents);
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessThreadExitStdOut(deploymentResult, "12", expectedString));
+        }
+
+        [ConditionalFact]
+        public async Task CheckValidConsoleFunctions()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} CheckConsoleFunctions");
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await AssertFailsToStart(deploymentResult);
+
+            Assert.Contains(TestSink.Writes, context => context.Message.Contains("Is Console redirection: True"));
+        }
+
+        private async Task AssertFailsToStart(IISDeploymentResult deploymentResult)
+        {
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+        }
+
+        [ConditionalFact]
+        public async Task Gets500_30_ErrorPage()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} EarlyReturn");
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            Assert.False(response.IsSuccessStatusCode);
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Contains("500.30 - ANCM In-Process Start Failure", responseText);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3bcc134cb26378f76684860d735c2127a3f1ee4a
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs
@@ -0,0 +1,479 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Newtonsoft.Json;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class StartupTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public StartupTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        private readonly string _dotnetLocation = DotNetCommands.GetDotNetExecutable(RuntimeArchitecture.x64);
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        public async Task ExpandEnvironmentVariableInWebConfig()
+        {
+            // Point to dotnet installed in user profile.
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            deploymentParameters.EnvironmentVariables["DotnetPath"] = _dotnetLocation;
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "%DotnetPath%"));
+            await StartAsync(deploymentParameters);
+        }
+
+        [ConditionalTheory]
+        [InlineData("bogus", "", @"Executable was not found at '.*?\\bogus.exe")]
+        [InlineData("c:\\random files\\dotnet.exe", "something.dll", @"Could not find dotnet.exe at '.*?\\dotnet.exe'")]
+        [InlineData(".\\dotnet.exe", "something.dll", @"Could not find dotnet.exe at '.*?\\.\\dotnet.exe'")]
+        [InlineData("dotnet.exe", "", @"Application arguments are empty.")]
+        [InlineData("dotnet.zip", "", @"Process path 'dotnet.zip' doesn't have '.exe' extension.")]
+        public async Task InvalidProcessPath_ExpectServerError(string path, string arguments, string subError)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path));
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("arguments", arguments));
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("HelloWorld");
+
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, $@"Application '{Regex.Escape(deploymentResult.ContentRoot)}\\' wasn't able to start. {subError}");
+
+            Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", await response.Content.ReadAsStringAsync());
+        }
+
+        [ConditionalFact]
+        public async Task StartsWithDotnetLocationWithoutExe()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+
+            var dotnetLocationWithoutExtension = _dotnetLocation.Substring(0, _dotnetLocation.LastIndexOf("."));
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", dotnetLocationWithoutExtension));
+
+            await StartAsync(deploymentParameters);
+        }
+
+        [ConditionalFact]
+        public async Task StartsWithDotnetLocationUppercase()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+
+            var dotnetLocationWithoutExtension = _dotnetLocation.Substring(0, _dotnetLocation.LastIndexOf(".")).ToUpperInvariant();
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", dotnetLocationWithoutExtension));
+
+            await StartAsync(deploymentParameters);
+        }
+
+        [ConditionalTheory]
+        [InlineData("dotnet")]
+        [InlineData("dotnet.EXE")]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        public async Task StartsWithDotnetOnThePath(string path)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+
+            deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(_dotnetLocation);
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path));
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+            await deploymentResult.AssertStarts();
+
+            StopServer();
+            // Verify that in this scenario where.exe was invoked only once by shim and request handler uses cached value
+            Assert.Equal(1, TestSink.Writes.Count(w => w.Message.Contains("Invoking where.exe to find dotnet.exe")));
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22)
+                .WithAllApplicationTypes()
+                .WithAncmV2InProcess();
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task HelloWorld(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            await StartAsync(deploymentParameters);
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        public async Task StartsWithPortableAndBootstraperExe()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            // We need the right dotnet on the path in IIS
+            deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(DotNetCommands.GetDotNetExecutable(deploymentParameters.RuntimeArchitecture));
+
+            // rest publisher as it doesn't support additional parameters
+            deploymentParameters.ApplicationPublisher = null;
+            // ReferenceTestTasks is workaround for https://github.com/dotnet/sdk/issues/2482
+            deploymentParameters.AdditionalPublishParameters = "-p:RuntimeIdentifier=win7-x64 -p:UseAppHost=true -p:SelfContained=false -p:ReferenceTestTasks=false";
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            Assert.True(File.Exists(Path.Combine(deploymentResult.ContentRoot, "InProcessWebSite.exe")));
+            Assert.False(File.Exists(Path.Combine(deploymentResult.ContentRoot, "hostfxr.dll")));
+            Assert.Contains("InProcessWebSite.exe", Helpers.ReadAllTextFromFile(Path.Combine(deploymentResult.ContentRoot, "web.config"), Logger));
+
+            await deploymentResult.AssertStarts();
+        }
+
+        [ConditionalFact]
+        public async Task DetectsOverriddenServer()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} OverriddenServer");
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+            var response = await deploymentResult.HttpClient.GetAsync("/");
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvents(deploymentResult,
+                EventLogHelpers.InProcessFailedToStart(deploymentResult, "CLR worker thread exited prematurely"),
+                EventLogHelpers.InProcessThreadException(deploymentResult, ".*?Application is running inside IIS process but is not configured to use IIS server"));
+        }
+
+        [ConditionalFact]
+        public async Task LogsStartupExceptionExitError()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} Throw");
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/");
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvents(deploymentResult,
+                EventLogHelpers.InProcessFailedToStart(deploymentResult, "CLR worker thread exited prematurely"),
+                EventLogHelpers.InProcessThreadException(deploymentResult, ", exception code = '0xe0434352'"));
+        }
+
+        [ConditionalFact]
+        public async Task LogsUnexpectedThreadExitError()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} EarlyReturn");
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvents(deploymentResult,
+                EventLogHelpers.InProcessFailedToStart(deploymentResult, "CLR worker thread exited prematurely"),
+                EventLogHelpers.InProcessThreadExit(deploymentResult, "12"));
+        }
+
+        [ConditionalFact]
+        public async Task RemoveHostfxrFromApp_InProcessHostfxrInvalid()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.ApplicationType = ApplicationType.Standalone;
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            File.Copy(
+                Path.Combine(deploymentResult.ContentRoot, "aspnetcorev2_inprocess.dll"),
+                Path.Combine(deploymentResult.ContentRoot, "hostfxr.dll"),
+                true);
+            await AssertSiteFailsToStartWithInProcessStaticContent(deploymentResult);
+
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessHostfxrInvalid(deploymentResult), Logger);
+        }
+
+        [ConditionalFact]
+        public async Task TargedDifferenceSharedFramework_FailedToFindNativeDependencies()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            Helpers.ModifyFrameworkVersionInRuntimeConfig(deploymentResult);
+            await AssertSiteFailsToStartWithInProcessStaticContent(deploymentResult);
+
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessFailedToFindNativeDependencies(deploymentResult), Logger);
+        }
+
+        [ConditionalFact]
+        public async Task RemoveInProcessReference_FailedToFindRequestHandler()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.ApplicationType = ApplicationType.Standalone;
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            File.Delete(Path.Combine(deploymentResult.ContentRoot, "aspnetcorev2_inprocess.dll"));
+
+            await AssertSiteFailsToStartWithInProcessStaticContent(deploymentResult);
+
+            if (DeployerSelector.IsForwardsCompatibilityTest)
+            {
+                EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessFailedToFindNativeDependencies(deploymentResult), Logger);
+            }
+            else
+            {
+                EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessFailedToFindRequestHandler(deploymentResult), Logger);
+            }
+        }
+
+        [ConditionalFact]
+        public async Task StartupTimeoutIsApplied()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} Hang");
+            deploymentParameters.WebConfigActionList.Add(
+                WebConfigHelpers.AddOrModifyAspNetCoreSection("startupTimeLimit", "1"));
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/");
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvents(deploymentResult,
+                EventLogHelpers.InProcessFailedToStart(deploymentResult, "Managed server didn't initialize after 1000 ms.")
+                );
+        }
+
+        [ConditionalFact]
+        public async Task ShutdownTimeoutIsApplied()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} HangOnStop");
+            deploymentParameters.WebConfigActionList.Add(
+                WebConfigHelpers.AddOrModifyAspNetCoreSection("shutdownTimeLimit", "1"));
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            Assert.Equal("Hello World", await deploymentResult.HttpClient.GetStringAsync("/HelloWorld"));
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvents(deploymentResult,
+                EventLogHelpers.InProcessStarted(deploymentResult),
+                EventLogHelpers.InProcessFailedToStop(deploymentResult, ""));
+        }
+
+        [ConditionalFact]
+        public async Task CheckInvalidHostingModelParameter()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("hostingModel", "bogus"));
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("HelloWorld");
+
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvents(deploymentResult,
+                EventLogHelpers.ConfigurationLoadError(deploymentResult, "Unknown hosting model 'bogus'. Please specify either hostingModel=\"inprocess\" or hostingModel=\"outofprocess\" in the web.config file.")
+                );
+        }
+
+        private static Dictionary<string, (string, Action<XElement>)> InvalidConfigTransformations = InitInvalidConfigTransformations();
+        public static IEnumerable<object[]> InvalidConfigTransformationsScenarios => InvalidConfigTransformations.ToTheoryData();
+
+        [ConditionalTheory]
+        [MemberData(nameof(InvalidConfigTransformationsScenarios))]
+        public async Task ReportsWebConfigAuthoringErrors(string scenario)
+        {
+            var (expectedError, action) = InvalidConfigTransformations[scenario];
+            var iisDeploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            iisDeploymentParameters.WebConfigActionList.Add((element, _) => action(element));
+            var deploymentResult = await DeployAsync(iisDeploymentParameters);
+            var result = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            Assert.Equal(HttpStatusCode.InternalServerError, result.StatusCode);
+
+            // Config load errors might not allow us to initialize log file
+            deploymentResult.AllowNoLogs();
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvents(deploymentResult,
+                EventLogHelpers.ConfigurationLoadError(deploymentResult, expectedError)
+            );
+        }
+
+        public static Dictionary<string, (string, Action<XElement>)> InitInvalidConfigTransformations()
+        {
+            var dictionary = new Dictionary<string, (string, Action<XElement>)>();
+            dictionary.Add("Empty process path",
+                (
+                    "Attribute 'processPath' is required.",
+                    element => element.Descendants("aspNetCore").Single().SetAttributeValue("processPath", "")
+                ));
+            dictionary.Add("Unknown hostingModel",
+                (
+                    "Unknown hosting model 'asdf'.",
+                    element => element.Descendants("aspNetCore").Single().SetAttributeValue("hostingModel", "asdf")
+                ));
+            dictionary.Add("environmentVariables with add",
+                (
+                    "Unable to get required configuration section 'system.webServer/aspNetCore'. Possible reason is web.config authoring error.",
+                    element => element.Descendants("aspNetCore").Single().GetOrAdd("environmentVariables").GetOrAdd("add")
+                ));
+            return dictionary;
+        }
+
+        private static Dictionary<string, Func<IISDeploymentParameters, string>> PortableConfigTransformations = InitPortableWebConfigTransformations();
+        public static IEnumerable<object[]> PortableConfigTransformationsScenarios => PortableConfigTransformations.ToTheoryData();
+
+        [ConditionalTheory]
+        [MemberData(nameof(PortableConfigTransformationsScenarios))]
+        public async Task StartsWithWebConfigVariationsPortable(string scenario)
+        {
+            var action = PortableConfigTransformations[scenario];
+            var iisDeploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            var expectedArguments = action(iisDeploymentParameters);
+            var result = await DeployAsync(iisDeploymentParameters);
+            Assert.Equal(expectedArguments, await result.HttpClient.GetStringAsync("/CommandLineArgs"));
+        }
+
+        public static Dictionary<string, Func<IISDeploymentParameters, string>> InitPortableWebConfigTransformations()
+        {
+            var dictionary = new Dictionary<string, Func<IISDeploymentParameters, string>>();
+            var pathWithSpace = "\u03c0 \u2260 3\u00b714";
+
+            dictionary.Add("App in bin subdirectory full path to dll using exec and quotes",
+                parameters => {
+                    MoveApplication(parameters, "bin");
+                    parameters.TransformArguments((arguments, root) => "exec " + Path.Combine(root, "bin", arguments));
+                    return "";
+                });
+
+            dictionary.Add("App in subdirectory with space",
+                parameters => {
+                    MoveApplication(parameters, pathWithSpace);
+                    parameters.TransformArguments((arguments, root) => Path.Combine(pathWithSpace, arguments));
+                    return "";
+                });
+
+            dictionary.Add("App in subdirectory with space and full path to dll",
+                parameters => {
+                    MoveApplication(parameters, pathWithSpace);
+                    parameters.TransformArguments((arguments, root) => Path.Combine(root, pathWithSpace, arguments));
+                    return "";
+                });
+
+            dictionary.Add("App in bin subdirectory with space full path to dll using exec and quotes",
+                parameters => {
+                    MoveApplication(parameters, pathWithSpace);
+                    parameters.TransformArguments((arguments, root) => "exec \"" + Path.Combine(root, pathWithSpace, arguments) + "\" extra arguments");
+                    return "extra|arguments";
+                });
+
+            dictionary.Add("App in bin subdirectory and quoted argument",
+                parameters => {
+                    MoveApplication(parameters, "bin");
+                    parameters.TransformArguments((arguments, root) => Path.Combine("bin", arguments) + " \"extra argument\"");
+                    return "extra argument";
+                });
+
+            dictionary.Add("App in bin subdirectory full path to dll",
+                parameters => {
+                    MoveApplication(parameters, "bin");
+                    parameters.TransformArguments((arguments, root) => Path.Combine(root, "bin", arguments) + " extra arguments");
+                    return "extra|arguments";
+                });
+            return dictionary;
+        }
+
+
+        private static Dictionary<string, Func<IISDeploymentParameters, string>> StandaloneConfigTransformations = InitStandaloneConfigTransformations();
+        public static IEnumerable<object[]> StandaloneConfigTransformationsScenarios => StandaloneConfigTransformations.ToTheoryData();
+
+        [ConditionalTheory]
+        [MemberData(nameof(StandaloneConfigTransformationsScenarios))]
+        public async Task StartsWithWebConfigVariationsStandalone(string scenario)
+        {
+            var action = StandaloneConfigTransformations[scenario];
+            var iisDeploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            iisDeploymentParameters.ApplicationType = ApplicationType.Standalone;
+            var expectedArguments = action(iisDeploymentParameters);
+            var result = await DeployAsync(iisDeploymentParameters);
+            Assert.Equal(expectedArguments, await result.HttpClient.GetStringAsync("/CommandLineArgs"));
+        }
+
+        public static Dictionary<string, Func<IISDeploymentParameters, string>> InitStandaloneConfigTransformations()
+        {
+            var dictionary = new Dictionary<string, Func<IISDeploymentParameters, string>>();
+            var pathWithSpace = "\u03c0 \u2260 3\u00b714";
+
+            dictionary.Add("App in subdirectory",
+                parameters => {
+                    MoveApplication(parameters, pathWithSpace);
+                    parameters.TransformPath((path, root) => Path.Combine(pathWithSpace, path));
+                    parameters.TransformArguments((arguments, root) => "\"additional argument\"");
+                    return "additional argument";
+                });
+
+            dictionary.Add("App in bin subdirectory full path",
+                parameters => {
+                    MoveApplication(parameters, pathWithSpace);
+                    parameters.TransformPath((path, root) => Path.Combine(root, pathWithSpace, path));
+                    parameters.TransformArguments((arguments, root) => "additional arguments");
+                    return "additional|arguments";
+                });
+
+            return dictionary;
+        }
+
+        private static void MoveApplication(
+            IISDeploymentParameters parameters,
+            string subdirectory)
+        {
+            parameters.WebConfigActionList.Add((config, contentRoot) =>
+            {
+                var source = new DirectoryInfo(contentRoot);
+                var subDirectoryPath = source.CreateSubdirectory(subdirectory);
+
+                // Copy everything into a subfolder
+                Helpers.CopyFiles(source, subDirectoryPath, null);
+                // Cleanup files
+                foreach (var fileSystemInfo in source.GetFiles())
+                {
+                    fileSystemInfo.Delete();
+                }
+            });
+        }
+
+        private async Task AssertSiteFailsToStartWithInProcessStaticContent(IISDeploymentResult deploymentResult)
+        {
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+            Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", await response.Content.ReadAsStringAsync());
+            StopServer();
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..03aa0e16e6b176f3b74ffaa4bd8fbf6ec4788763
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs
@@ -0,0 +1,197 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class SynchronousReadAndWriteTests: FixtureLoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public SynchronousReadAndWriteTests(IISTestSiteFixture fixture): base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task ReadAndWriteSynchronously()
+        {
+            for (int i = 0; i < 100; i++)
+            {
+                var content = new StringContent(new string('a', 100000));
+                var response = await _fixture.Client.PostAsync("ReadAndWriteSynchronously", content);
+                var responseText = await response.Content.ReadAsStringAsync();
+
+                Assert.Equal(expected: 110000, actual: responseText.Length);
+            }
+        }
+
+        [ConditionalFact]
+        public async Task ReadAndWriteEcho()
+        {
+            var body = new string('a', 100000);
+            var content = new StringContent(body);
+            var response = await _fixture.Client.PostAsync("ReadAndWriteEcho", content);
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal(body, responseText);
+        }
+
+        [ConditionalFact]
+        public async Task ReadAndWriteCopyToAsync()
+        {
+            var body = new string('a', 100000);
+            var content = new StringContent(body);
+            var response = await _fixture.Client.PostAsync("ReadAndWriteCopyToAsync", content);
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal(body, responseText);
+        }
+
+        [ConditionalFact]
+        public async Task ReadAndWriteEchoTwice()
+        {
+            var requestBody = new string('a', 10000);
+            var content = new StringContent(requestBody);
+            var response = await _fixture.Client.PostAsync("ReadAndWriteEchoTwice", content);
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal(requestBody.Length * 2, responseText.Length);
+        }
+
+        [ConditionalFact]
+        public async Task ReadSetHeaderWrite()
+        {
+            var body = "Body text";
+            var content = new StringContent(body);
+            var response = await _fixture.Client.PostAsync("SetHeaderFromBody", content);
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal(body, response.Headers.GetValues("BodyAsString").Single());
+            Assert.Equal(body, responseText);
+        }
+
+        [ConditionalFact]
+        public async Task ReadAndWriteSlowConnection()
+        {
+            using (var connection = _fixture.CreateTestConnection())
+            {
+                var testString = "hello world";
+                var request = $"POST /ReadAndWriteSlowConnection HTTP/1.0\r\n" +
+                    $"Content-Length: {testString.Length}\r\n" +
+                    "Host: " + "localhost\r\n" +
+                    "\r\n" + testString;
+
+                foreach (var c in request)
+                {
+                    await connection.Send(c.ToString());
+                    await Task.Delay(10);
+                }
+
+                await connection.Receive(
+                    "HTTP/1.1 200 OK",
+                    "");
+                await connection.ReceiveHeaders();
+
+                for (int i = 0; i < 100; i++)
+                {
+                    foreach (var c in testString)
+                    {
+                        await connection.Receive(c.ToString());
+                    }
+                    await Task.Delay(10);
+                }
+                await connection.WaitForConnectionClose();
+            }
+        }
+
+        [ConditionalFact]
+        public async Task ReadAndWriteInterleaved()
+        {
+            using (var connection = _fixture.CreateTestConnection())
+            {
+                var requestLength = 0;
+                var messages = new List<string>();
+                for (var i = 1; i < 100; i++)
+                {
+                    var message = i + Environment.NewLine;
+                    requestLength += message.Length;
+                    messages.Add(message);
+                }
+
+                await connection.Send(
+                    "POST /ReadAndWriteEchoLines HTTP/1.0",
+                    $"Content-Length: {requestLength}",
+                    "Host: localhost",
+                    "",
+                    "");
+
+                await connection.Receive(
+                    "HTTP/1.1 200 OK",
+                    "");
+                await connection.ReceiveHeaders();
+
+                foreach (var message in messages)
+                {
+                    await connection.Send(message);
+                    await connection.Receive(message);
+                }
+
+                await connection.Send("\r\n");
+                await connection.WaitForConnectionClose();
+            }
+        }
+
+        [ConditionalFact]
+        public async Task ConsumePartialBody()
+        {
+            using (var connection = _fixture.CreateTestConnection())
+            {
+                var message = "Hello";
+                await connection.Send(
+                    "POST /ReadPartialBody HTTP/1.1",
+                    $"Content-Length: {100}",
+                    "Host: localhost",
+                    "Connection: close",
+                    "",
+                    "");
+
+                await connection.Send(message);
+
+                await connection.Receive(
+                    "HTTP/1.1 200 OK",
+                    "");
+
+                // This test can return both content length or chunked response
+                // depending on if appfunc managed to complete before write was
+                // issued
+                var headers = await connection.ReceiveHeaders();
+                if (headers.Contains("Content-Length: 5"))
+                {
+                    await connection.Receive("Hello");
+                }
+                else
+                {
+                    await connection.Receive(
+                        "5",
+                        message,
+                        "");
+                    await connection.Receive(
+                        "0",
+                        "",
+                        "");
+                }
+
+                await connection.WaitForConnectionClose();
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs b/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1e15cde5c297387e326f09f241dc7f2898fef389
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs
@@ -0,0 +1,242 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class LoggingTests : LogFileTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public LoggingTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22)
+                .WithAllApplicationTypes()
+                .WithAncmVersions(AncmVersion.AspNetCoreModuleV2)
+                .WithAllHostingModels();
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task CheckStdoutLoggingToFile(TestVariant variant)
+        {
+            await CheckStdoutToFile(variant, "ConsoleWrite");
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task CheckStdoutErrLoggingToFile(TestVariant variant)
+        {
+            await CheckStdoutToFile(variant, "ConsoleErrorWrite");
+        }
+
+        private async Task CheckStdoutToFile(TestVariant variant, string path)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            deploymentParameters.EnableLogging(_logFolderPath);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await Helpers.AssertStarts(deploymentResult, path);
+
+            StopServer();
+
+            var contents = Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, _logFolderPath), Logger);
+
+            Assert.Contains("TEST MESSAGE", contents);
+        }
+
+        // Move to separate file
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task InvalidFilePathForLogs_ServerStillRuns(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+
+            deploymentParameters.WebConfigActionList.Add(
+                WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true"));
+            deploymentParameters.WebConfigActionList.Add(
+                WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogFile", Path.Combine("Q:", "std")));
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await Helpers.AssertStarts(deploymentResult, "HelloWorld");
+
+            StopServer();
+            if (variant.HostingModel == HostingModel.InProcess)
+            {
+                EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Could not start stdout redirection in (.*)aspnetcorev2.dll. Exception message: HRESULT 0x80070003");
+                EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Could not stop stdout redirection in (.*)aspnetcorev2.dll. Exception message: HRESULT 0x80070002");
+            }
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task StartupMessagesAreLoggedIntoDebugLogFile(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            deploymentParameters.HandlerSettings["debugLevel"] = "file";
+            deploymentParameters.HandlerSettings["debugFile"] = "debug.txt";
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await deploymentResult.HttpClient.GetAsync("/");
+
+            AssertLogs(Path.Combine(deploymentResult.ContentRoot, "debug.txt"));
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task StartupMessagesAreLoggedIntoDefaultDebugLogFile(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            deploymentParameters.HandlerSettings["debugLevel"] = "file";
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await deploymentResult.HttpClient.GetAsync("/");
+
+            AssertLogs(Path.Combine(deploymentResult.ContentRoot, "aspnetcore-debug.log"));
+        }
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        [MemberData(nameof(TestVariants))]
+        public async Task StartupMessagesAreLoggedIntoDefaultDebugLogFileWhenEnabledWithEnvVar(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_DEBUG"] = "file";
+            // Add empty debugFile handler setting to prevent IIS deployer from overriding debug settings
+            deploymentParameters.HandlerSettings["debugFile"] = "";
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            await deploymentResult.HttpClient.GetAsync("/");
+
+            AssertLogs(Path.Combine(deploymentResult.ContentRoot, "aspnetcore-debug.log"));
+        }
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        [MemberData(nameof(TestVariants))]
+        public async Task StartupMessagesLogFileSwitchedWhenLogFilePresentInWebConfig(TestVariant variant)
+        {
+            var firstTempFile = Path.GetTempFileName();
+            var secondTempFile = Path.GetTempFileName();
+
+            try
+            {
+                var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+                deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_DEBUG_FILE"] = firstTempFile;
+                deploymentParameters.AddDebugLogToWebConfig(secondTempFile);
+
+                var deploymentResult = await DeployAsync(deploymentParameters);
+
+                var response = await deploymentResult.HttpClient.GetAsync("/");
+
+                StopServer();
+                var logContents = Helpers.ReadAllTextFromFile(firstTempFile, Logger);
+
+                Assert.Contains("Switching debug log files to", logContents);
+
+                AssertLogs(secondTempFile);
+            }
+            finally
+            {
+                File.Delete(firstTempFile);
+                File.Delete(secondTempFile);
+            }
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+
+        public async Task DebugLogsAreWrittenToEventLog(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            deploymentParameters.HandlerSettings["debugLevel"] = "file,eventlog";
+            var deploymentResult = await StartAsync(deploymentParameters);
+            StopServer();
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, @"\[aspnetcorev2.dll\] Initializing logs for .*?Description: IIS ASP.NET Core Module V2");
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task CheckUTF8File(TestVariant variant)
+        {
+            var path = "CheckConsoleFunctions";
+
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, variant.HostingModel, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} {path}"); // For standalone this will need to remove space
+
+            var logFolderPath = _logFolderPath + "\\彡⾔";
+            deploymentParameters.EnableLogging(logFolderPath);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync(path);
+
+            Assert.False(response.IsSuccessStatusCode);
+
+            StopServer();
+
+            var contents = Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, logFolderPath), Logger);
+            Assert.Contains("彡⾔", contents);
+
+            if (variant.HostingModel == HostingModel.InProcess)
+            {
+                EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessThreadExitStdOut(deploymentResult, "12", "(.*)彡⾔(.*)"));
+            }
+            else
+            {
+                EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.OutOfProcessFailedToStart(deploymentResult));
+            }
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task OnlyOneFileCreatedWithProcessStartTime(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+
+            deploymentParameters.EnableLogging(_logFolderPath);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+            await Helpers.AssertStarts(deploymentResult, "ConsoleWrite");
+
+            StopServer();
+
+            Assert.Single(Directory.GetFiles(_logFolderPath), Helpers.GetExpectedLogName(deploymentResult, _logFolderPath));
+        }
+
+        private static string ReadLogs(string logPath)
+        {
+            using (var stream = File.Open(logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+            using (var streamReader = new StreamReader(stream))
+            {
+                return streamReader.ReadToEnd();
+            }
+        }
+
+        private static void AssertLogs(string logPath)
+        {
+            var logContents = ReadLogs(logPath);
+            Assert.Contains("[aspnetcorev2.dll]", logContents);
+            Assert.True(logContents.Contains("[aspnetcorev2_inprocess.dll]") || logContents.Contains("[aspnetcorev2_outofprocess.dll]"));
+            Assert.Contains("Description: IIS ASP.NET Core Module V2. Commit:", logContents);
+            Assert.Contains("Description: IIS ASP.NET Core Module V2 Request Handler. Commit:", logContents);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs b/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3723369c89ed96c6be6efdb027a171c9803e7a8c
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs
@@ -0,0 +1,144 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Extensions.Logging;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class MultiApplicationTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        private PublishedApplication _publishedApplication;
+        private PublishedApplication _rootApplication;
+
+        public MultiApplicationTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task RunsTwoOutOfProcessApps()
+        {
+            var parameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
+            parameters.ServerConfigActionList.Add(DuplicateApplication);
+            var result = await DeployAsync(parameters);
+            var id1 = await result.HttpClient.GetStringAsync("/app1/ProcessId");
+            var id2 = await result.HttpClient.GetStringAsync("/app2/ProcessId");
+            Assert.NotEqual(id2, id1);
+        }
+
+        [ConditionalFact]
+        public async Task FailsAndLogsWhenRunningTwoInProcessApps()
+        {
+            var parameters = _fixture.GetBaseDeploymentParameters(HostingModel.InProcess, publish: true);
+            parameters.ServerConfigActionList.Add(DuplicateApplication);
+
+            var result = await DeployAsync(parameters);
+            var result1 = await result.HttpClient.GetAsync("/app1/HelloWorld");
+            var result2 = await result.HttpClient.GetAsync("/app2/HelloWorld");
+            Assert.Equal(200, (int)result1.StatusCode);
+            Assert.Equal(500, (int)result2.StatusCode);
+            StopServer();
+            EventLogHelpers.VerifyEventLogEvent(result, "Only one inprocess application is allowed per IIS application pool");
+        }
+
+        [ConditionalTheory]
+        [InlineData(HostingModel.OutOfProcess)]
+        [InlineData(HostingModel.InProcess)]
+        public async Task FailsAndLogsEventLogForMixedHostingModel(HostingModel firstApp)
+        {
+            var parameters = _fixture.GetBaseDeploymentParameters(firstApp, publish: true);
+            parameters.ServerConfigActionList.Add(DuplicateApplication);
+            var result = await DeployAsync(parameters);
+
+            // Modify hosting model of other app to be the opposite
+            var otherApp = firstApp == HostingModel.InProcess ? HostingModel.OutOfProcess : HostingModel.InProcess;
+            SetHostingModel(_publishedApplication.Path, otherApp);
+
+            var result1 = await result.HttpClient.GetAsync("/app1/HelloWorld");
+            var result2 = await result.HttpClient.GetAsync("/app2/HelloWorld");
+            Assert.Equal(200, (int)result1.StatusCode);
+            Assert.Equal(500, (int)result2.StatusCode);
+            StopServer();
+            EventLogHelpers.VerifyEventLogEvent(result, "Mixed hosting model is not supported.");
+        }
+
+        private void SetHostingModel(string directory, HostingModel model)
+        {
+            var webConfigLocation = GetWebConfigLocation(directory);
+            XDocument webConfig = XDocument.Load(webConfigLocation);
+            webConfig.Root
+                .Descendants("system.webServer")
+                .Single()
+                .GetOrAdd("aspNetCore")
+                .SetAttributeValue("hostingModel", model.ToString());
+            webConfig.Save(webConfigLocation);
+        }
+
+        private void DuplicateApplication(XElement config, string contentRoot)
+        {
+            var siteElement = config
+                .RequiredElement("system.applicationHost")
+                .RequiredElement("sites")
+                .RequiredElement("site");
+
+            var application = siteElement
+                .RequiredElement("application");
+
+            application.SetAttributeValue("path", "/app1");
+
+            var source = new DirectoryInfo(contentRoot);
+
+            var destination = new DirectoryInfo(contentRoot + "anotherApp");
+            destination.Create();
+            Helpers.CopyFiles(source, destination, Logger);
+
+            _publishedApplication = new PublishedApplication(destination.FullName, Logger);
+
+            var newApplication = new XElement(application);
+            newApplication.SetAttributeValue("path", "/app2");
+            newApplication.RequiredElement("virtualDirectory")
+                .SetAttributeValue("physicalPath", destination.FullName);
+
+            siteElement.Add(newApplication);
+
+            // IIS Express requires root application to exist
+            var rootApplicationDirectory = new DirectoryInfo(contentRoot + "rootApp");
+            rootApplicationDirectory.Create();
+
+            _rootApplication = new PublishedApplication(rootApplicationDirectory.FullName, Logger);
+            File.WriteAllText(GetWebConfigLocation(rootApplicationDirectory.FullName), "<configuration></configuration>");
+
+            var rootApplication = new XElement(application);
+            rootApplication.SetAttributeValue("path", "/");
+            rootApplication.RequiredElement("virtualDirectory")
+                .SetAttributeValue("physicalPath", rootApplicationDirectory.FullName);
+
+            siteElement.Add(rootApplication);
+        }
+
+        private static string GetWebConfigLocation(string siteRoot)
+        {
+            return Path.Combine(siteRoot, "web.config");
+        }
+
+        public override void Dispose()
+        {
+            base.Dispose();
+            _rootApplication.Dispose();
+            _publishedApplication.Dispose();
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3b866627172ff0819315fd20843fcd02b6fa5e59
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs
@@ -0,0 +1,125 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+using Xunit;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class AspNetCorePortTests : IISFunctionalTestBase
+    {
+        // Port range allowed by ANCM config
+        private const int _minPort = 1025;
+        private const int _maxPort = 48000;
+
+        private static readonly Random _random = new Random();
+
+        private readonly PublishedSitesFixture _fixture;
+
+        public AspNetCorePortTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22)
+                .WithApplicationTypes(ApplicationType.Portable)
+                .WithAllAncmVersions();
+
+        public static IEnumerable<object[]> InvalidTestVariants
+            => from v in TestVariants.Select(v => v.Single())
+               from s in new string[] { (_minPort - 1).ToString(), (_maxPort + 1).ToString(), "noninteger" }
+               select new object[] { v, s };
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task EnvVarInWebConfig_Valid(TestVariant variant)
+        {
+            // Must publish to set env vars in web.config
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            var port = GetUnusedRandomPort();
+            deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_PORT"] = port.ToString();
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var responseText = await deploymentResult.HttpClient.GetStringAsync("/ServerAddresses");
+
+            Assert.Equal(port, new Uri(responseText).Port);
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task EnvVarInWebConfig_Empty(TestVariant variant)
+        {
+            // Must publish to set env vars in web.config
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_PORT"] = string.Empty;
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var responseText = await deploymentResult.HttpClient.GetStringAsync("/ServerAddresses");
+
+            // If env var is empty, ANCM should assign a random port (same as no env var)
+            Assert.InRange(new Uri(responseText).Port, _minPort, _maxPort);
+        }
+
+        [ConditionalTheory]
+        [MemberData(nameof(InvalidTestVariants))]
+        public async Task EnvVarInWebConfig_Invalid(TestVariant variant, string port)
+        {
+            // Must publish to set env vars in web.config
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
+            deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_PORT"] = port;
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/ServerAddresses");
+
+            Assert.Equal(HttpStatusCode.BadGateway, response.StatusCode);
+        }
+
+        private static int GetUnusedRandomPort()
+        {
+            // Large number of retries to prevent test failures due to port collisions, but not infinite
+            // to prevent infinite loop in case Bind() fails repeatedly for some other reason.
+            const int retries = 100;
+
+            List<Exception> exceptions = null;
+
+            for (var i = 0; i < retries; i++)
+            {
+                var port = _random.Next(_minPort, _maxPort);
+
+                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
+                {
+                    try
+                    {
+                        socket.Bind(new IPEndPoint(IPAddress.Loopback, port));
+                        return port;
+                    }
+                    catch (Exception e)
+                    {
+                        // Bind failed, most likely because port is in use.  Save exception and retry.
+                        if (exceptions == null)
+                        {
+                            exceptions = new List<Exception>(retries);
+                        }
+                        exceptions.Add(e);
+                    }
+                }
+            }
+
+            throw new AggregateException($"Unable to find unused random port after {retries} retries.", exceptions);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f9e6836b6fcc9dafb1b4e643c1802bd384da102e
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs
@@ -0,0 +1,252 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class GlobalVersionTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public GlobalVersionTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        private const string _handlerVersion20 = "2.0.0";
+        private const string _helloWorldRequest = "HelloWorld";
+        private const string _helloWorldResponse = "Hello World";
+
+        [ConditionalFact]
+        public async Task GlobalVersion_DefaultWorks()
+        {
+            var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
+
+            deploymentParameters.HandlerSettings["handlerVersion"] = _handlerVersion20;
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync(_helloWorldRequest);
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(_helloWorldResponse, responseText);
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        [RequiresNewShim]
+        public async Task GlobalVersion_EnvironmentVariableWorks()
+        {
+            var temporaryFile = Path.GetTempFileName();
+            try
+            {
+                var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
+                CopyShimToOutput(deploymentParameters);
+                deploymentParameters.PublishApplicationBeforeDeployment = true;
+                deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_OUTOFPROCESS_HANDLER"] = temporaryFile;
+
+                var deploymentResult = await DeployAsync(deploymentParameters);
+                var requestHandlerPath = Path.Combine(GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20), "aspnetcorev2_outofprocess.dll");
+
+                File.Delete(temporaryFile);
+                File.Move(requestHandlerPath, temporaryFile);
+
+                var response = await deploymentResult.HttpClient.GetAsync(_helloWorldRequest);
+                var responseText = await response.Content.ReadAsStringAsync();
+                Assert.Equal(_helloWorldResponse, responseText);
+                StopServer();
+            }
+            finally
+            {
+                File.Delete(temporaryFile);
+            }
+        }
+
+        [ConditionalTheory]
+        [InlineData("2.1.0")]
+        [InlineData("2.1.0-preview")]
+        public async Task GlobalVersion_NewVersionNumber_Fails(string version)
+        {
+            var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
+            deploymentParameters.HandlerSettings["handlerVersion"] = version;
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync(_helloWorldRequest);
+            Assert.False(response.IsSuccessStatusCode);
+            var responseString = await response.Content.ReadAsStringAsync();
+            Assert.Contains("HTTP Error 500.0 - ANCM Out-Of-Process Handler Load Failure", responseString);
+        }
+
+        [ConditionalTheory]
+        [InlineData("2.1.0")]
+        [InlineData("2.1.0-preview")]
+        public async Task GlobalVersion_NewVersionNumber(string version)
+        {
+            var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
+            CopyShimToOutput(deploymentParameters);
+            deploymentParameters.HandlerSettings["handlerVersion"] = version;
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20);
+            var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version);
+            Directory.Move(originalANCMPath, newANCMPath);
+
+            var response = await deploymentResult.HttpClient.GetAsync(_helloWorldRequest);
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(_helloWorldResponse, responseText);
+            AssertLoadedVersion(version);
+        }
+
+        [ConditionalTheory]
+        [InlineData("2.1.0")]
+        [InlineData("2.1.0-preview")]
+        public async Task GlobalVersion_MultipleRequestHandlers_PicksHighestOne(string version)
+        {
+            var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
+            CopyShimToOutput(deploymentParameters);
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20);
+
+            var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version);
+
+            CopyDirectory(originalANCMPath, newANCMPath);
+
+            deploymentResult.HttpClient.DefaultRequestHeaders.Add("ANCMRHPath", newANCMPath);
+            var response = await deploymentResult.HttpClient.GetAsync("CheckRequestHandlerVersion");
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal(_helloWorldResponse, responseText);
+            AssertLoadedVersion(version);
+        }
+
+        [ConditionalTheory]
+        [InlineData("2.1.0")]
+        [InlineData("2.1.0-preview")]
+        public async Task GlobalVersion_MultipleRequestHandlers_UpgradeWorks(string version)
+        {
+            var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
+            CopyShimToOutput(deploymentParameters);
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20);
+
+            deploymentResult.HttpClient.DefaultRequestHeaders.Add("ANCMRHPath", originalANCMPath);
+            var response = await deploymentResult.HttpClient.GetAsync("CheckRequestHandlerVersion");
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal(_helloWorldResponse, responseText);
+
+            StopServer();
+
+            deploymentResult = await DeployAsync(deploymentParameters);
+
+            originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20);
+
+            var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version);
+
+            CopyDirectory(originalANCMPath, newANCMPath);
+
+            deploymentResult.HttpClient.DefaultRequestHeaders.Add("ANCMRHPath", newANCMPath);
+            response = await deploymentResult.HttpClient.GetAsync("CheckRequestHandlerVersion");
+            responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal(_helloWorldResponse, responseText);
+            AssertLoadedVersion(version);
+        }
+
+        [ConditionalFact]
+        public async Task DoesNotCrashWhenNoVersionsAvailable()
+        {
+            var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
+            CopyShimToOutput(deploymentParameters);
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20);
+            Directory.Delete(originalANCMPath, true);
+            var response = await deploymentResult.HttpClient.GetAsync("HelloWorld");
+
+            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+        }
+
+        private IISDeploymentParameters GetGlobalVersionBaseDeploymentParameters()
+        {
+            return _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
+        }
+
+        private void CopyDirectory(string from, string to)
+        {
+            var toInfo = new DirectoryInfo(to);
+            toInfo.Create();
+
+            foreach (var file in new DirectoryInfo(from).GetFiles())
+            {
+                file.CopyTo(Path.Combine(toInfo.FullName, file.Name));
+            }
+        }
+
+        private string GetANCMRequestHandlerPath(IISDeploymentResult deploymentResult, string version)
+        {
+            return Path.Combine(deploymentResult.ContentRoot,
+               deploymentResult.DeploymentParameters.RuntimeArchitecture.ToString(),
+               version);
+        }
+
+        private void AssertLoadedVersion(string version)
+        {
+            StopServer();
+            Assert.Contains(TestSink.Writes, context => context.Message.Contains(version + @"\aspnetcorev2_outofprocess.dll"));
+        }
+
+        private static void CopyShimToOutput(IISDeploymentParameters parameters)
+        {
+            parameters.AddServerConfigAction(
+                (config, contentRoot) => {
+                    var moduleNodes = config.DescendantNodesAndSelf()
+                        .OfType<XElement>()
+                        .Where(element =>
+                            element.Name == "add" &&
+                            element.Attribute("name")?.Value.StartsWith("AspNetCoreModule") == true &&
+                            element.Attribute("image") != null);
+
+                    var sourceDirectory = new DirectoryInfo(Path.GetDirectoryName(moduleNodes.First().Attribute("image").Value));
+                    var destinationDirectory = new DirectoryInfo(Path.Combine(contentRoot, sourceDirectory.Name));
+                    destinationDirectory.Create();
+                    foreach (var element in moduleNodes)
+                    {
+                        var imageAttribute = element.Attribute("image");
+                        imageAttribute.Value = imageAttribute.Value.Replace(sourceDirectory.FullName, destinationDirectory.FullName);
+                    }
+                    CopyFiles(sourceDirectory, destinationDirectory);
+                });
+        }
+
+        private static void CopyFiles(DirectoryInfo source, DirectoryInfo target)
+        {
+            foreach (DirectoryInfo directoryInfo in source.GetDirectories())
+            {
+                CopyFiles(directoryInfo, target.CreateSubdirectory(directoryInfo.Name));
+            }
+
+            foreach (FileInfo fileInfo in source.GetFiles())
+            {
+                var destFileName = Path.Combine(target.FullName, fileInfo.Name);
+                fileInfo.CopyTo(destFileName);
+            }
+        }
+
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f6e36613d78684f9328c82e7d2b37342d7c762d9
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs
@@ -0,0 +1,81 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class HelloWorldTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public HelloWorldTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22, Tfm.Net461)
+                .WithAllApplicationTypes()
+                .WithAllAncmVersions();
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task HelloWorld(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
+            deploymentParameters.ServerConfigActionList.Add(
+                (element, _) => {
+                    element
+                        .RequiredElement("system.webServer")
+                        .RequiredElement("security")
+                        .RequiredElement("authentication")
+                        .Element("windowsAuthentication")
+                        ?.SetAttributeValue("enabled", "false");
+                });
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal("Hello World", responseText);
+
+            response = await deploymentResult.HttpClient.GetAsync("/Path/%3F%3F?query");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal("/??", responseText);
+
+            response = await deploymentResult.HttpClient.GetAsync("/Query/%3FPath?query?");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal("?query?", responseText);
+
+            response = await deploymentResult.HttpClient.GetAsync("/BodyLimit");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal("null", responseText);
+
+            response = await deploymentResult.HttpClient.GetAsync("/Auth");
+            responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal("null", responseText);
+
+            Assert.Equal(
+                $"ContentRootPath {deploymentResult.ContentRoot}" + Environment.NewLine +
+                $"WebRootPath {deploymentResult.ContentRoot}\\wwwroot" + Environment.NewLine +
+                $"CurrentDirectory {deploymentResult.ContentRoot}",
+                await deploymentResult.HttpClient.GetStringAsync("/HostingEnvironment"));
+
+            var expectedDll = variant.AncmVersion == AncmVersion.AspNetCoreModule ? "aspnetcore.dll" : "aspnetcorev2.dll";
+            Assert.Contains(deploymentResult.HostProcess.Modules.OfType<ProcessModule>(), m=> m.FileName.Contains(expectedDll));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs b/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs
new file mode 100644
index 0000000000000000000000000000000000000000..282ee261098321396498e9c79ae489bd541f90fc
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs
@@ -0,0 +1,65 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    /// <summary>
+    /// This type just maps collection names to available fixtures
+    /// </summary>
+    [CollectionDefinition(Name)]
+    public class PublishedSitesCollection : ICollectionFixture<PublishedSitesFixture>, ICollectionFixture<ClientCertificateFixture>
+    {
+        public const string Name = nameof(PublishedSitesCollection);
+    }
+
+    public class PublishedSitesFixture : IDisposable
+    {
+        public CachingApplicationPublisher InProcessTestSite { get; } = new CachingApplicationPublisher(Helpers.GetInProcessTestSitesPath());
+        public CachingApplicationPublisher OutOfProcessTestSite { get; } = new CachingApplicationPublisher(Helpers.GetOutOfProcessTestSitesPath());
+
+        public void Dispose()
+        {
+            InProcessTestSite.Dispose();
+            OutOfProcessTestSite.Dispose();
+        }
+
+        public IISDeploymentParameters GetBaseDeploymentParameters(HostingModel hostingModel = HostingModel.InProcess, bool publish = false)
+        {
+            var publisher = hostingModel == HostingModel.InProcess ? InProcessTestSite : OutOfProcessTestSite;
+            return GetBaseDeploymentParameters(publisher, hostingModel, publish);
+        }
+        public IISDeploymentParameters GetBaseDeploymentParameters(TestVariant variant, bool publish = false)
+        {
+            var publisher = variant.HostingModel == HostingModel.InProcess ? InProcessTestSite : OutOfProcessTestSite;
+            return GetBaseDeploymentParameters(publisher, new DeploymentParameters(variant), publish);
+        }
+
+        public IISDeploymentParameters GetBaseDeploymentParameters(ApplicationPublisher publisher, HostingModel hostingModel = HostingModel.InProcess, bool publish = false)
+        {
+            return GetBaseDeploymentParameters(
+                publisher,
+                new DeploymentParameters(publisher.ApplicationPath, DeployerSelector.ServerType, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64)
+                {
+                    HostingModel = hostingModel,
+                    TargetFramework = "netcoreapp2.2",
+                    AncmVersion = AncmVersion.AspNetCoreModuleV2
+                },
+                publish);
+        }
+
+        public IISDeploymentParameters GetBaseDeploymentParameters(ApplicationPublisher publisher, DeploymentParameters baseParameters, bool publish = false)
+        {
+            return new IISDeploymentParameters(baseParameters)
+            {
+                ApplicationPublisher = publisher,
+                ApplicationPath =  publisher.ApplicationPath,
+                PublishApplicationBeforeDeployment = publish
+            };
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs b/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs
new file mode 100644
index 0000000000000000000000000000000000000000..cbe43ec0c72297fb2dfc196a050d95c230f4354d
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs
@@ -0,0 +1,16 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class RequiresNewHandlerAttribute : Attribute, ITestCondition
+    {
+        public bool IsMet => !DeployerSelector.IsForwardsCompatibilityTest;
+
+        public string SkipReason => "Test verifies new behavior in the aspnetcorev2_inprocess.dll that isn't supported in earlier versions.";
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs b/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b0bc50a83b7869a80f17231a1518d8a8e98b66d0
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs
@@ -0,0 +1,16 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class RequiresNewShimAttribute : Attribute, ITestCondition
+    {
+        public bool IsMet => !DeployerSelector.IsBackwardsCompatiblityTest;
+
+        public string SkipReason => "Test verifies new behavior in the aspnetcorev2.dll that isn't supported in earlier versions.";
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs b/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8ebd70db12ef5186bb87d9bb4f17b3ead3632ff3
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs
@@ -0,0 +1,65 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public abstract class ServerAbortTests: FixtureLoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        [Collection(IISTestSiteCollection.Name)]
+        public class InProc: ServerAbortTests
+        {
+            public InProc(IISTestSiteFixture fixture) : base(fixture) { }
+        }
+
+        [Collection(OutOfProcessTestSiteCollection.Name)]
+        public class OutOfProcess: ServerAbortTests
+        {
+            public OutOfProcess(OutOfProcessTestSiteFixture fixture) : base(fixture) { }
+        }
+
+        [Collection(OutOfProcessV1TestSiteCollection.Name)]
+        public class OutOfProcessV1: ServerAbortTests
+        {
+            public OutOfProcessV1(OutOfProcessV1TestSiteFixture fixture) : base(fixture) { }
+        }
+
+        protected ServerAbortTests(IISTestSiteFixture fixture) : base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task ClosesConnectionOnServerAbort()
+        {
+            try
+            {
+                var response = await _fixture.Client.GetAsync("/Abort").DefaultTimeout();
+
+                // 502 is expected for outofproc but not for inproc
+                if (_fixture.DeploymentResult.DeploymentParameters.HostingModel == HostingModel.OutOfProcess)
+                {
+                    Assert.Equal(HttpStatusCode.BadGateway, response.StatusCode);
+                    // 0x80072f78 ERROR_HTTP_INVALID_SERVER_RESPONSE The server returned an invalid or unrecognized response
+                    Assert.Contains("0x80072f78", await response.Content.ReadAsStringAsync());
+                }
+                else
+                {
+                    Assert.True(false, "Should not reach here");
+                }
+            }
+            catch (HttpRequestException)
+            {
+                // Connection reset is expected both for outofproc and inproc
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs b/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d2acb704158f339901d69a81ee6eebfbd50d7503
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs
@@ -0,0 +1,25 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Security.Principal;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class SkipIfNotAdminAttribute : Attribute, ITestCondition
+    {
+        public bool IsMet
+        {
+            get
+            {
+                var identity = WindowsIdentity.GetCurrent();
+                var principal = new WindowsPrincipal(identity);
+                return principal.IsInRole(WindowsBuiltInRole.Administrator);
+            }
+        }
+
+        public string SkipReason => "The current process is not running as admin.";
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs b/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8e88fc8c26ea6fec910da3c537448ad60b4737d4
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs
@@ -0,0 +1,17 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class SkipInVSTSAttribute : Attribute, ITestCondition
+    {
+        public bool IsMet => string.IsNullOrEmpty(Environment.GetEnvironmentVariable("SYSTEM_TASKDEFINITIONSURI"));
+
+        public string SkipReason => "Running in VSTS";
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7984193e295ed493eb0f7c955a9c61be9aa451d3
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs
@@ -0,0 +1,83 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Diagnostics;
+using System.Linq;
+
+namespace Microsoft.AspNetCore.Server.IntegrationTesting
+{
+    public class AppVerifier
+    {
+        private static readonly TimeSpan AppVerifierCommandTimeout = TimeSpan.FromSeconds(5);
+
+        public static IDisposable Disable(ServerType serverType, int code)
+        {
+            // Set in SetupTestEnvironment.ps1
+            var enabledCodes = (Environment.GetEnvironmentVariable("APPVERIFIER_ENABLED_CODES") ?? "").Split(' ');
+            string processName;
+            switch (serverType)
+            {
+                case ServerType.IISExpress:
+                    processName = "iisexpress.exe";
+                    break;
+                case ServerType.IIS:
+                    processName = "w3wp.exe";
+                    break;
+                default:
+                    throw new ArgumentOutOfRangeException(nameof(serverType), serverType, null);
+            }
+
+            if (!enabledCodes.Contains(code.ToString()))
+            {
+                return null;
+            }
+
+            RunProcessAndWaitForExit("appverif.exe", $"-configure {code} -for {processName} -with ErrorReport=0", AppVerifierCommandTimeout);
+            return new AppVerifierToken(processName, code.ToString());
+        }
+
+        private static void RunProcessAndWaitForExit(string fileName, string arguments, TimeSpan timeout)
+        {
+            var startInfo = new ProcessStartInfo
+            {
+                FileName = fileName,
+                Arguments = arguments,
+                RedirectStandardOutput = true,
+                RedirectStandardError = true,
+                UseShellExecute = false,
+            };
+
+            var process = Process.Start(startInfo);
+
+            if (!process.WaitForExit((int)timeout.TotalMilliseconds))
+            {
+                process.Kill();
+            }
+
+            if (process.ExitCode != 0)
+            {
+                throw new InvalidOperationException($"Exit code {process.ExitCode} when running {fileName} {arguments}. Stdout: {process.StandardOutput.ReadToEnd()} Stderr: {process.StandardError.ReadToEnd()}");
+            }
+        }
+
+        public class AppVerifierToken : IDisposable
+        {
+            private readonly string _processName;
+
+            private readonly string _codes;
+
+            public AppVerifierToken(string processName, string codes)
+            {
+                _processName = processName;
+                _codes = codes;
+            }
+
+            public void Dispose()
+            {
+                //
+                RunProcessAndWaitForExit("appverif.exe", $"-configure {_codes} -for {_processName} -with ErrorReport={Environment.GetEnvironmentVariable("APPVERIFIER_LEVEL")}", AppVerifierCommandTimeout);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs
new file mode 100644
index 0000000000000000000000000000000000000000..78c77fd2ca4f59500d052b16fdde32a6ca8eca12
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs
@@ -0,0 +1,210 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text.RegularExpressions;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.Extensions.Logging;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public class EventLogHelpers
+    {
+        public static void VerifyEventLogEvent(IISDeploymentResult deploymentResult, string expectedRegexMatchString)
+        {
+            Assert.True(deploymentResult.HostProcess.HasExited);
+
+            var entries = GetEntries(deploymentResult);
+            AssertSingleEntry(expectedRegexMatchString, entries);
+        }
+
+        public static void VerifyEventLogEvent(IISDeploymentResult deploymentResult, string expectedRegexMatchString, ILogger logger)
+        {
+            Assert.True(deploymentResult.HostProcess.HasExited);
+
+            var entries = GetEntries(deploymentResult);
+            try
+            {
+                AssertSingleEntry(expectedRegexMatchString, entries);
+            }
+            catch (Exception ex)
+            {
+                foreach (var entry in entries)
+                {
+                    logger.LogInformation(entry.Message);
+                }
+                throw ex;
+            }
+        }
+
+        public static void VerifyEventLogEvents(IISDeploymentResult deploymentResult, params string[] expectedRegexMatchString)
+        {
+            Assert.True(deploymentResult.HostProcess.HasExited);
+
+            var entries = GetEntries(deploymentResult).ToList();
+            foreach (var regexString in expectedRegexMatchString)
+            {
+                var matchedEntries = AssertSingleEntry(regexString, entries);
+
+                foreach (var matchedEntry in matchedEntries)
+                {
+                    entries.Remove(matchedEntry);
+                }
+            }
+
+            Assert.True(0 == entries.Count, $"Some entries were not matched by any regex {FormatEntries(entries)}");
+        }
+
+        private static EventLogEntry[] AssertSingleEntry(string regexString, IEnumerable<EventLogEntry> entries)
+        {
+            var expectedRegex = new Regex(regexString, RegexOptions.Singleline);
+            var matchedEntries = entries.Where(entry => expectedRegex.IsMatch(entry.Message)).ToArray();
+            Assert.True(matchedEntries.Length > 0, $"No entries matched by '{regexString}'");
+            Assert.True(matchedEntries.Length < 2, $"Multiple entries matched by '{regexString}': {FormatEntries(matchedEntries)}");
+            return matchedEntries;
+        }
+
+        private static string FormatEntries(IEnumerable<EventLogEntry> entries)
+        {
+            return string.Join(",", entries.Select(e => e.Message));
+        }
+
+        private static IEnumerable<EventLogEntry> GetEntries(IISDeploymentResult deploymentResult)
+        {
+            var eventLog = new EventLog("Application");
+
+            // Eventlog is already sorted based on time of event in ascending time.
+            // Check results in reverse order.
+            var processIdString = $"Process Id: {deploymentResult.HostProcess.Id}.";
+
+            // Event log messages round down to the nearest second, so subtract a second
+            var processStartTime = deploymentResult.HostProcess.StartTime.AddSeconds(-1);
+            for (var i = eventLog.Entries.Count - 1; i >= 0; i--)
+            {
+                var eventLogEntry = eventLog.Entries[i];
+                if (eventLogEntry.TimeGenerated < processStartTime)
+                {
+                    // If event logs is older than the process start time, we didn't find a match.
+                    break;
+                }
+
+                if (eventLogEntry.ReplacementStrings == null ||
+                    eventLogEntry.ReplacementStrings.Length < 3)
+                {
+                    continue;
+                }
+
+                // ReplacementStings == EventData collection in EventLog
+                // This is unaffected if event providers are not registered correctly
+                if (eventLogEntry.Source == AncmVersionToMatch(deploymentResult) &&
+                    processIdString == eventLogEntry.ReplacementStrings[1])
+                {
+                    yield return eventLogEntry;
+                }
+            }
+        }
+
+        private static string AncmVersionToMatch(IISDeploymentResult deploymentResult)
+        {
+            return "IIS " +
+                (deploymentResult.DeploymentParameters.ServerType == ServerType.IISExpress ? "Express " : "") +
+                "AspNetCore Module" +
+                (deploymentResult.DeploymentParameters.AncmVersion == AncmVersion.AspNetCoreModuleV2 ? " V2" : "");
+        }
+
+        public static string Started(IISDeploymentResult deploymentResult)
+        {
+            if (deploymentResult.DeploymentParameters.HostingModel == HostingModel.InProcess)
+            {
+                return InProcessStarted(deploymentResult);
+            }
+            else
+            {
+                return OutOfProcessStarted(deploymentResult);
+            }
+        }
+
+        public static string InProcessStarted(IISDeploymentResult deploymentResult)
+        {
+            return $"Application '{EscapedContentRoot(deploymentResult)}' started the coreclr in-process successfully";
+        }
+
+        public static string OutOfProcessStarted(IISDeploymentResult deploymentResult)
+        {
+            return $"Application '/LM/W3SVC/1/ROOT' started process '\\d+' successfully and process '\\d+' is listening on port '\\d+'.";
+        }
+
+        public static string InProcessFailedToStart(IISDeploymentResult deploymentResult, string reason)
+        {
+            return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' failed to load clr and managed application. {reason}";
+        }
+
+        public static string InProcessFailedToStop(IISDeploymentResult deploymentResult, string reason)
+        {
+            return "Failed to gracefully shutdown application 'MACHINE/WEBROOT/APPHOST/.*?'.";
+        }
+
+        public static string InProcessThreadException(IISDeploymentResult deploymentResult, string reason)
+        {
+            return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' hit unexpected managed exception{reason}";
+        }
+
+        public static string InProcessThreadExit(IISDeploymentResult deploymentResult, string code)
+        {
+            return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' hit unexpected managed background thread exit, exit code = '{code}'.";
+        }
+        public static string InProcessThreadExitStdOut(IISDeploymentResult deploymentResult, string code, string output)
+        {
+            return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' hit unexpected managed background thread exit, exit code = '{code}'. Last 4KB characters of captured stdout and stderr logs:\r\n{output}";
+        }
+
+        public static string FailedToStartApplication(IISDeploymentResult deploymentResult, string code)
+        {
+            return $"Failed to start application '/LM/W3SVC/1/ROOT', ErrorCode '{code}'.";
+        }
+
+        public static string ConfigurationLoadError(IISDeploymentResult deploymentResult, string reason)
+        {
+            return $"Could not load configuration. Exception message: {reason}";
+        }
+
+        public static string OutOfProcessFailedToStart(IISDeploymentResult deploymentResult)
+        {
+            return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' failed to start process with " +
+                $"commandline '(.*)' with multiple retries. " +
+                $"The last try of listening port is '(.*)'. See previous warnings for details.";
+        }
+
+        public static string InProcessHostfxrInvalid(IISDeploymentResult deploymentResult)
+        {
+            return $"Hostfxr version used does not support 'hostfxr_get_native_search_directories', update the version of hostfxr to a higher version. Path to hostfxr: '(.*)'.";
+        }
+
+        public static string InProcessFailedToFindNativeDependencies(IISDeploymentResult deploymentResult)
+        {
+            return "Invoking hostfxr to find the inprocess request handler failed without finding any native dependencies. " +
+                "This most likely means the app is misconfigured, please check the versions of Microsoft.NetCore.App and Microsoft.AspNetCore.App that " +
+                "are targeted by the application and are installed on the machine.";
+        }
+
+        public static string InProcessFailedToFindRequestHandler(IISDeploymentResult deploymentResult)
+        {
+            return "Could not find the assembly '(.*)' referenced for the in-process application. Please confirm the Microsoft.AspNetCore.Server.IIS package is referenced in your application.";
+        }
+
+        private static string EscapedContentRoot(IISDeploymentResult deploymentResult)
+        {
+            var contentRoot = deploymentResult.ContentRoot;
+            if (!contentRoot.EndsWith('\\'))
+            {
+                contentRoot += '\\';
+            }
+            return Regex.Escape(contentRoot);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1a1a4ce490c65008aea7ecb88f34d31f09cd8e9e
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs
@@ -0,0 +1,59 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.Extensions.Logging.Testing;
+using Xunit.Abstractions;
+
+namespace Microsoft.AspNetCore.Server.IntegrationTesting
+{
+    public class FunctionalTestsBase : LoggedTest
+    {
+        private const string DebugEnvironmentVariable = "ASPNETCORE_MODULE_DEBUG";
+
+        public FunctionalTestsBase(ITestOutputHelper output = null) : base(output)
+        {
+        }
+
+        protected IISDeployerBase _deployer;
+
+        protected ApplicationDeployer CreateDeployer(IISDeploymentParameters parameters)
+        {
+            if (parameters.ServerType == ServerType.IISExpress &&
+                !parameters.EnvironmentVariables.ContainsKey(DebugEnvironmentVariable))
+            {
+                parameters.EnvironmentVariables[DebugEnvironmentVariable] = "console";
+            }
+
+            return IISApplicationDeployerFactory.Create(parameters, LoggerFactory);
+        }
+
+        protected virtual async Task<IISDeploymentResult> DeployAsync(IISDeploymentParameters parameters)
+        {
+            _deployer = (IISDeployerBase)CreateDeployer(parameters);
+            return (IISDeploymentResult)await _deployer.DeployAsync();
+        }
+
+        protected virtual async Task<IISDeploymentResult> StartAsync(IISDeploymentParameters parameters)
+        {
+            var result = await DeployAsync(parameters);
+            await result.AssertStarts();
+            return result;
+        }
+
+        public override void Dispose()
+        {
+            StopServer(false);
+        }
+
+        public void StopServer(bool gracefulShutdown = true)
+        {
+            _deployer?.Dispose(gracefulShutdown);
+            _deployer = null;
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1e31126eabe4efd920be4720224d6800f2aaf511
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs
@@ -0,0 +1,241 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Net.Http;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public static class Helpers
+    {
+        private static readonly TimeSpan RetryRequestDelay = TimeSpan.FromMilliseconds(100);
+        private static readonly int RetryRequestCount = 10;
+
+        public static string GetTestWebSitePath(string name)
+        {
+            return Path.Combine(TestPathUtilities.GetSolutionRootDirectory("IISIntegration"),"test", "WebSites", name);
+        }
+
+        public static string GetInProcessTestSitesPath()
+        {
+            return DeployerSelector.IsForwardsCompatibilityTest ? GetTestWebSitePath("InProcessForwardsCompatWebSite") : GetTestWebSitePath("InProcessWebSite");
+        }
+
+        public static string GetOutOfProcessTestSitesPath() => GetTestWebSitePath("OutOfProcessWebSite");
+
+        public static async Task AssertStarts(this IISDeploymentResult deploymentResult, string path = "/HelloWorld")
+        {
+            var response = await deploymentResult.HttpClient.GetAsync(path);
+
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.Equal("Hello World", responseText);
+        }
+
+        public static async Task StressLoad(HttpClient httpClient, string path, Action<HttpResponseMessage> action)
+        {
+            async Task RunRequests()
+            {
+                var connection = new HttpClient() { BaseAddress = httpClient.BaseAddress };
+
+                for (int j = 0; j < 10; j++)
+                {
+                    var response = await connection.GetAsync(path);
+                    action(response);
+                }
+            }
+
+            List<Task> tasks = new List<Task>();
+            for (int i = 0; i < 10; i++)
+            {
+                tasks.Add(Task.Run(RunRequests));
+            }
+
+            await Task.WhenAll(tasks);
+        }
+
+        public static string GetFrebFolder(string folder, IISDeploymentResult result)
+        {
+            if (result.DeploymentParameters.ServerType == ServerType.IISExpress)
+            {
+                return Path.Combine(folder, result.DeploymentParameters.SiteName);
+            }
+            else
+            {
+                return Path.Combine(folder, "W3SVC1");
+            }
+        }
+
+        public static void CopyFiles(DirectoryInfo source, DirectoryInfo target, ILogger logger)
+        {
+            foreach (DirectoryInfo directoryInfo in source.GetDirectories())
+            {
+                if (directoryInfo.FullName != target.FullName)
+                {
+                    CopyFiles(directoryInfo, target.CreateSubdirectory(directoryInfo.Name), logger);
+                }
+            }
+            logger?.LogDebug($"Processing {target.FullName}");
+            foreach (FileInfo fileInfo in source.GetFiles())
+            {
+                logger?.LogDebug($"  Copying {fileInfo.Name}");
+                var destFileName = Path.Combine(target.FullName, fileInfo.Name);
+                fileInfo.CopyTo(destFileName);
+            }
+        }
+
+        public static void ModifyWebConfig(this DeploymentResult deploymentResult, Action<XElement> action)
+        {
+            var webConfigPath = Path.Combine(deploymentResult.ContentRoot, "web.config");
+            var document = XDocument.Load(webConfigPath);
+            action(document.Root);
+            document.Save(webConfigPath);
+        }
+
+        public static Task<HttpResponseMessage> RetryRequestAsync(this HttpClient client, string uri, Func<HttpResponseMessage, bool> predicate)
+        {
+            return RetryRequestAsync(client, uri, message => Task.FromResult(predicate(message)));
+        }
+
+        public static async Task<HttpResponseMessage> RetryRequestAsync(this HttpClient client, string uri, Func<HttpResponseMessage, Task<bool>> predicate)
+        {
+            HttpResponseMessage response = await client.GetAsync(uri);
+
+            for (var i = 0; i < RetryRequestCount && !await predicate(response); i++)
+            {
+                // Keep retrying until app_offline is present.
+                response = await client.GetAsync(uri);
+                await Task.Delay(RetryRequestDelay);
+            }
+
+            if (!await predicate(response))
+            {
+                throw new InvalidOperationException($"Didn't get response that satisfies predicate after {RetryRequestCount} retries");
+            }
+
+            return response;
+        }
+
+        public static async Task Retry(Func<Task> func, int attempts, int msDelay)
+        {
+            var exceptions = new List<Exception>();
+
+            for (var attempt = 0; attempt < attempts; attempt++)
+            {
+                try
+                {
+                    await func();
+                    return;
+                }
+                catch (Exception e)
+                {
+                    exceptions.Add(e);
+                }
+                await Task.Delay(msDelay);
+            }
+
+            throw new AggregateException(exceptions);
+        }
+
+        public static void AssertWorkerProcessStop(this IISDeploymentResult deploymentResult, int? timeout = null)
+        {
+            var hostProcess = deploymentResult.HostProcess;
+            Assert.True(hostProcess.WaitForExit(timeout ?? (int)TimeoutExtensions.DefaultTimeoutValue.TotalMilliseconds));
+
+            if (deploymentResult.DeploymentParameters.ServerType == ServerType.IISExpress)
+            {
+                Assert.Equal(0, hostProcess.ExitCode);
+            }
+        }
+
+
+        public static async Task AssertRecycledAsync(this IISDeploymentResult deploymentResult, Func<Task> verificationAction = null)
+        {
+            if (deploymentResult.DeploymentParameters.HostingModel != HostingModel.InProcess)
+            {
+                throw new NotSupportedException();
+            }
+
+            deploymentResult.AssertWorkerProcessStop();
+            if (deploymentResult.DeploymentParameters.ServerType == ServerType.IIS)
+            {
+                verificationAction = verificationAction ?? (() => deploymentResult.AssertStarts());
+                await verificationAction();
+            }
+        }
+
+        public static IEnumerable<object[]> ToTheoryData<T>(this Dictionary<string, T> dictionary)
+        {
+            return dictionary.Keys.Select(k => new[] { k });
+        }
+
+        public static string GetExpectedLogName(IISDeploymentResult deploymentResult, string logFolderPath)
+        {
+            var startTime = deploymentResult.HostProcess.StartTime.ToUniversalTime();
+
+            if (deploymentResult.DeploymentParameters.HostingModel == HostingModel.InProcess)
+            {
+                return Path.Combine(logFolderPath, $"std_{startTime.Year}{startTime.Month:D2}" +
+                $"{startTime.Day:D2}{startTime.Hour:D2}" +
+                $"{startTime.Minute:D2}{startTime.Second:D2}_" +
+                $"{deploymentResult.HostProcess.Id}.log");
+            }
+            else
+            {
+                return Directory.GetFiles(logFolderPath).Single();
+            }
+        }
+
+        public static void ModifyFrameworkVersionInRuntimeConfig(IISDeploymentResult deploymentResult)
+        {
+            var path = Path.Combine(deploymentResult.ContentRoot, "InProcessWebSite.runtimeconfig.json");
+            dynamic depsFileContent = JsonConvert.DeserializeObject(File.ReadAllText(path));
+            depsFileContent["runtimeOptions"]["framework"]["version"] = "2.9.9";
+            var output = JsonConvert.SerializeObject(depsFileContent);
+            File.WriteAllText(path, output);
+        }
+
+        public static void AllowNoLogs(this IISDeploymentResult deploymentResult)
+        {
+            File.AppendAllText(
+                Path.Combine(deploymentResult.DeploymentParameters.PublishedApplicationRootPath, "aspnetcore-debug.log"),
+                "Running test allowed log file to be empty." + Environment.NewLine);
+        }
+
+        public static string ReadAllTextFromFile(string filename, ILogger logger)
+        {
+            try
+            {
+                return File.ReadAllText(filename);
+            }
+            catch (Exception ex)
+            {
+                // check if there is a dotnet.exe, iisexpress.exe, or w3wp.exe processes still running.
+                var hostingProcesses = Process.GetProcessesByName("dotnet")
+                    .Concat(Process.GetProcessesByName("iisexpress"))
+                    .Concat(Process.GetProcessesByName("w3wp"));
+
+                logger.LogError($"Could not read file content. Exception message {ex.Message}");
+                logger.LogError("Current hosting exes running:");
+
+                foreach (var hostingProcess in hostingProcesses)
+                {
+                    logger.LogError($"{hostingProcess.ProcessName} pid: {hostingProcess.Id} hasExited: {hostingProcess.HasExited.ToString()}");
+                }
+                throw ex;
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0a080bb702737ac0f8fbfe4a6964a17829d1667f
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs
@@ -0,0 +1,22 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Flags]
+    public enum IISCapability
+    {
+        None = 0,
+        Websockets = 1,
+        WindowsAuthentication = 2,
+        PoolEnvironmentVariables = 4,
+        ShutdownToken = 8,
+        DynamicCompression = 16,
+        ApplicationInitialization = 32,
+        TracingModule = 64,
+        FailedRequestTracingModule = 128,
+        BasicAuthentication = 256
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2c424943f35ee6daa26cfe9d54eb35ce1c303282
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs
@@ -0,0 +1,13 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [CollectionDefinition(Name)]
+    public class IISCompressionSiteCollection : ICollectionFixture<IISCompressionSiteFixture>
+    {
+        public const string Name = nameof(IISCompressionSiteCollection);
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3aff68d11bc6b348a24c7a43ea119ab321d7cef6
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs
@@ -0,0 +1,44 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Testing;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public class IISCompressionSiteFixture : IISTestSiteFixture
+    {
+        public IISCompressionSiteFixture() : base(Configure)
+        {
+        }
+
+        private static void Configure(IISDeploymentParameters deploymentParameters)
+        {
+            // Enable dynamic compression
+            deploymentParameters.ServerConfigActionList.Add(
+                (element, _) => {
+                    var webServerElement = element
+                        .RequiredElement("system.webServer");
+
+                    webServerElement
+                        .GetOrAdd("urlCompression")
+                        .SetAttributeValue("doDynamicCompression", "true");
+
+                    webServerElement
+                        .GetOrAdd("httpCompression")
+                        .GetOrAdd("dynamicTypes")
+                        .GetOrAdd("add", "mimeType", "text/*")
+                        .SetAttributeValue("enabled", "true");
+
+                });
+
+            deploymentParameters.EnableModule("DynamicCompressionModule", "%IIS_BIN%\\compdyn.dll");
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a20a5e2e0e073bd1ce21167bc1b2ca791418831f
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs
@@ -0,0 +1,15 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Xunit.Abstractions;
+
+namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities
+{
+    public class IISFunctionalTestBase : FunctionalTestsBase
+    {
+        public IISFunctionalTestBase(ITestOutputHelper output = null) : base(output)
+        {
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs
new file mode 100644
index 0000000000000000000000000000000000000000..562d63adbee8484679fa91d6af074bbef93127d3
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs
@@ -0,0 +1,29 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    /// <summary>
+    /// This type just maps collection names to available fixtures
+    /// </summary>
+    [CollectionDefinition(Name)]
+    public class IISTestSiteCollection : ICollectionFixture<IISTestSiteFixture>
+    {
+        public const string Name = nameof(IISTestSiteCollection);
+    }
+
+    [CollectionDefinition(Name)]
+    public class OutOfProcessTestSiteCollection : ICollectionFixture<OutOfProcessTestSiteFixture>
+    {
+        public const string Name = nameof(OutOfProcessTestSiteCollection);
+    }
+
+    [CollectionDefinition(Name)]
+    public class OutOfProcessV1TestSiteCollection : ICollectionFixture<OutOfProcessV1TestSiteFixture>
+    {
+        public const string Name = nameof(OutOfProcessV1TestSiteCollection);
+    }
+
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e8cfd8f6411615a0c4672a237874d3d2d5cb97f5
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs
@@ -0,0 +1,191 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Testing;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public class OutOfProcessTestSiteFixture : IISTestSiteFixture
+    {
+        public OutOfProcessTestSiteFixture() : base(Configure)
+        {
+        }
+
+        private static void Configure(IISDeploymentParameters deploymentParameters)
+        {
+            deploymentParameters.ApplicationPath = Helpers.GetOutOfProcessTestSitesPath();
+            deploymentParameters.HostingModel = HostingModel.OutOfProcess;
+        }
+    }
+
+    public class OutOfProcessV1TestSiteFixture : IISTestSiteFixture
+    {
+        public OutOfProcessV1TestSiteFixture() : base(Configure)
+        {
+        }
+
+        private static void Configure(IISDeploymentParameters deploymentParameters)
+        {
+            deploymentParameters.ApplicationPath = Helpers.GetOutOfProcessTestSitesPath();
+            deploymentParameters.HostingModel = HostingModel.OutOfProcess;
+            deploymentParameters.AncmVersion = AncmVersion.AspNetCoreModule;
+        }
+    }
+
+    public class IISTestSiteFixture : IDisposable
+    {
+        private ApplicationDeployer _deployer;
+        private ILoggerFactory _loggerFactory;
+        private ForwardingProvider _forwardingProvider;
+        private IISDeploymentResult _deploymentResult;
+        private readonly Action<IISDeploymentParameters> _configure;
+
+        public IISTestSiteFixture() : this(_ => { })
+        {
+        }
+
+        public IISTestSiteFixture(Action<IISDeploymentParameters> configure)
+        {
+            var logging = AssemblyTestLog.ForAssembly(typeof(IISTestSiteFixture).Assembly);
+            _loggerFactory = logging.CreateLoggerFactory(null, nameof(IISTestSiteFixture));
+
+            _forwardingProvider = new ForwardingProvider();
+            _loggerFactory.AddProvider(_forwardingProvider);
+
+            _configure = configure;
+        }
+
+        public HttpClient Client => DeploymentResult.HttpClient;
+        public IISDeploymentResult DeploymentResult
+        {
+            get
+            {
+                EnsureInitialized();
+                return _deploymentResult;
+            }
+        }
+
+        public TestConnection CreateTestConnection()
+        {
+            return new TestConnection(Client.BaseAddress.Port);
+        }
+
+        public void Dispose()
+        {
+            _deployer?.Dispose();
+        }
+
+        public void Attach(LoggedTest test)
+        {
+            if (_forwardingProvider.LoggerFactory != null)
+            {
+                throw new InvalidOperationException("Test instance is already attached to this fixture");
+            }
+
+            _forwardingProvider.LoggerFactory = test.LoggerFactory;
+        }
+
+        public void Detach(LoggedTest test)
+        {
+            if (_forwardingProvider.LoggerFactory != test.LoggerFactory)
+            {
+                throw new InvalidOperationException("Different test is attached to this fixture");
+            }
+
+            _forwardingProvider.LoggerFactory = null;
+        }
+
+        private void EnsureInitialized()
+        {
+            if (_deployer != null)
+            {
+                return;
+            }
+
+            var deploymentParameters = new IISDeploymentParameters(Helpers.GetInProcessTestSitesPath(),
+                DeployerSelector.ServerType,
+                RuntimeFlavor.CoreClr,
+                RuntimeArchitecture.x64)
+            {
+                TargetFramework = Tfm.NetCoreApp22,
+                AncmVersion = AncmVersion.AspNetCoreModuleV2,
+                HostingModel = HostingModel.InProcess,
+                PublishApplicationBeforeDeployment = true,
+            };
+
+            _configure(deploymentParameters);
+
+            _deployer = IISApplicationDeployerFactory.Create(deploymentParameters, _loggerFactory);
+            _deploymentResult = (IISDeploymentResult)_deployer.DeployAsync().Result;
+        }
+
+        private class ForwardingProvider : ILoggerProvider
+        {
+            private readonly List<ForwardingLogger> _loggers = new List<ForwardingLogger>();
+
+            private ILoggerFactory _loggerFactory;
+
+            public ILoggerFactory LoggerFactory
+            {
+                get => _loggerFactory;
+                set
+                {
+
+                    lock (_loggers)
+                    {
+                        _loggerFactory = value;
+                        foreach (var logger in _loggers)
+                        {
+                            logger.Logger = _loggerFactory?.CreateLogger("FIXTURE:" + logger.Name);
+                        }
+                    }
+                }
+            }
+
+            public void Dispose()
+            {
+                lock (_loggers)
+                {
+                    _loggers.Clear();
+                }
+            }
+
+            public ILogger CreateLogger(string categoryName)
+            {
+                lock (_loggers)
+                {
+                    var logger = new ForwardingLogger(categoryName);
+                    _loggers.Add(logger);
+                    return logger;
+                }
+            }
+        }
+
+        internal class ForwardingLogger : ILogger
+        {
+            public ForwardingLogger(string name)
+            {
+                Name = name;
+            }
+
+            public ILogger Logger { get; set; }
+            public string Name { get; set; }
+
+            public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
+            {
+                Logger?.Log(logLevel, eventId, state, exception, formatter);
+            }
+
+            public bool IsEnabled(LogLevel logLevel) => Logger?.IsEnabled(logLevel) == true;
+
+            public IDisposable BeginScope<TState>(TState state) => Logger?.BeginScope(state);
+        }
+    }
+
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs
new file mode 100644
index 0000000000000000000000000000000000000000..17885f3547c8a542dae1728914c0bc836b453e18
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs
@@ -0,0 +1,34 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Xunit.Abstractions;
+
+namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities
+{
+    public class LogFileTestBase : IISFunctionalTestBase
+    {
+        protected string _logFolderPath;
+
+        public LogFileTestBase(ITestOutputHelper output = null) : base(output)
+        {
+            _logFolderPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
+        }
+        public override void Dispose()
+        {
+            base.Dispose();
+            if (Directory.Exists(_logFolderPath))
+            {
+                Directory.Delete(_logFolderPath, true);
+            }
+        }
+
+        public string GetLogFileContent(IISDeploymentResult deploymentResult)
+        {
+            return Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, _logFolderPath), Logger);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d2749db547d62c2589509a596cdb48088c5724f9
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs
@@ -0,0 +1,24 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class RequiresEnvironmentVariableAttribute : Attribute, ITestCondition
+    {
+        private readonly string _name;
+
+        public RequiresEnvironmentVariableAttribute(string name)
+        {
+            _name = name;
+        }
+
+        public bool IsMet => !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(_name));
+
+        public string SkipReason => $"Environment variable {_name} is required to run this test.";
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6cdd7253926dfc4f9d3267f063a1b91079200790
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs
@@ -0,0 +1,22 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class SkipIfDebugAttribute : Attribute, ITestCondition
+    {
+        public bool IsMet =>
+        #if DEBUG
+            false;
+        #else 
+            true;
+        #endif
+
+        public string SkipReason => "Test cannot be run in Debug mode.";
+    }
+}
diff --git a/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs b/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8431b1580199a022e2690e87e1cc6bfcf52c7299
--- /dev/null
+++ b/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs
@@ -0,0 +1,52 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class WindowsAuthTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public WindowsAuthTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22, Tfm.Net461)
+                .WithApplicationTypes(ApplicationType.Portable)
+                .WithAllAncmVersions()
+                .WithAllHostingModels();
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.WindowsAuthentication)]
+        [MemberData(nameof(TestVariants))]
+        public async Task WindowsAuthTest(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
+            deploymentParameters.SetAnonymousAuth(enabled: false);
+            deploymentParameters.SetWindowsAuth();
+
+            // The default in hosting sets windows auth to true.
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var client = deploymentResult.CreateClient(new HttpClientHandler { UseDefaultCredentials = true });
+            var response = await client.GetAsync("/Auth");
+            var responseText = await response.Content.ReadAsStringAsync();
+
+            Assert.StartsWith("Windows:", responseText);
+            Assert.Contains(Environment.UserName, responseText);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.Tests/Common.Tests.csproj b/src/IISIntegration/test/Common.Tests/Common.Tests.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..ede80732eeb913c81256b6cd0c41664eafa16988
--- /dev/null
+++ b/src/IISIntegration/test/Common.Tests/Common.Tests.csproj
@@ -0,0 +1,22 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
+    <IsTestProject>false</IsTestProject>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" />
+    <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs b/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs
new file mode 100644
index 0000000000000000000000000000000000000000..78f76e41c2b27be1884ae1e9bd8a55555c19de67
--- /dev/null
+++ b/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs
@@ -0,0 +1,25 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+
+namespace Microsoft.AspNetCore.Server.IntegrationTesting
+{
+    public class DisposableList<T> : List<T>, IDisposable where T : IDisposable
+    {
+        public DisposableList() : base() { }
+
+        public DisposableList(IEnumerable<T> collection) : base(collection) { }
+
+        public DisposableList(int capacity) : base(capacity) { }
+
+        public void Dispose()
+        {
+            foreach (var item in this)
+            {
+                item?.Dispose();
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs b/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3b7a870cf3ec09d908e7a80138f9755b18c988fb
--- /dev/null
+++ b/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs
@@ -0,0 +1,252 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IntegrationTesting
+{
+    /// <summary>
+    /// Summary description for TestConnection
+    /// </summary>
+    public class TestConnection : IDisposable
+    {
+        private static readonly TimeSpan Timeout = TimeSpan.FromMinutes(1);
+
+        private readonly bool _ownsSocket;
+        private readonly Socket _socket;
+        private readonly NetworkStream _stream;
+
+        public TestConnection(int port)
+            : this(port, AddressFamily.InterNetwork)
+        {
+        }
+
+        public TestConnection(int port, AddressFamily addressFamily)
+            : this(CreateConnectedLoopbackSocket(port, addressFamily), ownsSocket: true)
+        {
+        }
+
+        public TestConnection(Socket socket)
+            : this(socket, ownsSocket: false)
+        {
+        }
+
+        private TestConnection(Socket socket, bool ownsSocket)
+        {
+            _ownsSocket = ownsSocket;
+            _socket = socket;
+            _stream = new NetworkStream(_socket, ownsSocket: false);
+        }
+
+        public Socket Socket => _socket;
+        public Stream Stream => _stream;
+
+        public void Dispose()
+        {
+            _stream.Dispose();
+
+            if (_ownsSocket)
+            {
+                _socket.Dispose();
+            }
+        }
+
+        public async Task Send(params string[] lines)
+        {
+            var bytes = Encoding.ASCII.GetBytes(string.Join("\r\n", lines));
+
+            for (var index = 0; index < bytes.Length; index++)
+            {
+                await _stream.WriteAsync(bytes, index, 1).ConfigureAwait(false);
+                await _stream.FlushAsync().ConfigureAwait(false);
+                // Re-add delay to help find socket input consumption bugs more consistently
+                //await Task.Delay(TimeSpan.FromMilliseconds(5));
+            }
+        }
+
+        public async Task<int> ReadCharAsync()
+        {
+            var bytes = new byte[1];
+            return (await _stream.ReadAsync(bytes, 0, 1) == 1) ? bytes[0] : -1;
+        }
+
+        public async Task<string> ReadLineAsync()
+        {
+            var builder = new StringBuilder();
+            var current = await ReadCharAsync();
+            while (current != '\r')
+            {
+                builder.Append((char)current);
+                current = await ReadCharAsync();
+            }
+
+            // Consume \n
+            await ReadCharAsync();
+
+            return builder.ToString();
+        }
+
+        public async Task<Memory<byte>> ReceiveChunk()
+        {
+            var length = int.Parse(await ReadLineAsync(), System.Globalization.NumberStyles.HexNumber);
+
+            var bytes = await Receive(length);
+
+            await ReadLineAsync();
+
+            return bytes;
+        }
+
+        public async Task ReceiveChunk(string expected)
+        {
+            Assert.Equal(expected, Encoding.ASCII.GetString((await ReceiveChunk()).Span));
+        }
+
+        public async Task Receive(params string[] lines)
+        {
+            var expected = string.Join("\r\n", lines);
+            var actual = await Receive(expected.Length);
+
+            Assert.Equal(expected, Encoding.ASCII.GetString(actual.Span));
+        }
+
+        private async Task<Memory<byte>> Receive(int length)
+        {
+            var actual = new byte[length];
+            int offset = 0;
+            try
+            {
+                while (offset < length)
+                {
+                    var task = _stream.ReadAsync(actual, offset, actual.Length - offset);
+                    if (!Debugger.IsAttached)
+                    {
+                        task = task.TimeoutAfter(Timeout);
+                    }
+
+                    var count = await task.ConfigureAwait(false);
+                    if (count == 0)
+                    {
+                        break;
+                    }
+
+                    offset += count;
+                }
+            }
+            catch (TimeoutException ex) when (offset != 0)
+            {
+                throw new TimeoutException(
+                    $"Did not receive a complete response within {Timeout}.{Environment.NewLine}{Environment.NewLine}" +
+                    $"Expected:{Environment.NewLine}{length} bytes of data{Environment.NewLine}{Environment.NewLine}" +
+                    $"Actual:{Environment.NewLine}{Encoding.ASCII.GetString(actual, 0, offset)}{Environment.NewLine}",
+                    ex);
+            }
+
+            return actual.AsMemory(0, offset);
+        }
+
+        public async Task ReceiveStartsWith(string prefix, int maxLineLength = 1024)
+        {
+            var actual = new byte[maxLineLength];
+            var offset = 0;
+
+            while (offset < maxLineLength)
+            {
+                // Read one char at a time so we don't read past the end of the line.
+                var task = _stream.ReadAsync(actual, offset, 1);
+                if (!Debugger.IsAttached)
+                {
+                    Assert.True(task.Wait(4000), "timeout");
+                }
+                var count = await task.ConfigureAwait(false);
+                if (count == 0)
+                {
+                    break;
+                }
+
+                Assert.True(count == 1);
+                offset++;
+
+                if (actual[offset - 1] == '\n')
+                {
+                    break;
+                }
+            }
+
+            var actualLine = Encoding.ASCII.GetString(actual, 0, offset);
+            Assert.StartsWith(prefix, actualLine);
+        }
+
+        public async Task<string[]> ReceiveHeaders(params string[] lines)
+        {
+            List<string> headers = new List<string>();
+            string line;
+            do
+            {
+                line = await ReadLineAsync();
+                headers.Add(line);
+            } while (line != "");
+
+            foreach (var s in lines)
+            {
+                Assert.Contains(s, headers);
+            }
+
+            return headers.ToArray();
+        }
+
+        public Task WaitForConnectionClose()
+        {
+            var tcs = new TaskCompletionSource<object>();
+            var eventArgs = new SocketAsyncEventArgs();
+            eventArgs.SetBuffer(new byte[128], 0, 128);
+            eventArgs.Completed += ReceiveAsyncCompleted;
+            eventArgs.UserToken = tcs;
+
+            if (!_socket.ReceiveAsync(eventArgs))
+            {
+                ReceiveAsyncCompleted(this, eventArgs);
+            }
+
+            return tcs.Task;
+        }
+
+        private void ReceiveAsyncCompleted(object sender, SocketAsyncEventArgs e)
+        {
+            var tcs = (TaskCompletionSource<object>)e.UserToken;
+            if (e.BytesTransferred == 0)
+            {
+                tcs.SetResult(null);
+            }
+            else
+            {
+                tcs.SetException(new IOException(
+                    $"Expected connection close, received data instead: \"{Encoding.ASCII.GetString(e.Buffer, 0, e.BytesTransferred)}\""));
+            }
+        }
+
+        public static Socket CreateConnectedLoopbackSocket(int port, AddressFamily addressFamily)
+        {
+            if (addressFamily != AddressFamily.InterNetwork && addressFamily != AddressFamily.InterNetworkV6)
+            {
+                throw new ArgumentException($"TestConnection does not support address family of type {addressFamily}", nameof(addressFamily));
+            }
+
+            var socket = new Socket(addressFamily, SocketType.Stream, ProtocolType.Tcp);
+            var address = addressFamily == AddressFamily.InterNetworkV6
+                ? IPAddress.IPv6Loopback
+                : IPAddress.Loopback;
+            socket.Connect(new IPEndPoint(address, port));
+            return socket;
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs b/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ce7175dff9207d06d6b80fa22bc5e288c9a48e3d
--- /dev/null
+++ b/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs
@@ -0,0 +1,26 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Runtime.CompilerServices;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+
+namespace Microsoft.AspNetCore.Server.IntegrationTesting
+{
+
+    public static class TimeoutExtensions
+    {
+        public static TimeSpan DefaultTimeoutValue = TimeSpan.FromSeconds(300);
+
+        public static Task DefaultTimeout(this Task task, [CallerFilePath] string filePath = null, [CallerLineNumber] int lineNumber = -1)
+        {
+            return task.TimeoutAfter(DefaultTimeoutValue, filePath, lineNumber);
+        }
+
+        public static Task<T> DefaultTimeout<T>(this Task<T> task, [CallerFilePath] string filePath = null, [CallerLineNumber] int lineNumber = -1)
+        {
+            return task.TimeoutAfter(DefaultTimeoutValue, filePath, lineNumber);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj b/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj
new file mode 100644
index 0000000000000000000000000000000000000000..87dbd1667563ae3836b179714f6416f466a72cfc
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{1eac8125-1765-4e2d-8cbe-56dc98a1c8c1}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+    <ConfigurationType>Application</ConfigurationType>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings" />
+  <ImportGroup Label="Shared" />
+  <ImportGroup Label="PropertySheets" />
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <ItemGroup>
+    <ClInclude Include="Helpers.h" />
+    <ClInclude Include="fakeclasses.h" />
+    <ClInclude Include="stdafx.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="ConfigUtilityTests.cpp" />
+    <ClCompile Include="FileOutputManagerTests.cpp" />
+    <ClCompile Include="GlobalVersionTests.cpp" />
+    <ClCompile Include="Helpers.cpp" />
+    <ClCompile Include="hostfxr_utility_tests.cpp" />
+    <ClCompile Include="inprocess_application_tests.cpp" />
+    <ClCompile Include="main.cpp" />
+    <ClCompile Include="PipeOutputManagerTests.cpp" />
+    <ClCompile Include="utility_tests.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\AspNetCoreModuleV2\AspNetCore\AspNetCore.vcxproj">
+      <Project>{ec82302f-d2f0-4727-99d1-eabc0dd9dc3b}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\AspNetCoreModuleV2\CommonLib\CommonLib.vcxproj">
+      <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\AspNetCoreModuleV2\IISLib\IISLib.vcxproj">
+      <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\AspNetCoreModuleV2\RequestHandlerLib\RequestHandlerLib.vcxproj">
+      <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\gtest\gtest.vcxproj">
+      <Project>{cac1267b-8778-4257-aac6-caf481723b01}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\InProcessRequestHandler.vcxproj">
+      <Project>{d57ea297-6dc2-4bc0-8c91-334863327863}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemDefinitionGroup />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <MinimalRebuild>true</MinimalRebuild>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest\googletest\googletest\include;..\gtest\googletest\googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\</AdditionalIncludeDirectories>
+      <AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <AdditionalLibraryDirectories>..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\$(Configuration)\;</AdditionalLibraryDirectories>
+      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;inprocessapplication.obj;inprocesshandler.obj;ahadmin.lib;Rpcrt4.lib;inprocessapplicationbase.obj;stdafx.obj;version.lib;inprocessoptions.obj;%(AdditionalDependencies)</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+    <Lib>
+      <AdditionalDependencies>
+      </AdditionalDependencies>
+    </Lib>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <MinimalRebuild>true</MinimalRebuild>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest\googletest\googletest\include;..\gtest\googletest\googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\</AdditionalIncludeDirectories>
+      <AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <AdditionalLibraryDirectories>..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\x64\$(Configuration)\;</AdditionalLibraryDirectories>
+      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;inprocessapplication.obj;inprocesshandler.obj;ahadmin.lib;Rpcrt4.lib;inprocessapplicationbase.obj;stdafx.obj;version.lib;inprocessoptions.obj;%(AdditionalDependencies)</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+    <Lib>
+      <AdditionalDependencies>
+      </AdditionalDependencies>
+    </Lib>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest\googletest\googletest\include;..\gtest\googletest\googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\</AdditionalIncludeDirectories>
+      <AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalLibraryDirectories>..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\$(Configuration)\;</AdditionalLibraryDirectories>
+      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;inprocessapplication.obj;inprocesshandler.obj;ahadmin.lib;Rpcrt4.lib;inprocessapplicationbase.obj;stdafx.obj;version.lib;inprocessoptions.obj;%(AdditionalDependencies)</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+    <Lib>
+      <AdditionalDependencies>
+      </AdditionalDependencies>
+    </Lib>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <PreprocessorDefinitions>X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest\googletest\googletest\include;..\gtest\googletest\googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\</AdditionalIncludeDirectories>
+      <AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <AdditionalLibraryDirectories>..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\x64\$(Configuration)\;</AdditionalLibraryDirectories>
+      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;inprocessapplication.obj;inprocesshandler.obj;ahadmin.lib;Rpcrt4.lib;inprocessapplicationbase.obj;stdafx.obj;version.lib;inprocessoptions.obj;%(AdditionalDependencies)</AdditionalDependencies>
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+    </Link>
+    <Lib>
+      <AdditionalDependencies>
+      </AdditionalDependencies>
+    </Lib>
+  </ItemDefinitionGroup>
+  <Import Project=".\NativeTests.targets" />
+</Project>
\ No newline at end of file
diff --git a/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp b/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9b5bf6e9e69a579db0e64b2ea9accf54fb7a5cc8
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp
@@ -0,0 +1,123 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+#include "gmock/gmock.h"
+using ::testing::_;
+using ::testing::NiceMock;
+
+namespace ConfigUtilityTests
+{
+    using ::testing::Test;
+
+    class ConfigUtilityTest : public Test
+    {
+    protected:
+        void TestHandlerVersion(std::wstring key, std::wstring value, std::wstring expected, HRESULT(*func)(IAppHostElement*, STRU&))
+        {
+            IAppHostElement* retElement = NULL;
+
+            STRU handlerVersion;
+
+            // NiceMock removes warnings about "uninteresting calls",
+            auto element = std::make_unique<NiceMock<MockElement>>();
+            auto innerElement = std::make_unique<NiceMock<MockElement>>();
+            auto collection = std::make_unique<NiceMock<MockCollection>>();
+            auto nameElement = std::make_unique<NiceMock<MockElement>>();
+            auto mockProperty = std::make_unique<NiceMock<MockProperty>>();
+
+            ON_CALL(*element, GetElementByName(_, _))
+                .WillByDefault(DoAll(testing::SetArgPointee<1>(innerElement.get()), testing::Return(S_OK)));
+            ON_CALL(*innerElement, get_Collection(_))
+                .WillByDefault(testing::DoAll(testing::SetArgPointee<0>(collection.get()), testing::Return(S_OK)));
+            ON_CALL(*collection, get_Count(_))
+                .WillByDefault(DoAll(testing::SetArgPointee<0>(1), testing::Return(S_OK)));
+            ON_CALL(*collection, get_Item(_, _))
+                .WillByDefault(DoAll(testing::SetArgPointee<1>(nameElement.get()), testing::Return(S_OK)));
+            ON_CALL(*nameElement, GetPropertyByName(_, _))
+                .WillByDefault(DoAll(testing::SetArgPointee<1>(mockProperty.get()), testing::Return(S_OK)));
+            EXPECT_CALL(*mockProperty, get_StringValue(_))
+                .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(key.c_str())), testing::Return(S_OK)))
+                .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(value.c_str())), testing::Return(S_OK)));
+
+            HRESULT hr = func(element.get(), handlerVersion);
+
+            EXPECT_EQ(hr, S_OK);
+            EXPECT_STREQ(handlerVersion.QueryStr(), expected.c_str());
+        }
+    };
+
+    TEST_F(ConfigUtilityTest, CheckHandlerVersionKeysAndValues)
+    {
+        auto func = ConfigUtility::FindHandlerVersion;
+        TestHandlerVersion(L"handlerVersion", L"value", L"value", func);
+        TestHandlerVersion(L"handlerversion", L"value", L"value", func);
+        TestHandlerVersion(L"HandlerversioN", L"value", L"value", func);
+        TestHandlerVersion(L"randomvalue", L"value", L"", func);
+        TestHandlerVersion(L"", L"value", L"", func);
+        TestHandlerVersion(L"", L"", L"", func);
+    }
+
+    TEST_F(ConfigUtilityTest, CheckDebugLogFile)
+    {
+        auto func = ConfigUtility::FindDebugFile;
+
+        TestHandlerVersion(L"debugFile", L"value", L"value", func);
+        TestHandlerVersion(L"debugFILE", L"value", L"value", func);
+    }
+
+    TEST_F(ConfigUtilityTest, CheckDebugLevel)
+    {
+        auto func = ConfigUtility::FindDebugLevel;
+
+        TestHandlerVersion(L"debugLevel", L"value", L"value", func);
+        TestHandlerVersion(L"debugLEVEL", L"value", L"value", func);
+    }
+
+    TEST(ConfigUtilityTestSingle, MultipleElements)
+    {
+        IAppHostElement* retElement = NULL;
+        STRU handlerVersion;
+
+        auto element = std::make_unique<NiceMock<MockElement>>();
+        auto innerElement = std::make_unique<NiceMock<MockElement>>();
+        auto collection = std::make_unique<NiceMock<MockCollection>>();
+        auto nameElement = std::make_unique<NiceMock<MockElement>>();
+        auto mockProperty = std::make_unique<NiceMock<MockProperty>>();
+
+        ON_CALL(*element, GetElementByName(_, _))
+            .WillByDefault(DoAll(testing::SetArgPointee<1>(innerElement.get()), testing::Return(S_OK)));
+        ON_CALL(*innerElement, get_Collection(_))
+            .WillByDefault(testing::DoAll(testing::SetArgPointee<0>(collection.get()), testing::Return(S_OK)));
+        ON_CALL(*collection, get_Count(_))
+            .WillByDefault(DoAll(testing::SetArgPointee<0>(2), testing::Return(S_OK)));
+        ON_CALL(*collection, get_Item(_, _))
+            .WillByDefault(DoAll(testing::SetArgPointee<1>(nameElement.get()), testing::Return(S_OK)));
+        ON_CALL(*nameElement, GetPropertyByName(_, _))
+            .WillByDefault(DoAll(testing::SetArgPointee<1>(mockProperty.get()), testing::Return(S_OK)));
+        EXPECT_CALL(*mockProperty, get_StringValue(_))
+            .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(L"key")), testing::Return(S_OK)))
+            .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(L"value")), testing::Return(S_OK)))
+            .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(L"handlerVersion")), testing::Return(S_OK)))
+            .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(L"value2")), testing::Return(S_OK)));
+
+        HRESULT hr = ConfigUtility::FindHandlerVersion(element.get(), handlerVersion);
+
+        EXPECT_EQ(hr, S_OK);
+        EXPECT_STREQ(handlerVersion.QueryStr(), L"value2");
+    }
+
+    TEST(ConfigUtilityTestSingle, IgnoresFailedGetElement)
+    {
+        STRU handlerVersion;
+
+        auto element = std::make_unique<NiceMock<MockElement>>();
+        ON_CALL(*element, GetElementByName(_, _))
+            .WillByDefault(DoAll(testing::SetArgPointee<1>(nullptr), testing::Return(HRESULT_FROM_WIN32( ERROR_INVALID_INDEX ))));
+
+        HRESULT hr = ConfigUtility::FindHandlerVersion(element.get(), handlerVersion);
+
+        EXPECT_EQ(hr, S_OK);
+        EXPECT_STREQ(handlerVersion.QueryStr(), L"");
+    }
+}
diff --git a/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp b/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..66a9ff7f0b7f4133d655135f52df51149455afb9
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp
@@ -0,0 +1,152 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+#include "gtest/internal/gtest-port.h"
+#include "FileOutputManager.h"
+
+class FileManagerWrapper
+{
+public:
+    FileOutputManager* manager;
+    FileManagerWrapper(FileOutputManager* m)
+        : manager(m)
+    {
+        manager->Start();
+    }
+
+    ~FileManagerWrapper()
+    {
+        delete manager;
+    }
+};
+
+namespace FileOutManagerStartupTests
+{
+    using ::testing::Test;
+    class FileOutputManagerTest : public Test
+    {
+    protected:
+        void
+        Test(std::wstring fileNamePrefix, FILE* out)
+        {
+            PCWSTR expected = L"test";
+
+            auto tempDirectory = TempDirectory();
+            FileOutputManager* pManager = new FileOutputManager(fileNamePrefix, tempDirectory.path());
+
+            {
+                FileManagerWrapper wrapper(pManager);
+
+                wprintf(expected, out);
+            }
+
+            for (auto & p : std::filesystem::directory_iterator(tempDirectory.path()))
+            {
+                std::wstring filename(p.path().filename());
+                ASSERT_EQ(filename.substr(0, fileNamePrefix.size()), fileNamePrefix);
+
+                std::wstring content = Helpers::ReadFileContent(std::wstring(p.path()));
+            }
+        }
+    };
+
+    TEST_F(FileOutputManagerTest, WriteToFileCheckContentsWritten)
+    {
+        Test(L"", stdout);
+        Test(L"log", stdout);
+    }
+
+    TEST_F(FileOutputManagerTest, WriteToFileCheckContentsWrittenErr)
+    {
+        Test(L"", stderr);
+        Test(L"log", stderr);
+    }
+}
+
+namespace FileOutManagerOutputTests
+{
+    TEST(FileOutManagerOutputTest, StdOut)
+    {
+        PCWSTR expected = L"test";
+
+        auto tempDirectory = TempDirectory();
+
+        FileOutputManager* pManager = new FileOutputManager(L"", tempDirectory.path());
+        {
+            FileManagerWrapper wrapper(pManager);
+
+            fwprintf(stdout, expected);
+            pManager->Stop();
+
+            auto output = pManager->GetStdOutContent();
+            ASSERT_FALSE(output.empty());
+
+            ASSERT_STREQ(output.c_str(), expected);
+        }
+    }
+
+    TEST(FileOutManagerOutputTest, StdErr)
+    {
+        PCWSTR expected = L"test";
+
+        auto tempDirectory = TempDirectory();
+
+        FileOutputManager* pManager = new FileOutputManager(L"", tempDirectory.path().c_str());
+        {
+            FileManagerWrapper wrapper(pManager);
+
+            fwprintf(stderr, expected);
+            pManager->Stop();
+
+            auto output = pManager->GetStdOutContent();
+            ASSERT_FALSE(output.empty());
+
+            ASSERT_STREQ(output.c_str(), expected);
+        }
+    }
+
+    TEST(FileOutManagerOutputTest, CapAt30KB)
+    {
+        PCWSTR expected = L"hello world";
+
+        auto tempDirectory = TempDirectory();
+
+        FileOutputManager* pManager = new FileOutputManager(L"", tempDirectory.path());
+        {
+            FileManagerWrapper wrapper(pManager);
+
+            for (int i = 0; i < 3000; i++)
+            {
+                wprintf(expected);
+            }
+            pManager->Stop();
+            auto output = pManager->GetStdOutContent();
+            ASSERT_FALSE(output.empty());
+
+            ASSERT_EQ(output.size(), 30000);
+        }
+    }
+
+    TEST(FileOutManagerOutputTest, StartStopRestoresCorrectly)
+    {
+        PCWSTR expected = L"test";
+
+        auto tempDirectory = TempDirectory();
+
+        for (int i = 0; i < 10; i++)
+        {
+            FileOutputManager* pManager = new FileOutputManager(L"", tempDirectory.path());
+            {
+                FileManagerWrapper wrapper(pManager);
+
+                wprintf(expected);
+                pManager->Stop();
+                auto output = pManager->GetStdOutContent();
+                ASSERT_FALSE(output.empty());
+
+                ASSERT_STREQ(output.c_str(), expected);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp b/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f38c9361d223c6d72b4d5a7c2da63f25bf8ba3e9
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp
@@ -0,0 +1,153 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+#include "gtest/internal/gtest-port.h"
+
+namespace GlobalVersionTests
+{
+    using ::testing::Test;
+    namespace fs = std::filesystem;
+
+    class GlobalVersionTest : public Test
+    {
+    protected:
+        void
+        RemoveFileNamePath(PCWSTR dllPath, PCWSTR expected)
+        {
+            std::wstring res = GlobalVersionUtility::RemoveFileNameFromFolderPath(dllPath);
+            EXPECT_STREQ(res.c_str(), expected);
+        }
+    };
+
+    TEST_F(GlobalVersionTest, RemovesPathCorrectly)
+    {
+        RemoveFileNamePath(L"test\\log.txt", L"test");
+        RemoveFileNamePath(L"test\\log", L"test");
+        RemoveFileNamePath(L"C:\\Program Files\\IIS\\aspnetcorev2.dll", L"C:\\Program Files\\IIS");
+        RemoveFileNamePath(L"test\\log.txt", L"test");
+    }
+
+    TEST(GetRequestHandlerVersions, GetFolders)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / L"2.0.0"));
+
+        auto res = GlobalVersionUtility::GetRequestHandlerVersions(tempPath.path().c_str());
+        EXPECT_EQ(res.size(), 1);
+        EXPECT_EQ(res.at(0), fx_ver_t(2, 0, 0, std::wstring()));
+    }
+
+    TEST(GetRequestHandlerVersions, GetFolderPreview)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / L"2.0.0-preview"));
+
+        auto res = GlobalVersionUtility::GetRequestHandlerVersions(tempPath.path().c_str());
+        EXPECT_EQ(res.size(), 1);
+        EXPECT_EQ(res.at(0), fx_ver_t(2, 0, 0, std::wstring(L"-preview")));
+    }
+
+    TEST(GetRequestHandlerVersions, GetFolderManyVersions)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / + L"2.0.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / + L"1.9.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / + L"2.1.0"));
+
+        auto res = GlobalVersionUtility::GetRequestHandlerVersions(tempPath.path().c_str());
+        EXPECT_EQ(res.size(), 3);
+        EXPECT_TRUE(std::find(res.begin(), res.end(), fx_ver_t(1, 9, 0, std::wstring())) != std::end(res));
+        EXPECT_TRUE(std::find(res.begin(), res.end(), fx_ver_t(2, 0, 0, std::wstring())) != std::end(res));
+        EXPECT_TRUE(std::find(res.begin(), res.end(), fx_ver_t(2, 1, 0, std::wstring())) != std::end(res));
+    }
+
+    TEST(FindHighestGlobalVersion, HighestVersionWithSingleFolder)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0"));
+
+        auto res = GlobalVersionUtility::FindHighestGlobalVersion(tempPath.path().c_str());
+
+        EXPECT_STREQ(res.c_str(), L"2.0.0");
+    }
+
+    TEST(FindHighestGlobalVersion, HighestVersionWithMultipleVersions)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0"));
+
+        auto res = GlobalVersionUtility::FindHighestGlobalVersion(tempPath.path().c_str());
+
+        EXPECT_STREQ(res.c_str(), L"2.1.0");
+    }
+
+    TEST(FindHighestGlobalVersion, HighestVersionWithMultipleVersionsPreview)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.2.0-preview"));
+
+        auto res = GlobalVersionUtility::FindHighestGlobalVersion(tempPath.path().c_str());
+
+        EXPECT_STREQ(res.c_str(), L"2.2.0-preview");
+    }
+
+    TEST(FindHighestGlobalVersion, HighestVersionWithMultipleVersionNoPreview)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0-preview"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0"));
+
+        auto res = GlobalVersionUtility::FindHighestGlobalVersion(tempPath.path().c_str());
+
+        EXPECT_STREQ(res.c_str(), L"2.1.0");
+    }
+
+    TEST(GetGlobalRequestHandlerPath, FindHighestVersionNoHandlerName)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0"));
+        auto result = GlobalVersionUtility::GetGlobalRequestHandlerPath(tempPath.path().c_str(), L"", L"aspnetcorev2_outofprocess.dll");
+
+        EXPECT_STREQ(result.c_str(), (tempPath.path() / L"2.0.0\\aspnetcorev2_outofprocess.dll").c_str());
+    }
+
+    TEST(GetGlobalRequestHandlerPath, FindHighestVersionPreviewWins)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0-preview"));
+
+        auto result = GlobalVersionUtility::GetGlobalRequestHandlerPath(tempPath.path().c_str(), L"", L"aspnetcorev2_outofprocess.dll");
+
+        EXPECT_STREQ(result.c_str(), (tempPath.path() / L"2.1.0-preview\\aspnetcorev2_outofprocess.dll").c_str());
+    }
+
+    TEST(GetGlobalRequestHandlerPath, FindHighestVersionSpecificVersion)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0-preview"));
+
+        auto result = GlobalVersionUtility::GetGlobalRequestHandlerPath(tempPath.path().c_str(), L"2.0.0", L"aspnetcorev2_outofprocess.dll");
+
+        EXPECT_STREQ(result.c_str(), (tempPath.path() / L"2.0.0\\aspnetcorev2_outofprocess.dll").c_str());
+    }
+
+    TEST(GetGlobalRequestHandlerPath, FindHighestVersionSpecificPreview)
+    {
+        auto tempPath = TempDirectory();
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0-preview"));
+        EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.2.0"));
+
+
+        auto result = GlobalVersionUtility::GetGlobalRequestHandlerPath(tempPath.path().c_str(), L"2.1.0-preview", L"aspnetcorev2_outofprocess.dll");
+
+        EXPECT_STREQ(result.c_str(), (tempPath.path() / L"2.1.0-preview\\aspnetcorev2_outofprocess.dll").c_str());
+    }
+}
diff --git a/src/IISIntegration/test/CommonLibTests/Helpers.cpp b/src/IISIntegration/test/CommonLibTests/Helpers.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ccca6cad5b9d5cad0c0db3688b5f243296fc0792
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/Helpers.cpp
@@ -0,0 +1,41 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+
+std::wstring
+Helpers::ReadFileContent(std::wstring file)
+{
+    std::wcout << file << std::endl;
+
+    std::fstream t(file);
+    std::stringstream buffer;
+    buffer << t.rdbuf();
+
+    int nChars = MultiByteToWideChar(CP_ACP,  0, buffer.str().c_str(), -1, NULL, 0);
+
+    std::wstring retVal(nChars, '\0');
+
+    MultiByteToWideChar(CP_UTF8, 0, buffer.str().c_str(), -1, retVal.data(), nChars);
+
+    return retVal;
+}
+
+TempDirectory::TempDirectory()
+{
+    UUID uuid;
+    UuidCreate(&uuid);
+    RPC_CSTR szUuid = NULL;
+    if (UuidToStringA(&uuid, &szUuid) == RPC_S_OK)
+    {
+        m_path = std::filesystem::temp_directory_path() / reinterpret_cast<PCHAR>(szUuid);
+        RpcStringFreeA(&szUuid);
+        return;
+    }
+    throw std::exception("Cannot create temp directory");
+}
+
+TempDirectory::~TempDirectory()
+{
+    std::filesystem::remove_all(m_path);
+}
diff --git a/src/IISIntegration/test/CommonLibTests/Helpers.h b/src/IISIntegration/test/CommonLibTests/Helpers.h
new file mode 100644
index 0000000000000000000000000000000000000000..67256966bbda3ac59c0c21129da0670ccb34a9dd
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/Helpers.h
@@ -0,0 +1,28 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+#pragma once
+class Helpers
+{
+public:
+    static
+        std::wstring
+        ReadFileContent(std::wstring file);
+};
+
+class TempDirectory
+{
+public:
+
+    TempDirectory();
+
+    ~TempDirectory();
+
+    std::filesystem::path path() const
+    {
+        return m_path;
+    }
+
+private:
+    std::filesystem::path m_path;
+};
diff --git a/src/IISIntegration/test/CommonLibTests/NativeTests.targets b/src/IISIntegration/test/CommonLibTests/NativeTests.targets
new file mode 100644
index 0000000000000000000000000000000000000000..f3d2caf9306a0a9b6304e8394e2e9429869e7f42
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/NativeTests.targets
@@ -0,0 +1,8 @@
+<Project>
+  <PropertyGroup>
+    <VsTestConsole>$(VCIDEInstallDir)..\CommonExtensions\Microsoft\TestWindow\vstest.console.exe</VsTestConsole>
+  </PropertyGroup>
+  <Target Name="Test" DependsOnTargets="Build">
+    <Exec Command="&quot;$(TargetPath)&quot;" />
+  </Target>
+</Project>
\ No newline at end of file
diff --git a/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp b/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..385d6df9e0f32f737ec9e708045f200c8ccebb38
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp
@@ -0,0 +1,162 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+#include "gtest/internal/gtest-port.h"
+#include "PipeOutputManager.h"
+
+class FileManagerWrapper
+{
+public:
+    PipeOutputManager * manager;
+    FileManagerWrapper(PipeOutputManager* m)
+        : manager(m)
+    {
+        manager->Start();
+    }
+
+    ~FileManagerWrapper()
+    {
+        delete manager;
+    }
+};
+
+namespace PipeOutputManagerTests
+{
+    TEST(PipeManagerOutputTest, StdOut)
+    {
+        PCWSTR expected = L"test";
+
+        PipeOutputManager* pManager = new PipeOutputManager(true);
+
+        pManager->Start();
+        fwprintf(stdout, expected);
+        pManager->Stop();
+
+        auto output = pManager->GetStdOutContent();
+        ASSERT_STREQ(output.c_str(), expected);
+        delete pManager;
+    }
+
+    TEST(PipeManagerOutputTest, StdOutMultiToWide)
+    {
+        PipeOutputManager* pManager = new PipeOutputManager(true);
+
+        pManager->Start();
+        fprintf(stdout, "test");
+        pManager->Stop();
+
+        auto output = pManager->GetStdOutContent();
+        ASSERT_STREQ(output.c_str(), L"test");
+        delete pManager;
+    }
+
+    TEST(PipeManagerOutputTest, StdErr)
+    {
+        PCWSTR expected = L"test";
+
+        PipeOutputManager* pManager = new PipeOutputManager();
+
+        pManager->Start();
+        fwprintf(stderr, expected);
+        pManager->Stop();
+
+        auto output = pManager->GetStdOutContent();
+        ASSERT_STREQ(output.c_str(), expected);
+        delete pManager;
+    }
+
+    TEST(PipeManagerOutputTest, CheckMaxPipeSize)
+    {
+        std::wstring test;
+        for (int i = 0; i < 3000; i++)
+        {
+            test.append(L"hello world");
+        }
+
+        PipeOutputManager* pManager = new PipeOutputManager();
+
+        pManager->Start();
+        wprintf(test.c_str());
+        pManager->Stop();
+
+        auto output = pManager->GetStdOutContent();
+        ASSERT_EQ(output.size(), (DWORD)30000);
+        delete pManager;
+    }
+
+    TEST(PipeManagerOutputTest, SetInvalidHandlesForErrAndOut)
+    {
+        auto m_fdPreviousStdOut = _dup(_fileno(stdout));
+        auto m_fdPreviousStdErr = _dup(_fileno(stderr));
+
+        SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE);
+        SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE);
+
+        PCWSTR expected = L"test";
+
+        PipeOutputManager* pManager = new PipeOutputManager();
+        pManager->Start();
+
+        _dup2(m_fdPreviousStdOut, _fileno(stdout));
+        _dup2(m_fdPreviousStdErr, _fileno(stderr));
+
+        // Test will fail if we didn't redirect stdout back to a file descriptor.
+        // This is because gtest relies on console output to know if a test succeeded or failed.
+        // If the output still points to a file/pipe, the test (and all other tests after it) will fail.
+        delete pManager;
+    }
+
+    TEST(PipeManagerOutputTest, CreateDeleteMultipleTimesStdOutWorks)
+    {
+        for (int i = 0; i < 10; i++)
+        {
+            auto stdoutBefore = _fileno(stdout);
+            auto stderrBefore = _fileno(stderr);
+            PCWSTR expected = L"test";
+
+            PipeOutputManager* pManager = new PipeOutputManager();
+
+            pManager->Start();
+            fwprintf(stdout, expected);
+
+            pManager->Stop();
+
+            auto output = pManager->GetStdOutContent();
+            ASSERT_STREQ(output.c_str(), expected);
+            ASSERT_EQ(stdoutBefore, _fileno(stdout));
+            ASSERT_EQ(stderrBefore, _fileno(stderr));
+            delete pManager;
+        }
+        // When this returns, we get an AV from gtest.
+    }
+
+    TEST(PipeManagerOutputTest, CreateDeleteKeepOriginalStdErr)
+    {
+        for (int i = 0; i < 10; i++)
+        {
+            auto stdoutBefore = _fileno(stdout);
+            auto stderrBefore = _fileno(stderr);
+            auto stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
+            auto stderrHandle = GetStdHandle(STD_ERROR_HANDLE);
+            PCWSTR expected = L"test";
+
+            PipeOutputManager* pManager = new PipeOutputManager();
+
+            pManager->Start();
+            fwprintf(stderr, expected);
+            pManager->Stop();
+
+            auto output = pManager->GetStdOutContent();
+            ASSERT_STREQ(output.c_str(), expected);
+            ASSERT_EQ(stdoutBefore, _fileno(stdout));
+
+            ASSERT_EQ(stderrBefore, _fileno(stderr));
+
+            delete pManager;
+        }
+
+        wprintf(L"Hello!");
+    }
+}
+
diff --git a/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp b/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d0a9e97fdbc4c05a3143d20242effc16cf0897c2
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp
@@ -0,0 +1,49 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+
+TEST(CaughtExceptionHResult, ReturnsOutOfMemoryForBadAlloc)
+{
+    HRESULT hr;
+    try
+    {
+        throw std::bad_alloc();
+    }
+    catch(...)
+    {
+        hr = CaughtExceptionHResult();
+    }
+
+    EXPECT_EQ(E_OUTOFMEMORY, hr);
+}
+
+TEST(CaughtExceptionHResult, ReturnsValueForSystemError)
+{
+    HRESULT hr;
+    try
+    {
+        throw std::system_error(E_INVALIDARG, std::system_category());
+    }
+    catch(...)
+    {
+        hr = CaughtExceptionHResult();
+    }
+
+    EXPECT_EQ(E_INVALIDARG, hr);
+}
+
+TEST(CaughtExceptionHResult, ReturnsUhandledExceptionForOtherExceptions)
+{
+    HRESULT hr;
+    try
+    {
+        throw E_INVALIDARG;
+    }
+    catch(...)
+    {
+        hr = CaughtExceptionHResult();
+    }
+
+    EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION), hr);
+}
diff --git a/src/IISIntegration/test/CommonLibTests/fakeclasses.h b/src/IISIntegration/test/CommonLibTests/fakeclasses.h
new file mode 100644
index 0000000000000000000000000000000000000000..a6f4a3e1118ebd2f0d396bd7dcebaf1b5d2dc9bf
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/fakeclasses.h
@@ -0,0 +1,190 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#pragma once
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "InProcessOptions.h"
+
+class MockProperty : public IAppHostProperty
+{
+public:
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, QueryInterface, HRESULT(REFIID riid, void ** ppvObject));
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, AddRef, ULONG());
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Release, ULONG());
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Name, HRESULT(BSTR* pbstrValue));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Value, HRESULT(VARIANT * pVariant));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, put_Value, HRESULT(VARIANT value));
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Clear, HRESULT());
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_StringValue, HRESULT(BSTR* pbstrValue));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Exception, HRESULT(IAppHostPropertyException ** ppException));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, GetMetadata, HRESULT(BSTR bstrMetadataType, VARIANT * pValue));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, SetMetadata, HRESULT(BSTR bstrMetadataType, VARIANT value));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Schema, HRESULT(IAppHostPropertySchema ** ppSchema));
+};
+
+class MockCollection : public IAppHostElementCollection
+{
+public:
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, QueryInterface, HRESULT(REFIID riid, void ** ppvObject));
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, AddRef, ULONG());
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Release, ULONG());
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Clear, HRESULT());
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Schema, HRESULT(IAppHostCollectionSchema** pSchema));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Count, HRESULT(DWORD * dwordElem));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, get_Item, HRESULT(VARIANT cIndex, IAppHostElement ** ppElement));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, AddElement, HRESULT(IAppHostElement * pElement, INT cPosition));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, DeleteElement, HRESULT(VARIANT cIndex));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, CreateNewElement, HRESULT(BSTR bstrElementName, IAppHostElement** ppElement));
+};
+
+class MockElement : public IAppHostElement
+{
+public:
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, QueryInterface, HRESULT(REFIID riid, void ** ppvObject));
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, AddRef, ULONG());
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Release, ULONG());
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Name, HRESULT(BSTR * pbstrName));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Collection, HRESULT(IAppHostElementCollection ** ppCollection));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Properties, HRESULT(IAppHostPropertyCollection ** ppProperties));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_ChildElements, HRESULT(IAppHostChildElementCollection ** ppElements));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, GetMetadata, HRESULT(BSTR bstrMetadataType, VARIANT * pValue));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, SetMetadata, HRESULT(BSTR bstrMetadataType, VARIANT value));
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Schema, HRESULT(IAppHostElementSchema** pSchema));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, GetElementByName, HRESULT(BSTR bstrSubName, IAppHostElement ** ppElement));
+    MOCK_METHOD2_WITH_CALLTYPE(__stdcall, GetPropertyByName, HRESULT(BSTR bstrSubName, IAppHostProperty ** ppProperty));
+    MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Clear, HRESULT());
+    MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Methods, HRESULT(IAppHostMethodCollection ** ppMethods));
+};
+
+class MockHttpServer : public IHttpServer
+{
+    // Inherited via IHttpServer
+    virtual BOOL IsCommandLineLaunch(VOID) const override
+    {
+        return 0;
+    }
+    virtual PCWSTR GetAppPoolName(VOID) const override
+    {
+        return PCWSTR();
+    }
+    virtual HRESULT AssociateWithThreadPool(HANDLE hHandle, LPOVERLAPPED_COMPLETION_ROUTINE completionRoutine) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual VOID IncrementThreadCount(VOID) override
+    {
+        return VOID();
+    }
+    virtual VOID DecrementThreadCount(VOID) override
+    {
+        return VOID();
+    }
+    virtual VOID ReportUnhealthy(PCWSTR pszReasonString, HRESULT hrReason) override
+    {
+        return VOID();
+    }
+    virtual VOID RecycleProcess(PCWSTR pszReason) override
+    {
+        return VOID();
+    }
+    virtual IAppHostAdminManager * GetAdminManager(VOID) const override
+    {
+        return nullptr;
+    }
+    virtual HRESULT GetFileInfo(PCWSTR pszPhysicalPath, HANDLE hUserToken, PSID pSid, PCWSTR pszChangeNotificationPath, HANDLE hChangeNotificationToken, BOOL fCache, IHttpFileInfo ** ppFileInfo, IHttpTraceContext * pHttpTraceContext = NULL) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual HRESULT FlushKernelCache(PCWSTR pszUrl) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual HRESULT DoCacheOperation(CACHE_OPERATION cacheOperation, IHttpCacheKey * pCacheKey, IHttpCacheSpecificData ** ppCacheSpecificData, IHttpTraceContext * pHttpTraceContext = NULL) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual GLOBAL_NOTIFICATION_STATUS NotifyCustomNotification(ICustomNotificationProvider * pCustomOutput) override
+    {
+        return GLOBAL_NOTIFICATION_STATUS();
+    }
+    virtual IHttpPerfCounterInfo * GetPerfCounterInfo(VOID) override
+    {
+        return nullptr;
+    }
+    virtual VOID RecycleApplication(PCWSTR pszAppConfigPath) override
+    {
+        return VOID();
+    }
+    virtual VOID NotifyConfigurationChange(PCWSTR pszPath) override
+    {
+        return VOID();
+    }
+    virtual VOID NotifyFileChange(PCWSTR pszFileName) override
+    {
+        return VOID();
+    }
+    virtual IDispensedHttpModuleContextContainer * DispenseContainer(VOID) override
+    {
+        return nullptr;
+    }
+    virtual HRESULT AddFragmentToCache(HTTP_DATA_CHUNK * pDataChunk, PCWSTR pszFragmentName) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual HRESULT ReadFragmentFromCache(PCWSTR pszFragmentName, BYTE * pvBuffer, DWORD cbSize, DWORD * pcbCopied) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual HRESULT RemoveFragmentFromCache(PCWSTR pszFragmentName) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual HRESULT GetWorkerProcessSettings(IWpfSettings ** ppWorkerProcessSettings) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual HRESULT GetProtocolManagerCustomInterface(PCWSTR pProtocolManagerDll, PCWSTR pProtocolManagerDllInitFunction, DWORD dwCustomInterfaceId, PVOID * ppCustomInterface) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual BOOL SatisfiesPrecondition(PCWSTR pszPrecondition, BOOL * pfUnknownPrecondition = NULL) const override
+    {
+        return 0;
+    }
+    virtual IHttpTraceContext * GetTraceContext(VOID) const override
+    {
+        return nullptr;
+    }
+    virtual HRESULT RegisterFileChangeMonitor(PCWSTR pszPath, HANDLE hToken, IHttpFileMonitor ** ppFileMonitor) override
+    {
+        return E_NOTIMPL;
+    }
+    virtual HRESULT GetExtendedInterface(HTTP_SERVER_INTERFACE_VERSION version, PVOID * ppInterface) override
+    {
+        return E_NOTIMPL;
+    }
+};
+
+
+class MockHttpApplication: public IHttpApplication
+{
+public:
+    MOCK_CONST_METHOD0(GetApplicationPhysicalPath, PCWSTR ());
+    MOCK_CONST_METHOD0(GetApplicationId, PCWSTR ());
+    MOCK_CONST_METHOD0(GetAppConfigPath, PCWSTR ());
+    MOCK_METHOD0(GetModuleContextContainer, IHttpModuleContextContainer* ());
+};
+
+class MockInProcessOptions : public InProcessOptions
+{
+public:
+    static
+        MockInProcessOptions*
+        CreateConfig()
+    {
+        return new MockInProcessOptions;
+    }
+};
+
diff --git a/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp b/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..01c9541429cd68ad49151f5f61ef4e18a6df02fd
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp
@@ -0,0 +1,122 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+#include <filesystem>
+#include <vector>
+#include <string>
+#include "hostfxr_utility.h"
+#include "Environment.h"
+
+TEST(ParseHostFxrArguments, BasicHostFxrArguments)
+{
+    std::vector<std::wstring> bstrArray;
+
+    HOSTFXR_UTILITY::AppendArguments(
+        L"exec \"test.dll\"", // args
+        L"invalid",  // physical path to application
+        bstrArray); // args array.
+
+    EXPECT_EQ(2, bstrArray.size());
+    ASSERT_STREQ(L"exec", bstrArray[0].c_str());
+    ASSERT_STREQ(L"test.dll", bstrArray[1].c_str());
+}
+
+TEST(ParseHostFxrArguments, NoExecProvided)
+{
+    std::vector<std::wstring> bstrArray;
+
+    HOSTFXR_UTILITY::AppendArguments(
+        L"test.dll", // args
+        L"ignored",  // physical path to application
+        bstrArray); // args array.
+
+    EXPECT_EQ(1, bstrArray.size());
+    ASSERT_STREQ(L"test.dll", bstrArray[0].c_str());
+}
+
+TEST(ParseHostFxrArguments, ConvertDllToAbsolutePath)
+{
+    std::vector<std::wstring> bstrArray;
+    // we need to use existing dll so let's use ntdll that we know exists everywhere
+    auto system32 = Environment::ExpandEnvironmentVariables(L"%WINDIR%\\System32");
+    HOSTFXR_UTILITY::AppendArguments(
+        L"exec \"ntdll.dll\"", // args
+        system32,  // physical path to application
+        bstrArray, // args array.
+        true); // expandDllPaths
+
+    EXPECT_EQ(2, bstrArray.size());
+    ASSERT_STREQ(L"exec", bstrArray[0].c_str());
+    ASSERT_STREQ((system32 + L"\\ntdll.dll").c_str(), bstrArray[1].c_str());
+}
+
+TEST(ParseHostFxrArguments, ProvideNoArgs_InvalidArgs)
+{
+    std::vector<std::wstring> bstrArray;
+    std::filesystem::path struHostFxrDllLocation;
+    std::filesystem::path struExeLocation;
+
+    EXPECT_THROW(HOSTFXR_UTILITY::GetHostFxrParameters(
+        L"dotnet", // processPath
+        L"some\\path",  // application physical path, ignored.
+        L"",  //arguments
+        struHostFxrDllLocation,
+        struExeLocation,
+        bstrArray), // args array.
+        InvalidOperationException);
+}
+
+TEST(GetAbsolutePathToDotnetFromProgramFiles, BackupWorks)
+{
+    STRU struAbsolutePathToDotnet;
+    BOOL fDotnetInProgramFiles;
+    BOOL is64Bit;
+    BOOL fIsWow64 = FALSE;
+    SYSTEM_INFO systemInfo;
+    IsWow64Process(GetCurrentProcess(), &fIsWow64);
+    if (fIsWow64)
+    {
+        is64Bit = FALSE;
+    }
+    else
+    {
+        GetNativeSystemInfo(&systemInfo);
+        is64Bit = systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64;
+    }
+
+    if (is64Bit)
+    {
+        fDotnetInProgramFiles = std::filesystem::is_regular_file(L"C:/Program Files/dotnet/dotnet.exe");
+    }
+    else
+    {
+        fDotnetInProgramFiles = std::filesystem::is_regular_file(L"C:/Program Files (x86)/dotnet/dotnet.exe");
+    }
+
+    auto dotnetPath = HOSTFXR_UTILITY::GetAbsolutePathToDotnetFromProgramFiles();
+    if (fDotnetInProgramFiles)
+    {
+        EXPECT_TRUE(dotnetPath.has_value());
+    }
+    else
+    {
+        EXPECT_FALSE(dotnetPath.has_value());
+    }
+}
+
+TEST(GetHostFxrArguments, InvalidParams)
+{
+    std::vector<std::wstring> bstrArray;
+    std::filesystem::path struHostFxrDllLocation;
+    std::filesystem::path struExeLocation;
+
+    EXPECT_THROW(HOSTFXR_UTILITY::GetHostFxrParameters(
+        L"bogus", // processPath
+        L"",  // application physical path, ignored.
+        L"ignored",  //arguments
+        struHostFxrDllLocation,
+        struExeLocation,
+        bstrArray), // args array.
+        InvalidOperationException);
+}
diff --git a/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp b/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d2ec985723bbdd67c6350e9c470a39de3d9c4d13
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp
@@ -0,0 +1,85 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+
+#include <array>
+#include "inprocessapplication.h"
+#include "fakeclasses.h"
+
+using ::testing::_;
+using ::testing::NiceMock;
+
+// Externals defined in inprocess
+BOOL       g_fProcessDetach;
+HANDLE     g_hEventLog;
+
+namespace InprocessTests
+{
+    TEST(InProcessTest, NoNullRefForExePath)
+    {
+        MockHttpServer server;
+        NiceMock<MockHttpApplication> application;
+
+        ON_CALL(application, GetApplicationPhysicalPath())
+            .WillByDefault(testing::Return(L"Some path"));
+
+        ON_CALL(application, GetAppConfigPath())
+            .WillByDefault(testing::Return(L""));
+
+        ON_CALL(application, GetApplicationId())
+            .WillByDefault(testing::Return(L""));
+
+        auto requestHandlerConfig = std::unique_ptr<InProcessOptions>(MockInProcessOptions::CreateConfig());
+
+        std::wstring exePath(L"hello");
+
+        std::array<APPLICATION_PARAMETER, 1> parameters{
+            {"InProcessExeLocation", exePath.data()}
+        };
+
+        IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, application, std::move(requestHandlerConfig), parameters.data(), 1);
+
+        ASSERT_STREQ(app->QueryExeLocation().c_str(), L"hello");
+    }
+
+    TEST(InProcessTest, GeneratesVirtualPath)
+    {
+        MockHttpServer server;
+        NiceMock<MockHttpApplication> application;
+
+        ON_CALL(application, GetApplicationPhysicalPath())
+            .WillByDefault(testing::Return(L"Some path"));
+
+        ON_CALL(application, GetAppConfigPath())
+            .WillByDefault(testing::Return(L"SECTION1/SECTION2/SECTION3/SECTION4/SECTION5"));
+
+        ON_CALL(application, GetApplicationId())
+            .WillByDefault(testing::Return(L""));
+
+        auto requestHandlerConfig = std::unique_ptr<InProcessOptions>(MockInProcessOptions::CreateConfig());
+        IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, application, std::move(requestHandlerConfig), nullptr, 0);
+
+        ASSERT_STREQ(app->QueryApplicationVirtualPath().c_str(), L"/SECTION5");
+    }
+
+    TEST(InProcessTest, GeneratesVirtualPathForDefaultApp)
+    {
+        MockHttpServer server;
+        NiceMock<MockHttpApplication> application;
+
+        ON_CALL(application, GetApplicationPhysicalPath())
+            .WillByDefault(testing::Return(L"Some path"));
+
+        ON_CALL(application, GetAppConfigPath())
+            .WillByDefault(testing::Return(L"SECTION1/SECTION2/SECTION3/SECTION4"));
+
+        ON_CALL(application, GetApplicationId())
+            .WillByDefault(testing::Return(L""));
+
+        auto requestHandlerConfig = std::unique_ptr<InProcessOptions>(MockInProcessOptions::CreateConfig());
+        IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, application, std::move(requestHandlerConfig), nullptr, 0);
+
+        ASSERT_STREQ(app->QueryApplicationVirtualPath().c_str(), L"/");
+    }
+}
diff --git a/src/IISIntegration/test/CommonLibTests/main.cpp b/src/IISIntegration/test/CommonLibTests/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1ad0a10ccdd38811f02a826a1cb604b9b4035dee
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/main.cpp
@@ -0,0 +1,12 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+
+DECLARE_DEBUG_PRINT_OBJECT2("tests", ASPNETCORE_DEBUG_FLAG_INFO | ASPNETCORE_DEBUG_FLAG_CONSOLE);
+
+int wmain(int argc, wchar_t* argv[])
+{
+    ::testing::InitGoogleTest(&argc, argv);
+    RUN_ALL_TESTS();
+}
diff --git a/src/IISIntegration/test/CommonLibTests/stdafx.h b/src/IISIntegration/test/CommonLibTests/stdafx.h
new file mode 100644
index 0000000000000000000000000000000000000000..4b9ac7cd27890f15590dfb43b3a97e60607dfc32
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/stdafx.h
@@ -0,0 +1,59 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+#pragma once
+
+#define WIN32_LEAN_AND_MEAN
+
+#include <Windows.h>
+#include <atlbase.h>
+#include <pdh.h>
+#include <vector>
+#include <Shlobj.h>
+#include <httpserv.h>
+#include <winhttp.h>
+#include <httptrace.h>
+#include <cstdlib>
+#include <wchar.h>
+#include <io.h>
+#include <stdio.h>
+#include <filesystem>
+#include <fstream>
+
+#include <hashfn.h>
+#include <hashtable.h>
+#include "stringa.h"
+#include "stringu.h"
+#include "dbgutil.h"
+#include "ahutil.h"
+#include "multisz.h"
+#include "multisza.h"
+#include "base64.h"
+#include <listentry.h>
+#include <datetime.h>
+#include <reftrace.h>
+#include <acache.h>
+#include <time.h>
+
+#include "stringu.h"
+#include "stringa.h"
+#include "multisz.h"
+#include "dbgutil.h"
+#include "hashfn.h"
+
+#include "requesthandler_config.h"
+#include "hostfxr_utility.h"
+#include "config_utility.h"
+#include "environmentvariablehash.h"
+#include "iapplication.h"
+#include "debugutil.h"
+#include "requesthandler.h"
+#include "resources.h"
+#include "aspnetcore_msg.h"
+#include "Helpers.h"
+#include "GlobalVersionUtility.h"
+
+#undef assert // Macro redefinition in IISLib.
+#include "gtest/gtest.h"
+#include "fakeclasses.h"
+
diff --git a/src/IISIntegration/test/CommonLibTests/utility_tests.cpp b/src/IISIntegration/test/CommonLibTests/utility_tests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ee69d790543ad3ba11178935fe10119e7f013c6d
--- /dev/null
+++ b/src/IISIntegration/test/CommonLibTests/utility_tests.cpp
@@ -0,0 +1,75 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+#include "stdafx.h"
+#include "Environment.h"
+#include "StringHelpers.h"
+
+TEST(PassUnexpandedEnvString, ExpandsResult)
+{
+    HRESULT hr = S_OK;
+    PCWSTR unexpandedString = L"ANCM_TEST_ENV_VAR";
+    PCWSTR unexpandedStringValue = L"foobar";
+    STRU   struExpandedString;
+    SetEnvironmentVariable(L"ANCM_TEST_ENV_VAR", unexpandedStringValue);
+
+    hr = struExpandedString.CopyAndExpandEnvironmentStrings(L"%ANCM_TEST_ENV_VAR%");
+    EXPECT_EQ(hr, S_OK);
+    EXPECT_STREQ(L"foobar", struExpandedString.QueryStr());
+}
+
+TEST(PassUnexpandedEnvString, LongStringExpandsResults)
+{
+    HRESULT hr = S_OK;
+    PCWSTR unexpandedString = L"ANCM_TEST_ENV_VAR_LONG";
+    STRU   struStringValue;
+    STACK_STRU(struExpandedString, MAX_PATH);
+
+    struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize");
+    struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize");
+    struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize");
+    struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize");
+    struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize");
+    struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize");
+
+    SetEnvironmentVariable(unexpandedString, struStringValue.QueryStr());
+
+    hr = struExpandedString.CopyAndExpandEnvironmentStrings(L"%ANCM_TEST_ENV_VAR_LONG%");
+    EXPECT_EQ(hr, S_OK);
+    EXPECT_EQ(struStringValue.QueryCCH(), struExpandedString.QueryCCH());
+    // The values are exactly the same, however EXPECT_EQ is returning false.
+    //EXPECT_EQ(struStringValue.QueryStr(), struExpandedString.QueryStr());
+    EXPECT_STREQ(struStringValue.QueryStr(), struExpandedString.QueryStr());
+}
+
+
+TEST(GetEnvironmentVariableValue, ReturnsCorrectLenght)
+{
+    SetEnvironmentVariable(L"RANDOM_ENV_VAR_1", L"test");
+
+    auto result = Environment::GetEnvironmentVariableValue(L"RANDOM_ENV_VAR_1");
+    EXPECT_TRUE(result.has_value());
+    EXPECT_EQ(result.value().length(), 4);
+    EXPECT_STREQ(result.value().c_str(), L"test");
+}
+
+
+TEST(GetEnvironmentVariableValue, ReturnsNulloptWhenNotFound)
+{
+    auto result = Environment::GetEnvironmentVariableValue(L"RANDOM_ENV_VAR_2");
+    EXPECT_FALSE(result.has_value());
+}
+
+TEST(CheckStringHelpers, FormatWithoutContentDoesNotIncreaseSizeString)
+{
+    std::string testString = "test";
+    auto result = format(testString);
+    EXPECT_EQ(testString.size(), result.size());
+}
+
+TEST(CheckStringHelpers, FormatWithoutContentDoesNotIncreaseSizeWstring)
+{
+    std::wstring testString = L"test";
+    auto result = format(testString);
+    EXPECT_EQ(testString.size(), result.size());
+}
diff --git a/src/IISIntegration/test/Directory.Build.props b/src/IISIntegration/test/Directory.Build.props
new file mode 100644
index 0000000000000000000000000000000000000000..edfd666254558b9d6b005d104d93a620fee1a3a7
--- /dev/null
+++ b/src/IISIntegration/test/Directory.Build.props
@@ -0,0 +1,16 @@
+<Project>
+  <Import Project="..\Directory.Build.props" />
+
+  <PropertyGroup>
+    <!-- These tests are remaining at netcoreapp2.2 because the Benchmarks and functional tests use the same websites.
+      We must leave the benchmarks at 2.1, and if you try to import a project that uses 22 to a 21 project it complains. -->
+    <DeveloperBuildTestTfms>netcoreapp2.2</DeveloperBuildTestTfms>
+    <StandardTestTfms>$(DeveloperBuildTestTfms)</StandardTestTfms>
+    <StandardTestTfms Condition=" '$(DeveloperBuild)' != 'true' ">$(StandardTestTfms)</StandardTestTfms>
+    <StandardTestTfms Condition=" '$(DeveloperBuild)' != 'true' AND '$(OS)' == 'Windows_NT' ">$(StandardTestTfms);net461</StandardTestTfms>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Internal.AspNetCore.Sdk" PrivateAssets="All" Version="$(InternalAspNetCoreSdkPackageVersion)" />
+  </ItemGroup>
+</Project>
diff --git a/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2e4a7b1c4062c58f942d8b35540558eee34c4704
--- /dev/null
+++ b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs
@@ -0,0 +1,39 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Diagnostics;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+using Xunit.Sdk;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class BackwardsCompatibilityTests : FixtureLoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public BackwardsCompatibilityTests(IISTestSiteFixture fixture) : base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task CheckBackwardsCompatibilityIsUsed()
+        {
+            var response = await _fixture.Client.GetAsync("/HelloWorld");
+            var handles = _fixture.DeploymentResult.HostProcess.Modules;
+
+            foreach (ProcessModule handle in handles)
+            {
+                if (handle.ModuleName == "aspnetcorev2.dll")
+                {
+                    Assert.Equal("12.2.18287.0", handle.FileVersionInfo.FileVersion);
+                    return;
+                }
+            }
+            throw new XunitException($"Could not find aspnetcorev2.dll loaded in process {_fixture.DeploymentResult.HostProcess.ProcessName}");
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5c6f3739a4d02f0d15b48090bfbcb34c79eb665c
--- /dev/null
+++ b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs
@@ -0,0 +1,14 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public static class DeployerSelector
+    {
+        public static ServerType ServerType => ServerType.IIS;
+        public static bool IsBackwardsCompatiblityTest => true;
+        public static bool IsForwardsCompatibilityTest => false;
+    }
+}
diff --git a/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..c819a03ab19ac3a3f0b90872020cc779b8f4a01d
--- /dev/null
+++ b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj
@@ -0,0 +1,46 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
+    <TestGroupName>IISBackwardsCompatibility.FunctionalTests</TestGroupName>
+    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Content Include="..\Common.FunctionalTests\AppHostConfig\*.config" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" />
+    <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" />
+    <ProjectReference Include="..\WebSites\InProcessWebSite\InProcessWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+    <ProjectReference Include="..\WebSites\OutOfProcessWebSite\OutOfProcessWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+    <ProjectReference Include="..\WebSites\StressTestWebSite\StressTestWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="..\Common.FunctionalTests\**\*.cs" />
+    <Compile Include="..\IIS.Shared.FunctionalTests\**\*.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.AspNetCoreModule" Version="$(MicrosoftAspNetCoreAspNetCoreModuleStablePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.AspNetCoreModuleV2" Version="$(MicrosoftAspNetCoreAspNetCoreModuleV2StablePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bd7aabbe0f9ed3526396e7fffd105bd62d4ac392
--- /dev/null
+++ b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs
@@ -0,0 +1,14 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public static class DeployerSelector
+    {
+        public static ServerType ServerType => ServerType.IIS;
+        public static bool IsBackwardsCompatiblityTest => false;
+        public static bool IsForwardsCompatibilityTest => true;
+    }
+}
diff --git a/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5f4ebb5608d52f4b0adf31bd49133dc226919a8c
--- /dev/null
+++ b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs
@@ -0,0 +1,38 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Diagnostics;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+using Xunit.Sdk;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    public class ForwardsCompatibilityTests : FixtureLoggedTest
+    {
+        private readonly IISTestSiteFixture _fixture;
+
+        public ForwardsCompatibilityTests(IISTestSiteFixture fixture) : base(fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task CheckForwardsCompatibilityIsUsed()
+        {
+            var response = await _fixture.Client.GetAsync("/HelloWorld");
+            var handles = _fixture.DeploymentResult.HostProcess.Modules;
+            foreach (ProcessModule handle in handles)
+            {
+                if (handle.ModuleName == "aspnetcorev2_inprocess.dll")
+                {
+                    Assert.Equal("12.2.18287.0", handle.FileVersionInfo.FileVersion);
+                    return;
+                }
+            }
+            throw new XunitException($"Could not find aspnetcorev2_inprocess.dll loaded in process {_fixture.DeploymentResult.HostProcess.ProcessName}");
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..929f6ec6b033fb28cec43af5cb76ebb5a07cbc63
--- /dev/null
+++ b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj
@@ -0,0 +1,45 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
+    <TestGroupName>IISForwardsCompatibility.FunctionalTests</TestGroupName>
+    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Content Include="..\Common.FunctionalTests\AppHostConfig\*.config" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" />
+    <ProjectReference Include="..\WebSites\InProcessForwardsCompatWebSite\InProcessWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+    <ProjectReference Include="..\WebSites\OutOfProcessWebSite\OutOfProcessWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+    <ProjectReference Include="..\WebSites\StressTestWebSite\StressTestWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="..\Common.FunctionalTests\**\*.cs" />
+    <Compile Include="..\IIS.Shared.FunctionalTests\**\*.cs" />
+  </ItemGroup>
+
+  <Import Project="..\..\build\functional-test-assets.targets" />
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f2e1be321edcaee83a3eed7ebe8a52336b4f7588
--- /dev/null
+++ b/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs
@@ -0,0 +1,14 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public static class DeployerSelector
+    {
+        public static ServerType ServerType => ServerType.IIS;
+        public static bool IsBackwardsCompatiblityTest => false;
+        public static bool IsForwardsCompatibilityTest => false;
+    }
+}
diff --git a/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj b/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..62dec62e60d98f1b70fd54bd1a4abab87371e553
--- /dev/null
+++ b/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj
@@ -0,0 +1,46 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
+    <TestGroupName>IIS.FunctionalTests</TestGroupName>
+    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Content Include="..\Common.FunctionalTests\AppHostConfig\*.config" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" />
+    <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" />
+    <ProjectReference Include="..\WebSites\InProcessWebSite\InProcessWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+    <ProjectReference Include="..\WebSites\OutOfProcessWebSite\OutOfProcessWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+    <ProjectReference Include="..\WebSites\StressTestWebSite\StressTestWebSite.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="..\Common.FunctionalTests\**\*.cs" />
+    <Compile Include="..\IIS.Shared.FunctionalTests\**\*.cs" />
+  </ItemGroup>
+
+  <Import Project="..\..\build\functional-test-assets.targets" />
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..35f10b13ab1f7766d3939fdce04b70a913b9e430
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs
@@ -0,0 +1,150 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Newtonsoft.Json;
+using Xunit;
+
+namespace IIS.FunctionalTests.Inprocess
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class StdOutRedirectionTests : LogFileTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public StdOutRedirectionTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        [SkipIfDebug]
+        public async Task FrameworkNotFoundExceptionLogged_Pipe()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            Helpers.ModifyFrameworkVersionInRuntimeConfig(deploymentResult);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            Assert.False(response.IsSuccessStatusCode);
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult,
+                "The specified framework 'Microsoft.NETCore.App', version '2.9.9' was not found.");
+        }
+
+        [ConditionalFact]
+        [SkipIfDebug]
+        public async Task FrameworkNotFoundExceptionLogged_File()
+        {
+            var deploymentParameters =
+                _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+
+            deploymentParameters.EnableLogging(_logFolderPath);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            Helpers.ModifyFrameworkVersionInRuntimeConfig(deploymentResult);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            Assert.False(response.IsSuccessStatusCode);
+
+            StopServer();
+
+            var contents = Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, _logFolderPath), Logger);
+            var expectedString = "The specified framework 'Microsoft.NETCore.App', version '2.9.9' was not found.";
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, expectedString);
+            Assert.Contains(expectedString, contents);
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        [SkipIfDebug]
+        public async Task EnableCoreHostTraceLogging_TwoLogFilesCreated()
+        {
+            var deploymentParameters =
+                _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.TransformArguments((a, _) => $"{a} CheckLargeStdOutWrites");
+
+            deploymentParameters.EnvironmentVariables["COREHOST_TRACE"] = "1";
+
+            deploymentParameters.EnableLogging(_logFolderPath);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            Assert.False(response.IsSuccessStatusCode);
+
+            StopServer();
+
+            var fileInDirectory = Directory.GetFiles(_logFolderPath).Single();
+            var contents = Helpers.ReadAllTextFromFile(fileInDirectory, Logger);
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Invoked hostfxr");
+            Assert.Contains("Invoked hostfxr", contents);
+        }
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        [SkipIfDebug]
+        [InlineData("CheckLargeStdErrWrites")]
+        [InlineData("CheckLargeStdOutWrites")]
+        [InlineData("CheckOversizedStdErrWrites")]
+        [InlineData("CheckOversizedStdOutWrites")]
+        public async Task EnableCoreHostTraceLogging_PipeCaptureNativeLogs(string path)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.EnvironmentVariables["COREHOST_TRACE"] = "1";
+            deploymentParameters.TransformArguments((a, _) => $"{a} {path}");
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+
+            Assert.False(response.IsSuccessStatusCode);
+
+            StopServer();
+
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Invoked hostfxr");
+        }
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.PoolEnvironmentVariables)]
+        [SkipIfDebug]
+        [InlineData("CheckLargeStdErrWrites")]
+        [InlineData("CheckLargeStdOutWrites")]
+        [InlineData("CheckOversizedStdErrWrites")]
+        [InlineData("CheckOversizedStdOutWrites")]
+        public async Task EnableCoreHostTraceLogging_FileCaptureNativeLogs(string path)
+        {
+            var deploymentParameters =
+                _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true);
+            deploymentParameters.EnvironmentVariables["COREHOST_TRACE"] = "1";
+            deploymentParameters.TransformArguments((a, _) => $"{a} {path}");
+
+            deploymentParameters.EnableLogging(_logFolderPath);
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld");
+            Assert.False(response.IsSuccessStatusCode);
+
+            StopServer();
+
+            var fileInDirectory = Directory.GetFiles(_logFolderPath).First();
+            var contents = Helpers.ReadAllTextFromFile(fileInDirectory, Logger);
+
+            EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Invoked hostfxr");
+            Assert.Contains("Invoked hostfxr", contents);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a054225ac52cf2c4c59829f192853156e6ac6ece
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs
@@ -0,0 +1,26 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Diagnostics;
+using System.IO;
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Testing;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace IIS.FunctionalTests
+{
+    public class MofFileTests
+    {
+        [ConditionalFact]
+        [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+        [RequiresIIS(IISCapability.TracingModule)]
+        public void CheckMofFile()
+        {
+            var path = Path.Combine(TestPathUtilities.GetSolutionRootDirectory("IISIntegration"), "src", "aspnetcoremodulev2", "aspnetcore", "ancm.mof");
+            var process = Process.Start("mofcomp.exe", path);
+            process.WaitForExit();
+            Assert.Equal(0, process.ExitCode);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b26f48a8159df06f5af2735263bc80cdeec3a14f
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.Extensions.Logging.Testing;
+using Xunit;
+
+[assembly: CollectionBehavior(DisableTestParallelization = true)]
+[assembly: RequiresIIS]
+[assembly: ShortClassName]
diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..cfbbf7048676a886f47145fa1304fe0c84d6933d
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs
@@ -0,0 +1,150 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Security.Principal;
+using System.Xml.Linq;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Win32;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class RequiresIISAttribute : Attribute, ITestCondition
+    {
+        private static readonly (IISCapability Capability, string DllName)[] Modules =
+        {
+            (IISCapability.Websockets, "iiswsock.dll"),
+            (IISCapability.WindowsAuthentication, "authsspi.dll"),
+            (IISCapability.DynamicCompression, "compdyn.dll"),
+            (IISCapability.ApplicationInitialization, "warmup.dll"),
+            (IISCapability.TracingModule, "iisetw.dll"),
+            (IISCapability.FailedRequestTracingModule, "iisfreb.dll"),
+            (IISCapability.BasicAuthentication, "authbas.dll"),
+        };
+
+        private static readonly bool _isMetStatic;
+        private static readonly string _skipReasonStatic;
+        private static readonly bool _poolEnvironmentVariablesAvailable;
+        private static readonly IISCapability _modulesAvailable;
+
+        static RequiresIISAttribute()
+        {
+            if (Environment.GetEnvironmentVariable("ASPNETCORE_TEST_SKIP_IIS") == "true")
+            {
+                _skipReasonStatic = "Test skipped using ASPNETCORE_TEST_SKIP_IIS environment variable";
+                return;
+            }
+
+            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+            {
+                _skipReasonStatic = "IIS tests can only be run on Windows";
+                return;
+            }
+
+            var identity = WindowsIdentity.GetCurrent();
+            var principal = new WindowsPrincipal(identity);
+            if (!principal.IsInRole(WindowsBuiltInRole.Administrator))
+            {
+                _skipReasonStatic += "The current console is not running as admin.";
+                return;
+            }
+
+            if (!File.Exists(Path.Combine(Environment.SystemDirectory, "inetsrv", "w3wp.exe")))
+            {
+                _skipReasonStatic += "The machine does not have IIS installed.";
+                return;
+            }
+
+            var ancmConfigPath = Path.Combine(Environment.SystemDirectory, "inetsrv", "config", "schema", "aspnetcore_schema_v2.xml");
+
+            if (!File.Exists(ancmConfigPath))
+            {
+                _skipReasonStatic = "IIS Schema is not installed.";
+                return;
+            }
+
+            XDocument ancmConfig;
+
+            try
+            {
+                ancmConfig = XDocument.Load(ancmConfigPath);
+            }
+            catch
+            {
+                _skipReasonStatic = "Could not read ANCM schema configuration";
+                return;
+            }
+
+            _isMetStatic = ancmConfig
+                .Root
+                .Descendants("attribute")
+                .Any(n => "hostingModel".Equals(n.Attribute("name")?.Value, StringComparison.Ordinal));
+
+            _skipReasonStatic = _isMetStatic ? null : "IIS schema needs to be upgraded to support ANCM.";
+
+            foreach (var module in Modules)
+            {
+                if (File.Exists(Path.Combine(Environment.SystemDirectory, "inetsrv", module.DllName)))
+                {
+                    _modulesAvailable |= module.Capability;
+                }
+            }
+
+            var iisRegistryKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\InetStp", writable: false);
+            if (iisRegistryKey == null)
+            {
+                _poolEnvironmentVariablesAvailable = false;
+            }
+            else
+            {
+                var majorVersion = (int)iisRegistryKey.GetValue("MajorVersion", -1);
+                var minorVersion = (int)iisRegistryKey.GetValue("MinorVersion", -1);
+                var version = new Version(majorVersion, minorVersion);
+                _poolEnvironmentVariablesAvailable = version >= new Version(10, 0);
+            }
+        }
+
+        public RequiresIISAttribute()
+            : this(IISCapability.None) { }
+
+        public RequiresIISAttribute(IISCapability capabilities)
+        {
+            IsMet = _isMetStatic;
+            SkipReason = _skipReasonStatic;
+            if (capabilities.HasFlag(IISCapability.PoolEnvironmentVariables))
+            {
+                IsMet &= _poolEnvironmentVariablesAvailable;
+                if (!_poolEnvironmentVariablesAvailable)
+                {
+                    SkipReason += "The machine does allow for setting environment variables on application pools.";
+                }
+            }
+
+            if (capabilities.HasFlag(IISCapability.ShutdownToken))
+            {
+                IsMet = false;
+                SkipReason += "https://github.com/aspnet/IISIntegration/issues/1074";
+            }
+
+            foreach (var module in Modules)
+            {
+                if (capabilities.HasFlag(module.Capability))
+                {
+                    var available = _modulesAvailable.HasFlag(module.Capability);
+                    IsMet &= available;
+                    if (!available)
+                    {
+                        SkipReason += $"The machine does have {module.Capability} available.";
+                    }
+                }
+            }
+        }
+
+        public bool IsMet { get; }
+        public string SkipReason { get; }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..875b5b13be8db4d091763b09849b8661749c1f8c
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs
@@ -0,0 +1,96 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.ServiceProcess;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace IIS.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class ApplicationInitializationTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public ApplicationInitializationTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.ApplicationInitialization)]
+        [InlineData(HostingModel.InProcess)]
+        [InlineData(HostingModel.OutOfProcess)]
+        public async Task ApplicationPreloadStartsApp(HostingModel hostingModel)
+        {
+            // This test often hits a memory leak in warmup.dll module, it has been reported to IIS team
+            using (AppVerifier.Disable(DeployerSelector.ServerType, 0x900))
+            {
+                var baseDeploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel, publish: true);
+                baseDeploymentParameters.TransformArguments(
+                    (args, contentRoot) => $"{args} CreateFile \"{Path.Combine(contentRoot, "Started.txt")}\"");
+                EnablePreload(baseDeploymentParameters);
+
+                var result = await DeployAsync(baseDeploymentParameters);
+
+                await Helpers.Retry(async () => await File.ReadAllTextAsync(Path.Combine(result.ContentRoot, "Started.txt")), 10, 200);
+                StopServer();
+                EventLogHelpers.VerifyEventLogEvent(result, EventLogHelpers.Started(result));
+            }
+        }
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.ApplicationInitialization)]
+        [InlineData(HostingModel.InProcess)]
+        [InlineData(HostingModel.OutOfProcess)]
+        public async Task ApplicationInitializationPageIsRequested(HostingModel hostingModel)
+        {
+            // This test often hits a memory leak in warmup.dll module, it has been reported to IIS team
+            using (AppVerifier.Disable(DeployerSelector.ServerType, 0x900))
+            {
+                var baseDeploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel, publish: true);
+                EnablePreload(baseDeploymentParameters);
+
+                baseDeploymentParameters.ServerConfigActionList.Add(
+                    (config, _) => {
+                        config
+                            .RequiredElement("system.webServer")
+                            .GetOrAdd("applicationInitialization")
+                            .GetOrAdd("add", "initializationPage", "/CreateFile");
+                    });
+
+                var result = await DeployAsync(baseDeploymentParameters);
+
+                await Helpers.Retry(async () => await File.ReadAllTextAsync(Path.Combine(result.ContentRoot, "Started.txt")), 10, 200);
+                StopServer();
+                EventLogHelpers.VerifyEventLogEvent(result, EventLogHelpers.Started(result));
+            }
+        }
+
+        private static void EnablePreload(IISDeploymentParameters baseDeploymentParameters)
+        {
+            baseDeploymentParameters.EnsureSection("applicationInitialization", "system.webServer");
+            baseDeploymentParameters.ServerConfigActionList.Add(
+                (config, _) => {
+
+                    config
+                        .RequiredElement("system.applicationHost")
+                        .RequiredElement("sites")
+                        .RequiredElement("site")
+                        .RequiredElement("application")
+                        .SetAttributeValue("preloadEnabled", true);
+                });
+
+            baseDeploymentParameters.EnableModule("ApplicationInitializationModule", "%IIS_BIN%\\warmup.dll");
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config b/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config
new file mode 100644
index 0000000000000000000000000000000000000000..5e994d28551dacdd79bd73ae1ac335882ca9ac70
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    IIS configuration sections.
+
+    For schema documentation, see
+    %windir%\system32\inetsrv\config\schema\IIS_schema.xml.
+
+    Please make a backup of this file before making any changes to it.
+
+-->
+
+<configuration>
+
+  <!--
+
+      The <configSections> section controls the registration of sections.
+      Section is the basic unit of deployment, locking, searching and
+      containment for configuration settings.
+
+      Every section belongs to one section group.
+      A section group is a container of logically-related sections.
+
+      Sections cannot be nested.
+      Section groups may be nested.
+
+      <section
+          name=""  [Required, Collection Key] [XML name of the section]
+          allowDefinition="Everywhere" [MachineOnly|MachineToApplication|AppHostOnly|Everywhere] [Level where it can be set]
+          overrideModeDefault="Allow"  [Allow|Deny] [Default delegation mode]
+          allowLocation="true"  [true|false] [Allowed in location tags]
+      />
+
+      The recommended way to unlock sections is by using a location tag:
+      <location path="Default Web Site" overrideMode="Allow">
+          <system.webServer>
+              <asp />
+          </system.webServer>
+      </location>
+
+  -->
+  <configSections>
+    <sectionGroup name="system.applicationHost">
+      <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+      <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+      <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+      <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+      <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+      <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+      <section name="sites" overrideModeDefault="Allow" />
+      <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+    </sectionGroup>
+
+    <sectionGroup name="system.webServer">
+      <section name="asp" overrideModeDefault="Deny" />
+      <section name="caching" overrideModeDefault="Allow" />
+      <section name="aspNetCore" overrideModeDefault="Allow" />
+      <section name="cgi" overrideModeDefault="Deny" />
+      <section name="defaultDocument" overrideModeDefault="Allow" />
+      <section name="directoryBrowse" overrideModeDefault="Allow" />
+      <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+      <section name="globalModules" overrideModeDefault="Allow" />
+      <section name="handlers" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
+      <section name="httpCompression" overrideModeDefault="Allow" />
+      <section name="httpErrors" overrideModeDefault="Allow" />
+      <section name="httpLogging" overrideModeDefault="Deny" />
+      <section name="httpProtocol" overrideModeDefault="Allow" />
+      <section name="httpRedirect" overrideModeDefault="Allow" />
+      <section name="httpTracing" overrideModeDefault="Deny" />
+      <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+      <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+      <section name="applicationInitialization" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
+      <section name="odbcLogging" overrideModeDefault="Deny" />
+      <sectionGroup name="security">
+        <section name="access" overrideModeDefault="Deny" />
+        <section name="applicationDependencies" overrideModeDefault="Deny" />
+        <sectionGroup name="authentication">
+          <section name="anonymousAuthentication" overrideModeDefault="Deny" />
+          <section name="basicAuthentication" overrideModeDefault="Deny" />
+          <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+          <section name="digestAuthentication" overrideModeDefault="Deny" />
+          <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+          <section name="windowsAuthentication" overrideModeDefault="Deny" />
+        </sectionGroup>
+        <section name="authorization" overrideModeDefault="Allow" />
+        <section name="ipSecurity" overrideModeDefault="Deny" />
+        <section name="dynamicIpSecurity" overrideModeDefault="Deny" />
+        <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+        <section name="requestFiltering" overrideModeDefault="Allow" />
+      </sectionGroup>
+      <section name="serverRuntime" overrideModeDefault="Deny" />
+      <section name="serverSideInclude" overrideModeDefault="Deny" />
+      <section name="staticContent" overrideModeDefault="Allow" />
+      <sectionGroup name="tracing">
+        <section name="traceFailedRequests" overrideModeDefault="Allow" />
+        <section name="traceProviderDefinitions" overrideModeDefault="Deny" />
+      </sectionGroup>
+      <section name="urlCompression" overrideModeDefault="Allow" />
+      <section name="validation" overrideModeDefault="Allow" />
+      <sectionGroup name="webdav">
+        <section name="globalSettings" overrideModeDefault="Deny" />
+        <section name="authoring" overrideModeDefault="Deny" />
+        <section name="authoringRules" overrideModeDefault="Deny" />
+      </sectionGroup>
+      <section name="webSocket" overrideModeDefault="Deny" />
+    </sectionGroup>
+    <sectionGroup name="system.ftpServer">
+      <section name="log" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+      <section name="firewallSupport" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+      <section name="caching" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+      <section name="providerDefinitions" overrideModeDefault="Deny" />
+      <sectionGroup name="security">
+        <section name="ipSecurity" overrideModeDefault="Deny" />
+        <section name="requestFiltering" overrideModeDefault="Deny" />
+        <section name="authorization" overrideModeDefault="Deny" />
+        <section name="authentication" overrideModeDefault="Deny" />
+      </sectionGroup>
+      <section name="serverRuntime" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+    </sectionGroup>
+  </configSections>
+
+  <system.applicationHost>
+
+    <applicationPools>
+      <add name="DefaultAppPool" />
+      <applicationPoolDefaults managedRuntimeVersion="v4.0">
+        <processModel identityType="ApplicationPoolIdentity" />
+      </applicationPoolDefaults>
+    </applicationPools>
+
+    <!--
+
+      The <customMetadata> section is used internally by the Admin Base Objects
+      (ABO) Compatibility component. Please do not modify its content.
+
+    -->
+    <customMetadata />
+
+    <!--
+
+      The <listenerAdapters> section defines the protocols with which the
+      Windows Process Activation Service (WAS) binds.
+
+    -->
+    <listenerAdapters>
+      <add name="http" />
+    </listenerAdapters>
+
+    <log>
+      <centralBinaryLogFile enabled="false" />
+      <centralW3CLogFile enabled="false" />
+    </log>
+
+    <sites>
+      <site name="Default Web Site" id="1">
+        <application path="/">
+          <virtualDirectory path="/" physicalPath="." />
+        </application>
+        <bindings>
+          <binding protocol="http" bindingInformation="*:50691:localhost" />
+        </bindings>
+      </site>
+      <applicationDefaults applicationPool="DefaultAppPool" />
+      <virtualDirectoryDefaults allowSubDirConfig="true" />
+    </sites>
+
+    <webLimits />
+
+  </system.applicationHost>
+
+  <system.webServer>
+
+    <!--
+
+      The <globalModules> section defines all native-code modules.
+      To enable a module, specify it in the <modules> section.
+
+    -->
+    <globalModules>
+      <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" />
+      <add name="AspNetCoreModuleV2" image="aspnetcorev2.dll" />
+    </globalModules>
+
+    <handlers accessPolicy="Read, Script">
+      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
+    </handlers>
+
+
+    <modules>
+      <add name="AnonymousAuthenticationModule" lockItem="true" />
+      <add name="AspNetCoreModuleV2" lockItem="true" />
+    </modules>
+
+    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" hostingModel="inprocess" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /> 
+
+  </system.webServer>
+
+</configuration>
diff --git a/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs b/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..dbe562aa7cf4242ee0c23090234fdd2c03b1b8db
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs
@@ -0,0 +1,302 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [SkipIfHostableWebCoreNotAvailable]
+    [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")]
+    public class ClientDisconnectTests : StrictTestServerTests
+    {
+        [ConditionalFact]
+        public async Task WritesSucceedAfterClientDisconnect()
+        {
+            var requestStartedCompletionSource = CreateTaskCompletionSource();
+            var clientDisconnectedCompletionSource = CreateTaskCompletionSource();
+            var requestCompletedCompletionSource = CreateTaskCompletionSource();
+
+            var data = new byte[1024];
+            using (var testServer = await TestServer.Create(
+                async ctx =>
+                {
+                    requestStartedCompletionSource.SetResult(true);
+                    await clientDisconnectedCompletionSource.Task;
+                    for (var i = 0; i < 1000; i++)
+                    {
+                        await ctx.Response.Body.WriteAsync(data);
+                    }
+
+                    requestCompletedCompletionSource.SetResult(true);
+                }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await requestStartedCompletionSource.Task.DefaultTimeout();
+                }
+                clientDisconnectedCompletionSource.SetResult(true);
+
+                await requestCompletedCompletionSource.Task.DefaultTimeout();
+            }
+
+            AssertConnectionDisconnectLog();
+        }
+
+        [ConditionalFact]
+        public async Task WritesCancelledWhenUsingAbortedToken()
+        {
+            var requestStartedCompletionSource = CreateTaskCompletionSource();
+            var requestCompletedCompletionSource = CreateTaskCompletionSource();
+
+            Exception exception = null;
+
+            var data = new byte[1];
+            using (var testServer = await TestServer.Create(async ctx =>
+            {
+                requestStartedCompletionSource.SetResult(true);
+                try
+                {
+                    while (true)
+                    {
+                        await ctx.Response.Body.WriteAsync(data, ctx.RequestAborted);
+                    }
+                }
+                catch (Exception e)
+                {
+                    exception = e;
+                }
+
+                requestCompletedCompletionSource.SetResult(true);
+            }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+
+                    await requestStartedCompletionSource.Task.DefaultTimeout();
+                }
+
+                await requestCompletedCompletionSource.Task.DefaultTimeout();
+
+                Assert.IsType<OperationCanceledException>(exception);
+            }
+
+            AssertConnectionDisconnectLog();
+        }
+
+        [ConditionalFact]
+        public async Task ReadThrowsAfterClientDisconnect()
+        {
+            var requestStartedCompletionSource = CreateTaskCompletionSource();
+            var requestCompletedCompletionSource = CreateTaskCompletionSource();
+
+            Exception exception = null;
+
+            var data = new byte[1024];
+            using (var testServer = await TestServer.Create(async ctx =>
+            {
+                requestStartedCompletionSource.SetResult(true);
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(data);
+                }
+                catch (Exception e)
+                {
+                    exception = e;
+                }
+
+                requestCompletedCompletionSource.SetResult(true);
+            }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await requestStartedCompletionSource.Task.DefaultTimeout();
+                }
+
+                await requestCompletedCompletionSource.Task.DefaultTimeout();
+            }
+
+            Assert.IsType<ConnectionResetException>(exception);
+            Assert.Equal("The client has disconnected", exception.Message);
+
+            AssertConnectionDisconnectLog();
+        }
+
+        [ConditionalFact]
+        public async Task WriterThrowsCancelledException()
+        {
+            var requestStartedCompletionSource = CreateTaskCompletionSource();
+            var requestCompletedCompletionSource = CreateTaskCompletionSource();
+
+            Exception exception = null;
+            var cancellationTokenSource = new CancellationTokenSource();
+
+            var data = new byte[1];
+            using (var testServer = await TestServer.Create(async ctx =>
+            {
+                requestStartedCompletionSource.SetResult(true);
+                try
+                {
+                    while (true)
+                    {
+                        await ctx.Response.Body.WriteAsync(data, cancellationTokenSource.Token);
+                    }
+                }
+                catch (Exception e)
+                {
+                    exception = e;
+                }
+
+                requestCompletedCompletionSource.SetResult(true);
+            }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+
+                    await requestStartedCompletionSource.Task.DefaultTimeout();
+                    cancellationTokenSource.Cancel();
+                    await requestCompletedCompletionSource.Task.DefaultTimeout();
+                }
+
+                Assert.IsType<OperationCanceledException>(exception);
+            }
+        }
+
+        [ConditionalFact]
+        public async Task ReaderThrowsCancelledException()
+        {
+            var requestStartedCompletionSource = CreateTaskCompletionSource();
+            var requestCompletedCompletionSource = CreateTaskCompletionSource();
+
+            Exception exception = null;
+            var cancellationTokenSource = new CancellationTokenSource();
+
+            var data = new byte[1024];
+            using (var testServer = await TestServer.Create(async ctx =>
+            {
+                requestStartedCompletionSource.SetResult(true);
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(data, cancellationTokenSource.Token);
+                }
+                catch (Exception e)
+                {
+                    exception = e;
+                }
+
+                requestCompletedCompletionSource.SetResult(true);
+            }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await requestStartedCompletionSource.Task.DefaultTimeout();
+                    cancellationTokenSource.Cancel();
+                    await requestCompletedCompletionSource.Task.DefaultTimeout();
+                }
+                Assert.IsType<OperationCanceledException>(exception);
+            }
+        }
+
+        [ConditionalFact]
+        public async Task ReaderThrowsResetExceptionOnInvalidBody()
+        {
+            var requestStartedCompletionSource = CreateTaskCompletionSource();
+            var requestCompletedCompletionSource = CreateTaskCompletionSource();
+
+            Exception exception = null;
+
+            var data = new byte[1024];
+            using (var testServer = await TestServer.Create(async ctx =>
+            {
+                requestStartedCompletionSource.SetResult(true);
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(data);
+                }
+                catch (Exception e)
+                {
+                    exception = e;
+                }
+
+                requestCompletedCompletionSource.SetResult(true);
+            }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await connection.Send(
+                        "POST / HTTP/1.1",
+                        "Transfer-Encoding: chunked",
+                        "Host: localhost",
+                        "Connection: close",
+                        "",
+                        "");
+
+                    await requestStartedCompletionSource.Task;
+                    await connection.Send(
+                        "ZZZZZZZZZZZZZ");
+
+                    await connection.Receive(
+                        "HTTP/1.1 400 Bad Request",
+                        ""
+                        );
+
+                }
+                await requestCompletedCompletionSource.Task.DefaultTimeout();
+            }
+
+            Assert.IsType<ConnectionResetException>(exception);
+            Assert.Equal("The client has disconnected", exception.Message);
+            AssertConnectionDisconnectLog();
+        }
+
+        [ConditionalFact]
+        public async Task RequestAbortedIsTrippedWithoutIO()
+        {
+            var requestStarted = CreateTaskCompletionSource();
+            var requestAborted = CreateTaskCompletionSource();
+
+            using (var testServer = await TestServer.Create(
+                async ctx => {
+                    ctx.RequestAborted.Register(() => requestAborted.SetResult(true));
+                    requestStarted.SetResult(true);
+                    await requestAborted.Task;
+                }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await requestStarted.Task;
+                }
+                await requestAborted.Task;
+            }
+
+            AssertConnectionDisconnectLog();
+        }
+
+        private void AssertConnectionDisconnectLog()
+        {
+            Assert.Single(TestSink.Writes, w => w.EventId.Name == "ConnectionDisconnect");
+        }
+
+        private static async Task SendContentLength1Post(TestConnection connection)
+        {
+            await connection.Send(
+                "POST / HTTP/1.1",
+                "Content-Length: 1",
+                "Host: localhost",
+                "Connection: close",
+                "",
+                "");
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs b/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..37e69b3a32d1efc44753cc22db6c254afb10a02e
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs
@@ -0,0 +1,54 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [SkipIfHostableWebCoreNotAvailable]
+    [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")]
+    public class HttpBodyControlFeatureTests : StrictTestServerTests
+    {
+        [ConditionalFact]
+        public async Task ThrowsOnSyncReadOrWrite()
+        {
+            Exception writeException = null;
+            Exception readException = null;
+            using (var testServer = await TestServer.Create(
+                ctx => {
+                    var bodyControl = ctx.Features.Get<IHttpBodyControlFeature>();
+                    bodyControl.AllowSynchronousIO = false;
+
+                    try
+                    {
+                        ctx.Response.Body.Write(new byte[10]);
+                    }
+                    catch (Exception ex)
+                    {
+                        writeException = ex;
+                    }
+
+                    try
+                    {
+                        ctx.Request.Body.Read(new byte[10]);
+                    }
+                    catch (Exception ex)
+                    {
+                        readException = ex;
+                    }
+
+                    return Task.CompletedTask;
+                }, LoggerFactory))
+            {
+                await testServer.HttpClient.GetStringAsync("/");
+            }
+
+            Assert.IsType<InvalidOperationException>(readException);
+            Assert.IsType<InvalidOperationException>(writeException);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs b/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3d91c445caf7e5206c321d4f3000e82037a76716
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs
@@ -0,0 +1,31 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [SkipIfHostableWebCoreNotAvailable]
+    [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")]
+    public class ConnectionIdFeatureTests : StrictTestServerTests
+    {
+        [ConditionalFact]
+        public async Task ProvidesConnectionId()
+        {
+            string connectionId = null;
+            using (var testServer = await TestServer.Create(ctx => {
+                    var connectionIdFeature = ctx.Features.Get<IHttpConnectionFeature>();
+                    connectionId = connectionIdFeature.ConnectionId;
+                    return Task.CompletedTask;
+                }, LoggerFactory))
+            {
+                await testServer.HttpClient.GetStringAsync("/");
+            }
+
+            Assert.NotNull(connectionId);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj b/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..3fdb2a53635127e9146a9453ee68a771ad25c60c
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj
@@ -0,0 +1,32 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
+  </PropertyGroup>
+
+  <Import Project="..\..\build\functional-test-assets.targets" />
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IIS\Microsoft.AspNetCore.Server.IIS.csproj" />
+    <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" />
+  </ItemGroup>
+
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Include="AppHostConfig\HostableWebCore.config" CopyToOutputDirectory="PreserveNewest" Link="%(FileName)%(Extension)" />
+    <None Include="$(AspNetCoreModuleV2ShimDll)" Condition="$(PackNativeAssets) == 'true'" CopyToOutputDirectory="PreserveNewest" Link="%(FileName)%(Extension)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs b/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c7ec472586fd8072d631038b532660c871484641
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs
@@ -0,0 +1,151 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [SkipIfHostableWebCoreNotAvailable]
+    [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")]
+    public class ResponseAbortTests : StrictTestServerTests
+    {
+        [ConditionalFact]
+        public async Task ClosesWithoutSendingAnything()
+        {
+            using (var testServer = await TestServer.Create(
+                ctx => {
+                    ctx.Abort();
+                    return Task.CompletedTask;
+                }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await connection.WaitForConnectionClose();
+                }
+            }
+        }
+
+        [ConditionalFact]
+        public async Task ClosesAfterDataSent()
+        {
+            var bodyReceived = CreateTaskCompletionSource();
+            using (var testServer = await TestServer.Create(
+                async ctx => {
+                    await ctx.Response.WriteAsync("Abort");
+                    await ctx.Response.Body.FlushAsync();
+                    await bodyReceived.Task.DefaultTimeout();
+                    ctx.Abort();
+                }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await connection.Receive(
+                        "HTTP/1.1 200 OK",
+                        "");
+                    await connection.ReceiveHeaders(
+                        "Transfer-Encoding: chunked");
+
+                    await connection.ReceiveChunk("Abort");
+                    bodyReceived.SetResult(true);
+                    await connection.WaitForConnectionClose();
+                }
+            }
+        }
+
+        [ConditionalFact]
+        public async Task ReadsThrowAfterAbort()
+        {
+            Exception exception = null;
+
+            using (var testServer = await TestServer.Create(
+                async ctx => {
+                    ctx.Abort();
+                    try
+                    {
+                        var a = new byte[10];
+                        await ctx.Request.Body.ReadAsync(a);
+                    }
+                    catch (Exception e)
+                    {
+                        exception = e;
+                    }
+                }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await connection.WaitForConnectionClose();
+                }
+            }
+
+            Assert.IsType<ConnectionAbortedException>(exception);
+        }
+
+        [ConditionalFact]
+        public async Task WritesNoopAfterAbort()
+        {
+            Exception exception = null;
+
+            using (var testServer = await TestServer.Create(
+                async ctx => {
+                    ctx.Abort();
+                    try
+                    {
+                        await ctx.Response.Body.WriteAsync(new byte[10]);
+                    }
+                    catch (Exception e)
+                    {
+                        exception = e;
+                    }
+                }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await connection.WaitForConnectionClose();
+                }
+            }
+
+            Assert.Null(exception);
+        }
+
+        [ConditionalFact]
+        public async Task RequestAbortedIsTrippedAfterAbort()
+        {
+            bool tokenAborted = false;
+            using (var testServer = await TestServer.Create(
+                ctx => {
+                    ctx.Abort();
+                    tokenAborted = ctx.RequestAborted.IsCancellationRequested;
+                    return Task.CompletedTask;
+                }, LoggerFactory))
+            {
+                using (var connection = testServer.CreateConnection())
+                {
+                    await SendContentLength1Post(connection);
+                    await connection.WaitForConnectionClose();
+                }
+            }
+
+            Assert.True(tokenAborted);
+        }
+
+        private static async Task SendContentLength1Post(TestConnection connection)
+        {
+            await connection.Send(
+                "POST / HTTP/1.1",
+                "Content-Length: 1",
+                "Host: localhost",
+                "",
+                "");
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs b/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c8f62beedbd3a5cbd1f24e5fc29c8fee8a7d5cb5
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs
@@ -0,0 +1,24 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Testing;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public class StrictTestServerTests: LoggedTest
+    {
+        public override void Dispose()
+        {
+            base.Dispose();
+            Assert.DoesNotContain(TestSink.Writes, w => w.LogLevel > LogLevel.Information);
+        }
+
+        protected static TaskCompletionSource<bool> CreateTaskCompletionSource()
+        {
+            return new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Tests/TestServerTest.cs b/src/IISIntegration/test/IIS.Tests/TestServerTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..40b538ea52a25c49207bfa99b03629d549d4b018
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/TestServerTest.cs
@@ -0,0 +1,35 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Testing.xunit;
+using Microsoft.Extensions.Logging.Testing;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [SkipIfHostableWebCoreNotAvailable]
+    [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")]
+    public class TestServerTest : StrictTestServerTests
+    {
+        [ConditionalFact]
+        public async Task SingleProcessTestServer_HelloWorld()
+        {
+            var helloWorld = "Hello World";
+            var expectedPath = "/Path";
+
+            string path = null;
+            using (var testServer = await TestServer.Create(ctx =>
+            {
+                path = ctx.Request.Path.ToString();
+                return ctx.Response.WriteAsync(helloWorld);
+            }, LoggerFactory))
+            {
+                var result = await testServer.HttpClient.GetAsync(expectedPath);
+                Assert.Equal(helloWorld, await result.Content.ReadAsStringAsync());
+                Assert.Equal(expectedPath, path);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs b/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b63743f10638c57f2a552c0574a6fa49cd8d3928
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs
@@ -0,0 +1,17 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class SkipIfHostableWebCoreNotAvailableAttribute : Attribute, ITestCondition
+    {
+        public bool IsMet { get; } = File.Exists(TestServer.HostableWebCoreLocation);
+
+        public string SkipReason { get; } = $"Hostable Web Core not available, {TestServer.HostableWebCoreLocation} not found.";
+    }
+}
diff --git a/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs b/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..351b826316974e45c6904625ca6dbd2cf1398e14
--- /dev/null
+++ b/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs
@@ -0,0 +1,211 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net.Http;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Runtime.Loader;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+using System.Xml.XPath;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Extensions;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.Common;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public class TestServer: IDisposable, IStartup
+    {
+        private const string InProcessHandlerDll = "aspnetcorev2_inprocess.dll";
+        private const string AspNetCoreModuleDll = "aspnetcorev2.dll";
+        private const string HWebCoreDll = "hwebcore.dll";
+
+        internal static string HostableWebCoreLocation => Environment.ExpandEnvironmentVariables($@"%windir%\system32\inetsrv\{HWebCoreDll}");
+        internal static string BasePath => Path.GetDirectoryName(new Uri(typeof(TestServer).Assembly.CodeBase).AbsolutePath);
+
+        internal static string AspNetCoreModuleLocation => Path.Combine(BasePath, AspNetCoreModuleDll);
+
+        private static readonly SemaphoreSlim WebCoreLock = new SemaphoreSlim(1, 1);
+
+        private static readonly int PortRetryCount = 10;
+
+        private readonly TaskCompletionSource<object> _startedTaskCompletionSource = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
+
+        private readonly Action<IApplicationBuilder> _appBuilder;
+        private readonly ILoggerFactory _loggerFactory;
+        private readonly hostfxr_main_fn _hostfxrMainFn;
+        
+        private Uri BaseUri => new Uri("http://localhost:" + _currentPort);
+        public HttpClient HttpClient { get; private set; }
+        public TestConnection CreateConnection() => new TestConnection(_currentPort);
+
+        private IWebHost _host;
+
+        private string _appHostConfigPath;
+        private int _currentPort;
+
+        private TestServer(Action<IApplicationBuilder> appBuilder, ILoggerFactory loggerFactory)
+        {
+            _hostfxrMainFn = Main;
+            _appBuilder = appBuilder;
+            _loggerFactory = loggerFactory;
+        }
+
+        public static async Task<TestServer> Create(Action<IApplicationBuilder> appBuilder, ILoggerFactory loggerFactory)
+        {
+            await WebCoreLock.WaitAsync();
+            var server = new TestServer(appBuilder, loggerFactory);
+            server.Start();
+            (await server.HttpClient.GetAsync("/start")).EnsureSuccessStatusCode();
+            await server._startedTaskCompletionSource.Task;
+            return server;
+        }
+
+        public static Task<TestServer> Create(RequestDelegate app, ILoggerFactory loggerFactory)
+        {
+            return Create(builder => builder.Run(app), loggerFactory);
+        }
+
+        private void Start()
+        {
+            LoadLibrary(HostableWebCoreLocation);
+            _appHostConfigPath = Path.GetTempFileName();
+            
+            set_main_handler(_hostfxrMainFn);
+
+            Retry(() =>
+            {
+                _currentPort = TestPortHelper.GetNextPort();
+
+                InitializeConfig(_currentPort);
+
+                var startResult = WebCoreActivate(_appHostConfigPath, null, "Instance");
+                if (startResult != 0)
+                {
+                    throw new InvalidOperationException($"Error while running WebCoreActivate: {startResult} on port {_currentPort}");
+                }
+            }, PortRetryCount);
+
+            HttpClient = new HttpClient(new LoggingHandler(new SocketsHttpHandler(), _loggerFactory.CreateLogger<TestServer>()))
+            {
+                BaseAddress = BaseUri
+            };
+        }
+
+        private void InitializeConfig(int port)
+        {
+            var webHostConfig = XDocument.Load(Path.GetFullPath("HostableWebCore.config"));
+            webHostConfig.XPathSelectElement("/configuration/system.webServer/globalModules/add[@name='AspNetCoreModuleV2']")
+                .SetAttributeValue("image", AspNetCoreModuleLocation);
+
+            var siteElement = webHostConfig.Root
+                .RequiredElement("system.applicationHost")
+                .RequiredElement("sites")
+                .RequiredElement("site");
+
+            siteElement
+                .RequiredElement("bindings")
+                .RequiredElement("binding")
+                .SetAttributeValue("bindingInformation", $":{port}:localhost");
+
+            webHostConfig.Save(_appHostConfigPath);
+        }
+
+        private int Main(IntPtr argc, IntPtr argv)
+        {
+            _host = new WebHostBuilder()
+                .UseIIS()
+                .ConfigureServices(services => {
+                        services.AddSingleton<IStartup>(this);
+                        services.AddSingleton(_loggerFactory);
+                })
+                .UseSetting(WebHostDefaults.ApplicationKey, typeof(TestServer).GetTypeInfo().Assembly.FullName)
+                .Build();
+
+            var doneEvent = new ManualResetEventSlim();
+            var lifetime = _host.Services.GetService<IApplicationLifetime>();
+
+            lifetime.ApplicationStopping.Register(() => doneEvent.Set());
+            _host.Start();
+            _startedTaskCompletionSource.SetResult(null);
+            doneEvent.Wait();
+            _host.Dispose();
+            return 0;
+        }
+
+        public void Dispose()
+        {
+            HttpClient.Dispose();
+
+            // WebCoreShutdown occasionally AVs
+            // This causes the dotnet test process to crash
+            // To avoid this, we have to wait to shutdown 
+            // and pass in true to immediately shutdown the hostable web core
+            // Both of these seem to be required.
+            Thread.Sleep(100);
+            WebCoreShutdown(immediate: true);
+            WebCoreLock.Release();
+        }
+
+        public IServiceProvider ConfigureServices(IServiceCollection services)
+        {
+            return services.BuildServiceProvider();
+        }
+
+        public void Configure(IApplicationBuilder app)
+        {
+            app.Map("/start", builder => builder.Run(context => context.Response.WriteAsync("Done")));
+            _appBuilder(app);
+        }
+
+        private delegate int hostfxr_main_fn(IntPtr argc, IntPtr argv);
+
+        [DllImport(HWebCoreDll)]
+        private static extern int WebCoreActivate(
+            [In, MarshalAs(UnmanagedType.LPWStr)]
+            string appHostConfigPath,
+            [In, MarshalAs(UnmanagedType.LPWStr)]
+            string rootWebConfigPath,
+            [In, MarshalAs(UnmanagedType.LPWStr)]
+            string instanceName);
+
+        [DllImport(HWebCoreDll)]
+        private static extern int WebCoreShutdown(bool immediate);
+
+        [DllImport(InProcessHandlerDll)]
+        private static extern int set_main_handler(hostfxr_main_fn main);
+
+        [DllImport("kernel32", SetLastError=true, CharSet = CharSet.Ansi)]
+        private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);
+
+        private void Retry(Action func, int attempts)
+        {
+            var exceptions = new List<Exception>();
+
+            for (var attempt = 0; attempt < attempts; attempt++)
+            {
+                try
+                {
+                    func();
+                    return;
+                }
+                catch (Exception e)
+                {
+                    exceptions.Add(e);
+                }
+            }
+
+            throw new AggregateException(exceptions);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ba6a1ec6e2f3eb00e52233899f22a875d7162c25
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs
@@ -0,0 +1,14 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    public static class DeployerSelector
+    {
+        public static ServerType ServerType => ServerType.IISExpress;
+        public static bool IsBackwardsCompatiblityTest => false;
+        public static bool IsForwardsCompatibilityTest => false;
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ac58f73c0e3025a5fb842951dab7073c3a1d2470
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs
@@ -0,0 +1,60 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.Common;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class HttpsTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public HttpsTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22, Tfm.Net461)
+                .WithAllApplicationTypes()
+                .WithAllAncmVersions()
+                .WithAllHostingModels();
+
+        [ConditionalTheory]
+        [MemberData(nameof(TestVariants))]
+        public async Task HttpsHelloWorld(TestVariant variant)
+        {
+            var port = TestPortHelper.GetNextSSLPort();
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
+            deploymentParameters.ApplicationBaseUriHint = $"https://localhost:{port}/";
+            deploymentParameters.AddHttpsToServerConfig();
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var handler = new HttpClientHandler
+            {
+                ServerCertificateCustomValidationCallback = (a, b, c, d) => true
+            };
+            var client = deploymentResult.CreateClient(handler);
+            var response = await client.GetAsync("HttpsHelloWorld");
+            var responseText = await response.Content.ReadAsStringAsync();
+            if (variant.HostingModel == HostingModel.OutOfProcess)
+            {
+                Assert.Equal("Scheme:https; Original:http", responseText);
+            }
+            else
+            {
+                Assert.Equal("Scheme:https; Original:", responseText);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj b/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..988c2d5943ec684829724e562fc70e76c26312da
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj
@@ -0,0 +1,38 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
+    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Content Include="..\Common.FunctionalTests\AppHostConfig\*.config" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" />
+    <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" />
+    <ProjectReference Include="..\WebSites\**\*.csproj">
+      <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
+    </ProjectReference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="..\Common.FunctionalTests\**\*.cs" />
+  </ItemGroup>
+
+  <Import Project="..\..\build\functional-test-assets.targets" />
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..47fb3a6553ec1ac3a432c56415d4ce26c4feb573
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs
@@ -0,0 +1,70 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class AuthenticationTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public AuthenticationTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        [RequiresIIS(IISCapability.WindowsAuthentication)]
+        public async Task Authentication_InProcess()
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            deploymentParameters.SetWindowsAuth();
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("/AuthenticationAnonymous");
+
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+            Assert.Equal("Anonymous?True", responseText);
+
+            response = await deploymentResult.HttpClient.GetAsync("/AuthenticationRestricted");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
+            Assert.Contains("NTLM", response.Headers.WwwAuthenticate.ToString());
+            Assert.Contains("Negotiate", response.Headers.WwwAuthenticate.ToString());
+
+            response = await deploymentResult.HttpClient.GetAsync("/AuthenticationRestrictedNTLM");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
+            Assert.Contains("NTLM", response.Headers.WwwAuthenticate.ToString());
+            // Note we can't restrict a challenge to a specific auth type, the native auth modules always add themselves.
+            Assert.Contains("Negotiate", response.Headers.WwwAuthenticate.ToString());
+
+            response = await deploymentResult.HttpClient.GetAsync("/AuthenticationForbidden");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
+
+            var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true };
+            var httpClient = deploymentResult.CreateHttpClient(httpClientHandler);
+
+            response = await httpClient.GetAsync("/AuthenticationAnonymous");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+            Assert.Equal("Anonymous?True", responseText);
+
+            response = await httpClient.GetAsync("/AuthenticationRestricted");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+            Assert.NotEmpty(responseText);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..caaf728c64d0a58e3c2d349748bf13673f08b727
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs
@@ -0,0 +1,90 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Net.Http;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class ShutdownTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public ShutdownTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public async Task ServerShutsDownWhenMainExits()
+        {
+            var parameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            var deploymentResult = await DeployAsync(parameters);
+            try
+            {
+                await deploymentResult.HttpClient.GetAsync("/Shutdown");
+            }
+            catch (HttpRequestException ex) when (ex.InnerException is IOException)
+            {
+                // Server might close a connection before request completes
+            }
+
+            deploymentResult.AssertWorkerProcessStop();
+        }
+
+
+        [ConditionalFact]
+        public async Task ServerShutsDownWhenMainExitsStress()
+        {
+            var parameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            var deploymentResult = await StartAsync(parameters);
+
+            var load = Helpers.StressLoad(deploymentResult.HttpClient, "/HelloWorld", response => {
+                var statusCode = (int)response.StatusCode;
+                Assert.True(statusCode == 200 || statusCode == 503, "Status code was " + statusCode);
+            });
+
+            try
+            {
+                await deploymentResult.HttpClient.GetAsync("/Shutdown");
+                await load;
+            }
+            catch (HttpRequestException ex) when (ex.InnerException is IOException | ex.InnerException is SocketException)
+            {
+                // Server might close a connection before request completes
+            }
+
+            deploymentResult.AssertWorkerProcessStop();
+        }
+
+        [ConditionalFact]
+        public async Task GracefulShutdown_DoesNotCrashProcess()
+        {
+            var parameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            var result = await DeployAsync(parameters);
+
+            var response = await result.HttpClient.GetAsync("/HelloWorld");
+            StopServer(gracefulShutdown: true);
+            Assert.True(result.HostProcess.ExitCode == 0);
+        }
+
+        [ConditionalFact]
+        public async Task ForcefulShutdown_DoesCrashProcess()
+        {
+            var parameters = _fixture.GetBaseDeploymentParameters(publish: true);
+            var result = await DeployAsync(parameters);
+
+            var response = await result.HttpClient.GetAsync("/HelloWorld");
+            StopServer(gracefulShutdown: false);
+            Assert.True(result.HostProcess.ExitCode == 1);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..826001c96d526262c23669461dd33a17b73ae38d
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs
@@ -0,0 +1,79 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Linq;
+using System.Net.WebSockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(IISTestSiteCollection.Name)]
+    [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No supported on this platform")]
+    public class WebSocketsTests
+    {
+        private readonly string _webSocketUri;
+
+        public WebSocketsTests(IISTestSiteFixture fixture)
+        {
+            _webSocketUri = fixture.DeploymentResult.ApplicationBaseUri.Replace("http:", "ws:");
+        }
+
+        [ConditionalFact]
+        public async Task OnStartedCalledForWebSocket()
+        {
+            var cws = new ClientWebSocket();
+            await cws.ConnectAsync(new Uri(_webSocketUri + "WebSocketLifetimeEvents"), default);
+
+            await ReceiveMessage(cws, "OnStarting");
+            await ReceiveMessage(cws, "Upgraded");
+        }
+
+        [ConditionalFact]
+        public async Task WebReadBeforeUpgrade()
+        {
+            var cws = new ClientWebSocket();
+            await cws.ConnectAsync(new Uri(_webSocketUri + "WebReadBeforeUpgrade"), default);
+
+            await ReceiveMessage(cws, "Yay");
+        }
+
+        [ConditionalFact]
+        public async Task CanSendAndReceieveData()
+        {
+            var cws = new ClientWebSocket();
+            await cws.ConnectAsync(new Uri(_webSocketUri + "WebSocketEcho"), default);
+
+            for (int i = 0; i < 1000; i++)
+            {
+                var mesage = i.ToString();
+                await SendMessage(cws, mesage);
+                await ReceiveMessage(cws, mesage);
+            }
+        }
+
+        private async Task SendMessage(ClientWebSocket webSocket, string message)
+        {
+            await webSocket.SendAsync(new ArraySegment<byte>(Encoding.ASCII.GetBytes(message)), WebSocketMessageType.Text, true, default);
+        }
+
+        private async Task ReceiveMessage(ClientWebSocket webSocket,  string expectedMessage)
+        {
+            var received = new byte[expectedMessage.Length];
+
+            var offset = 0;
+            WebSocketReceiveResult result;
+            do
+            {
+                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(received, offset, received.Length - offset), default);
+                offset += result.Count;
+            } while (!result.EndOfMessage);
+
+            Assert.Equal(expectedMessage, Encoding.ASCII.GetString(received));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..349f72d7bfd49fd0763012801b675442b4409044
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs
@@ -0,0 +1,81 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class MultipleAppTests : IISFunctionalTestBase
+    {
+        private readonly PublishedSitesFixture _fixture;
+
+        public MultipleAppTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalTheory]
+        [InlineData(AncmVersion.AspNetCoreModule)]
+        [InlineData(AncmVersion.AspNetCoreModuleV2)]
+        public Task Startup(AncmVersion ancmVersion)
+        {
+            // ANCM v1 currently does *not* retry if an app fails to start the first time due to a port collision.
+            // So, this test is expected to fail on v1 approximately 1 in 1,000 times (probably of at least one collision
+            // when 10 sites choose a random port from the range 1025-48000).  Adding one retry should reduce the failure
+            // rate from 1 in 1,000 to 1 in 1,000,000.  The previous product code (with "srand(GetTickCount())") should still
+            // fail the test reliably.
+            // https://github.com/aspnet/IISIntegration/issues/1350
+            // 
+            // ANCM v2 does retry on port collisions, so no retries should be required.
+            var attempts = (ancmVersion == AncmVersion.AspNetCoreModule) ? 2 : 1;
+
+            return Helpers.Retry(async () =>
+            {
+                const int numApps = 10;
+
+                using (var deployers = new DisposableList<ApplicationDeployer>())
+                {
+                    var deploymentResults = new List<DeploymentResult>();
+
+                    // Deploy all apps
+                    for (var i = 0; i < numApps; i++)
+                    {
+                        var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: IntegrationTesting.HostingModel.OutOfProcess);
+                        deploymentParameters.AncmVersion = ancmVersion;
+
+                        var deployer = CreateDeployer(deploymentParameters);
+                        deployers.Add(deployer);
+                        deploymentResults.Add(await deployer.DeployAsync());
+                    }
+
+                    // Start all requests as quickly as possible, so apps are started as quickly as possible,
+                    // to test possible race conditions when multiple apps start at the same time.
+                    var requestTasks = new List<Task<HttpResponseMessage>>();
+                    foreach (var deploymentResult in deploymentResults)
+                    {
+                        requestTasks.Add(deploymentResult.HttpClient.GetAsync("/HelloWorld"));
+                    }
+
+                    // Verify all apps started and return expected response
+                    foreach (var requestTask in requestTasks)
+                    {
+                        var response = await requestTask;
+                        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+                        var responseText = await response.Content.ReadAsStringAsync();
+                        Assert.Equal("Hello World", responseText);
+                    }
+                }
+            },
+            attempts: attempts, msDelay: 0);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3ff46bf3043211b74da9af50008fae88a65d52cb
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs
@@ -0,0 +1,87 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class NtlmAuthenticationTests : IISFunctionalTestBase
+    {
+        // Test only runs on IISExpress today as our CI machines do not have
+        // Windows auth installed globally.
+        // TODO either enable windows auth on our CI or use containers to test this
+        // behavior
+
+        private readonly PublishedSitesFixture _fixture;
+
+        public NtlmAuthenticationTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        public static TestMatrix TestVariants
+            => TestMatrix.ForServers(DeployerSelector.ServerType)
+                .WithTfms(Tfm.NetCoreApp22, Tfm.Net461)
+                .WithAllAncmVersions();
+
+        [ConditionalTheory]
+        [RequiresIIS(IISCapability.WindowsAuthentication)]
+        [MemberData(nameof(TestVariants))]
+        public async Task NtlmAuthentication(TestVariant variant)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
+            deploymentParameters.ApplicationBaseUriHint = $"https://localhost:0/";
+
+            deploymentParameters.SetWindowsAuth(enabled: true);
+
+            var result = await DeployAsync(deploymentParameters);
+            var response = await result.HttpClient.GetAsync("/HelloWorld");
+
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+            Assert.Equal("Hello World", responseText);
+
+            var httpClient = result.HttpClient;
+            response = await httpClient.GetAsync("/Anonymous");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+            Assert.Equal("Anonymous?True", responseText);
+
+            response = await httpClient.GetAsync("/Restricted");
+            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
+            Assert.Contains("NTLM", response.Headers.WwwAuthenticate.ToString());
+            Assert.Contains("Negotiate", response.Headers.WwwAuthenticate.ToString());
+
+            response = await httpClient.GetAsync("/RestrictedNTLM");
+            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
+            Assert.Contains("NTLM", response.Headers.WwwAuthenticate.ToString());
+            // Note we can't restrict a challenge to a specific auth type, the native auth modules always add themselves.
+            Assert.Contains("Negotiate", response.Headers.WwwAuthenticate.ToString());
+
+            response = await httpClient.GetAsync("/Forbidden");
+            Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
+
+            var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true };
+            httpClient = result.CreateClient(httpClientHandler);
+
+            response = await httpClient.GetAsync("/Anonymous");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+            Assert.Equal("Anonymous?True", responseText);
+
+            response = await httpClient.GetAsync("/Restricted");
+            responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+            Assert.NotEmpty(responseText);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b26f48a8159df06f5af2735263bc80cdeec3a14f
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests;
+using Microsoft.Extensions.Logging.Testing;
+using Xunit;
+
+[assembly: CollectionBehavior(DisableTestParallelization = true)]
+[assembly: RequiresIIS]
+[assembly: ShortClassName]
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2e0a68b9f74231489809adcd9d0d0eb30f6dfb49
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs
@@ -0,0 +1,24 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Testing.xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+    public sealed class RequiresIISAttribute : Attribute, ITestCondition
+    {
+        public bool IsMet => IISExpressAncmSchema.SupportsInProcessHosting;
+
+        public string SkipReason => IISExpressAncmSchema.SkipReason;
+
+        public RequiresIISAttribute() { }
+
+        public RequiresIISAttribute(IISCapability capabilities)
+        {
+            // IISCapabilities aren't pertinent to IISExpress
+        }
+    }
+}
diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..62d07c5fd9485aada79aae387931469dd32d85b9
--- /dev/null
+++ b/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs
@@ -0,0 +1,83 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
+using Microsoft.AspNetCore.Server.IntegrationTesting;
+using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
+{
+    [Collection(PublishedSitesCollection.Name)]
+    public class UpgradeFeatureDetectionTests : IISFunctionalTestBase
+    {
+        private readonly string _isWebsocketsSupported = Environment.OSVersion.Version >= new Version(6, 2) ? "Enabled" : "Disabled";
+        private readonly PublishedSitesFixture _fixture;
+
+        public UpgradeFeatureDetectionTests(PublishedSitesFixture fixture)
+        {
+            _fixture = fixture;
+        }
+
+        [ConditionalFact]
+        public Task UpgradeFeatureDetectionDisabled_InProcess()
+        {
+            // fails due to not modifying the apphost.config file.
+            return UpgradeFeatureDetectionDeployer(
+                disableWebSocket: true,
+                Helpers.GetInProcessTestSitesPath(),
+                "Disabled", HostingModel.InProcess);
+        }
+
+        [ConditionalFact]
+        public Task UpgradeFeatureDetectionEnabled_InProcess()
+        {
+            return UpgradeFeatureDetectionDeployer(
+                disableWebSocket: false,
+                Helpers.GetInProcessTestSitesPath(),
+                _isWebsocketsSupported, HostingModel.InProcess);
+        }
+
+        [ConditionalFact]
+        public Task UpgradeFeatureDetectionDisabled_OutOfProcess()
+        {
+            return UpgradeFeatureDetectionDeployer(
+                disableWebSocket: true,
+                Helpers.GetOutOfProcessTestSitesPath(),
+                "Disabled", HostingModel.OutOfProcess);
+        }
+
+        [ConditionalFact]
+        public Task UpgradeFeatureDetectionEnabled_OutOfProcess()
+        {
+            return UpgradeFeatureDetectionDeployer(
+                disableWebSocket: false,
+                Helpers.GetOutOfProcessTestSitesPath(),
+                _isWebsocketsSupported, HostingModel.OutOfProcess);
+        }
+
+        private async Task UpgradeFeatureDetectionDeployer(bool disableWebSocket, string sitePath, string expected, HostingModel hostingModel)
+        {
+            var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel, publish: true);
+
+            if (disableWebSocket)
+            {
+                // For IIS, we need to modify the apphost.config file
+                deploymentParameters.AddServerConfigAction(
+                    element => element.Descendants("webSocket")
+                        .Single()
+                        .SetAttributeValue("enabled", "false"));
+            }
+
+            var deploymentResult = await DeployAsync(deploymentParameters);
+
+            var response = await deploymentResult.HttpClient.GetAsync("UpgradeFeatureDetection");
+            var responseText = await response.Content.ReadAsStringAsync();
+            Assert.Equal(expected, responseText);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..772fbde2c31cfc5e038420298f2c20ad69c89f62
--- /dev/null
+++ b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs
@@ -0,0 +1,33 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Linq;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration
+{
+    public class IISExtensionTests
+    {
+        [Fact]
+        public void CallingUseIISIntegrationMultipleTimesWorks()
+        {
+
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .UseIISIntegration()
+                .Configure(app => { });
+            var server = new TestServer(builder);
+
+            var filters = server.Host.Services.GetServices<IStartupFilter>()
+                .OfType<IISSetupFilter>();
+
+            Assert.Single(filters);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0898b7ae21aa1dd36b9a7f2e9cb98d1facf2065e
--- /dev/null
+++ b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs
@@ -0,0 +1,420 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Net;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http.Features.Authentication;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Server.IISIntegration
+{
+    public class IISMiddlewareTests
+    {
+        [Fact]
+        public async Task MiddlewareSkippedIfTokenIsMissing()
+        {
+            var assertsExecuted = false;
+
+            var builder = new WebHostBuilder()
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    app.Run(context =>
+                    {
+                        var auth = context.Features.Get<IHttpAuthenticationFeature>();
+                        Assert.Null(auth);
+                        assertsExecuted = true;
+                        return Task.FromResult(0);
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var req = new HttpRequestMessage(HttpMethod.Get, "");
+            req.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            var response = await server.CreateClient().SendAsync(req);
+            Assert.True(assertsExecuted);
+            response.EnsureSuccessStatusCode();
+        }
+
+        [Fact]
+        public async Task MiddlewareRejectsRequestIfTokenHeaderIsMissing()
+        {
+            var assertsExecuted = false;
+
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    app.Run(context =>
+                    {
+                        var auth = context.Features.Get<IHttpAuthenticationFeature>();
+                        Assert.Null(auth);
+                        assertsExecuted = true;
+                        return Task.FromResult(0);
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var req = new HttpRequestMessage(HttpMethod.Get, "");
+            var response = await server.CreateClient().SendAsync(req);
+            Assert.False(assertsExecuted);
+            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
+        }
+
+        [Theory]
+        [InlineData("/", "/iisintegration", "shutdown")]
+        [InlineData("/", "/iisintegration", "Shutdown")]
+        [InlineData("/pathBase", "/pathBase/iisintegration", "shutdown")]
+        [InlineData("/pathBase", "/pathBase/iisintegration", "Shutdown")]
+        public async Task MiddlewareShutsdownGivenANCMShutdown(string pathBase, string requestPath, string shutdownEvent)
+        {
+            var requestExecuted = new ManualResetEvent(false);
+            var applicationStoppingFired = new ManualResetEvent(false);
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", pathBase)
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
+                    appLifetime.ApplicationStopping.Register(() => applicationStoppingFired.Set());
+
+                    app.Run(context =>
+                    {
+                        requestExecuted.Set();
+                        return Task.FromResult(0);
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var request = new HttpRequestMessage(HttpMethod.Post, requestPath);
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-EVENT", shutdownEvent);
+            var response = await server.CreateClient().SendAsync(request);
+
+            Assert.True(applicationStoppingFired.WaitOne(TimeSpan.FromSeconds(5)));
+            Assert.False(requestExecuted.WaitOne(0));
+            Assert.Equal(HttpStatusCode.Accepted, response.StatusCode);
+        }
+
+        public static TheoryData<HttpMethod> InvalidShutdownMethods
+        {
+            get
+            {
+                return new TheoryData<HttpMethod>
+                {
+                    HttpMethod.Put,
+                    HttpMethod.Trace,
+                    HttpMethod.Head,
+                    HttpMethod.Get,
+                    HttpMethod.Delete,
+                    HttpMethod.Options
+                };
+            }
+        }
+
+        [Theory]
+        [MemberData(nameof(InvalidShutdownMethods))]
+        public async Task MiddlewareIgnoresShutdownGivenWrongMethod(HttpMethod method)
+        {
+            var requestExecuted = new ManualResetEvent(false);
+            var applicationStoppingFired = new ManualResetEvent(false);
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
+                    appLifetime.ApplicationStopping.Register(() => applicationStoppingFired.Set());
+
+                    app.Run(context =>
+                    {
+                        requestExecuted.Set();
+                        return Task.FromResult(0);
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var request = new HttpRequestMessage(method, "/iisintegration");
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-EVENT", "shutdown");
+            var response = await server.CreateClient().SendAsync(request);
+
+            Assert.False(applicationStoppingFired.WaitOne(TimeSpan.FromSeconds(1)));
+            Assert.True(requestExecuted.WaitOne(0));
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+        }
+
+        [Theory]
+        [InlineData("/")]
+        [InlineData("/path")]
+        [InlineData("/path/iisintegration")]
+        public async Task MiddlewareIgnoresShutdownGivenWrongPath(string path)
+        {
+            var requestExecuted = new ManualResetEvent(false);
+            var applicationStoppingFired = new ManualResetEvent(false);
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
+                    appLifetime.ApplicationStopping.Register(() => applicationStoppingFired.Set());
+
+                    app.Run(context =>
+                    {
+                        requestExecuted.Set();
+                        return Task.FromResult(0);
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var request = new HttpRequestMessage(HttpMethod.Post, path);
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-EVENT", "shutdown");
+            var response = await server.CreateClient().SendAsync(request);
+
+            Assert.False(applicationStoppingFired.WaitOne(TimeSpan.FromSeconds(1)));
+            Assert.True(requestExecuted.WaitOne(0));
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+        }
+
+        [Theory]
+        [InlineData("event")]
+        [InlineData("")]
+        [InlineData(null)]
+        public async Task MiddlewareIgnoresShutdownGivenWrongEvent(string shutdownEvent)
+        {
+            var requestExecuted = new ManualResetEvent(false);
+            var applicationStoppingFired = new ManualResetEvent(false);
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
+                    appLifetime.ApplicationStopping.Register(() => applicationStoppingFired.Set());
+
+                    app.Run(context =>
+                    {
+                        requestExecuted.Set();
+                        return Task.FromResult(0);
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var request = new HttpRequestMessage(HttpMethod.Post, "/iisintegration");
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-EVENT", shutdownEvent);
+            var response = await server.CreateClient().SendAsync(request);
+
+            Assert.False(applicationStoppingFired.WaitOne(TimeSpan.FromSeconds(1)));
+            Assert.True(requestExecuted.WaitOne(0));
+            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+        }
+
+        [Fact]
+        public void UrlDelayRegisteredAndPreferHostingUrlsSet()
+        {
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    app.Run(context => Task.FromResult(0));
+                });
+
+            Assert.Null(builder.GetSetting(WebHostDefaults.ServerUrlsKey));
+            Assert.Null(builder.GetSetting(WebHostDefaults.PreferHostingUrlsKey));
+
+            // Adds a server and calls Build()
+            var server = new TestServer(builder);
+
+            Assert.Equal("http://127.0.0.1:12345", builder.GetSetting(WebHostDefaults.ServerUrlsKey));
+            Assert.Equal("true", builder.GetSetting(WebHostDefaults.PreferHostingUrlsKey));
+        }
+
+        [Fact]
+        public void PathBaseHiddenFromServer()
+        {
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/pathBase")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    app.Run(context => Task.FromResult(0));
+                });
+            new TestServer(builder);
+
+            Assert.Equal("http://127.0.0.1:12345", builder.GetSetting(WebHostDefaults.ServerUrlsKey));
+        }
+
+        [Fact]
+        public async Task AddsUsePathBaseMiddlewareWhenPathBaseSpecified()
+        {
+            var requestPathBase = string.Empty;
+            var requestPath = string.Empty;
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/pathbase")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    app.Run(context =>
+                    {
+                        requestPathBase = context.Request.PathBase.Value;
+                        requestPath = context.Request.Path.Value;
+                        return Task.FromResult(0);
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var request = new HttpRequestMessage(HttpMethod.Get, "/PathBase/Path");
+            request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            var response = await server.CreateClient().SendAsync(request);
+
+            Assert.Equal("/PathBase", requestPathBase);
+            Assert.Equal("/Path", requestPath);
+        }
+
+        [Fact]
+        public async Task AddsAuthenticationHandlerByDefault()
+        {
+            var assertsExecuted = false;
+
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .Configure(app =>
+                {
+                    app.Run(async context => 
+                    {
+                        var auth = context.RequestServices.GetRequiredService<IAuthenticationSchemeProvider>();
+                        var windows = await auth.GetSchemeAsync(IISDefaults.AuthenticationScheme);
+                        Assert.NotNull(windows);
+                        Assert.Null(windows.DisplayName);
+                        Assert.Equal("Microsoft.AspNetCore.Server.IISIntegration.AuthenticationHandler", windows.HandlerType.FullName);
+                        assertsExecuted = true;
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var req = new HttpRequestMessage(HttpMethod.Get, "");
+            req.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            await server.CreateClient().SendAsync(req);
+
+            Assert.True(assertsExecuted);
+        }
+
+        [Theory]
+        [InlineData(true)]
+        [InlineData(false)]
+        public async Task OnlyAddAuthenticationHandlerIfForwardWindowsAuthentication(bool forward)
+        {
+            var assertsExecuted = false;
+
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .ConfigureServices(services =>
+                {
+                    services.Configure<IISOptions>(options =>
+                    {
+                        options.ForwardWindowsAuthentication = forward;
+                    });
+                })
+                .Configure(app =>
+                {
+                    app.Run(async context => 
+                    {
+                        var auth = context.RequestServices.GetService<IAuthenticationSchemeProvider>();
+                        Assert.NotNull(auth);
+                        var windowsAuth = await auth.GetSchemeAsync(IISDefaults.AuthenticationScheme);
+                        if (forward)
+                        {
+                            Assert.NotNull(windowsAuth);
+                            Assert.Null(windowsAuth.DisplayName);
+                            Assert.Equal("AuthenticationHandler", windowsAuth.HandlerType.Name);
+                        }
+                        else
+                        {
+                            Assert.Null(windowsAuth);
+                        }
+                        assertsExecuted = true;
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var req = new HttpRequestMessage(HttpMethod.Get, "");
+            req.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            await server.CreateClient().SendAsync(req);
+
+            Assert.True(assertsExecuted);
+        }
+
+        [Theory]
+        [InlineData(true)]
+        [InlineData(false)]
+        public async Task DoesNotBlowUpWithoutAuth(bool forward)
+        {
+            var assertsExecuted = false;
+
+            var builder = new WebHostBuilder()
+                .UseSetting("TOKEN", "TestToken")
+                .UseSetting("PORT", "12345")
+                .UseSetting("APPL_PATH", "/")
+                .UseIISIntegration()
+                .ConfigureServices(services =>
+                {
+                    services.Configure<IISOptions>(options =>
+                    {
+                        options.ForwardWindowsAuthentication = forward;
+                    });
+                })
+                .Configure(app =>
+                {
+                    app.Run(context =>
+                    {
+                        assertsExecuted = true;
+                        return Task.FromResult(0);
+                    });
+                });
+            var server = new TestServer(builder);
+
+            var req = new HttpRequestMessage(HttpMethod.Get, "");
+            req.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken");
+            await server.CreateClient().SendAsync(req);
+
+            Assert.True(assertsExecuted);
+        }
+    }
+}
diff --git a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..ea19c2a1fc8924b2d04a5610691fbf986ae43a0f
--- /dev/null
+++ b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj
@@ -0,0 +1,18 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>$(StandardTestTfms)</TargetFrameworks>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IISIntegration\Microsoft.AspNetCore.Server.IISIntegration.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="$(MicrosoftAspNetCoreTestHostPackageVersion)" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs b/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4da8129d718b5593db3f516204a98d0f975f93b0
--- /dev/null
+++ b/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs
@@ -0,0 +1,62 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace TestTasks
+{
+    public class InjectRequestHandler
+    {
+        private static void Main(string[] args)
+        {
+            string rid = args[0];
+            string libraryLocation = args[1];
+            string depsFile = args[2];
+
+            JToken deps;
+            using (var file = File.OpenText(depsFile))
+            using (JsonTextReader reader = new JsonTextReader(file))
+            {
+                deps = JObject.ReadFrom(reader);
+            }
+
+            var libraryName = "ANCMRH/1.0";
+            var libraries = (JObject)deps["libraries"];
+            var targetName = (JValue)deps["runtimeTarget"]["name"];
+
+            var target = (JObject)deps["targets"][targetName.Value];
+            var targetLibrary = target.Properties().FirstOrDefault(p => p.Name == libraryName);
+            targetLibrary?.Remove();
+            targetLibrary =
+                new JProperty(libraryName, new JObject(
+                    new JProperty("runtimeTargets", new JObject(
+                        new JProperty(libraryLocation.Replace('\\', '/'), new JObject(
+                            new JProperty("rid", rid),
+                            new JProperty("assetType", "native")
+                        ))))));
+            target.AddFirst(targetLibrary);
+
+            var library = libraries.Properties().FirstOrDefault(p => p.Name == libraryName);
+            library?.Remove();
+            library =
+                new JProperty(libraryName, new JObject(
+                    new JProperty("type", "package"),
+                    new JProperty("serviceable", true),
+                    new JProperty("sha512", ""),
+                    new JProperty("path", libraryName),
+                    new JProperty("hashPath", "")));
+            libraries.AddFirst(library);
+            
+            using (var file = File.CreateText(depsFile))
+            using (var writer = new JsonTextWriter(file) { Formatting = Formatting.Indented })
+            {
+                deps.WriteTo(writer);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/TestTasks/TestTasks.csproj b/src/IISIntegration/test/TestTasks/TestTasks.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..aa4c144936ed01dfef867504051e2955347c7c7a
--- /dev/null
+++ b/src/IISIntegration/test/TestTasks/TestTasks.csproj
@@ -0,0 +1,12 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFrameworks>$(StandardTestTfms)</TargetFrameworks>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Newtonsoft.Json" Version="$(Tooling_NewtonsoftJsonPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/WebSites/Directory.Build.props b/src/IISIntegration/test/WebSites/Directory.Build.props
new file mode 100644
index 0000000000000000000000000000000000000000..9b29d34f1651f7ea5e77afeb4f9c362d3585d0b3
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/Directory.Build.props
@@ -0,0 +1,7 @@
+<Project>
+  <Import Project="..\Directory.Build.props" />
+
+  <ItemGroup>
+    <PackageReference Remove="Internal.AspNetCore.Sdk" />
+  </ItemGroup>
+</Project>
diff --git a/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj b/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..4d0952108a176c59fa568b6935e653cd05b16072
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj
@@ -0,0 +1,32 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <Import Project="..\..\..\build\testsite.props" />
+
+  <PropertyGroup>
+    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Include="..\shared\**\*.cs" />
+    <Compile Include="..\InProcessWebSite\*.cs" />
+    <Compile Include="..\InProcessWebSite\Properties\*.cs" />
+    <None Include="..\InProcessWebSite\web.config" CopyToOutputDirectory="Always" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Include="wwwroot\**" CopyToOutputDirectory="Always" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.Server.IIS" Version="$(MicrosoftAspNetCoreServerIISStablePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="$(MicrosoftAspNetCoreWebUtilitiesPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsConfigurationJsonPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json
new file mode 100644
index 0000000000000000000000000000000000000000..246b7a0b47d4fd6d27518dc694f3490ac52f2a56
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json
@@ -0,0 +1,42 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": true,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:5762/",
+      "sslPort": 0
+    }
+  },
+  "profiles": {
+    "ANCM IIS Express": {
+      "commandName": "Executable",
+      "executablePath": "$(IISExpressPath)",
+      "commandLineArgs": "$(IISExpressArguments)",
+      "environmentVariables": {
+        "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)",
+        "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)",
+        "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)",
+        "ANCM_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)",
+        "LAUNCHER_ARGS": "$(TargetPath)",
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "LAUNCHER_PATH": "$(DotNetPath)",
+        "ASPNETCORE_MODULE_DEBUG": "console"
+      }
+    },
+    "ANCM IIS": {
+      "commandName": "Executable",
+      "executablePath": "$(IISPath)",
+      "commandLineArgs": "$(IISArguments)",
+      "environmentVariables": {
+        "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)",
+        "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)",
+        "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)",
+        "ASPNETCORE_MODULE_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)",
+        "LAUNCHER_ARGS": "$(TargetPath)",
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "LAUNCHER_PATH": "$(DotNetPath)",
+        "ASPNETCORE_MODULE_DEBUG": "console"
+      }
+    }
+  }
+}
diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d122f057769e5426c91da57fbd26eab6510f69e5
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs
@@ -0,0 +1,30 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Hosting.Server;
+using Microsoft.AspNetCore.Http.Features;
+
+namespace TestSite
+{
+    public class DummyServer : IServer
+    {
+        public void Dispose()
+        {
+        }
+
+        public Task StartAsync<TContext>(IHttpApplication<TContext> application, CancellationToken cancellationToken)
+        {
+            return Task.Delay(TimeSpan.MaxValue);
+        }
+
+        public Task StopAsync(CancellationToken cancellationToken)
+        {
+            return Task.Delay(TimeSpan.MaxValue);
+        }
+
+        public IFeatureCollection Features { get; }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj b/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..d007d2daa1041ff04aa737eb77a593dd212601ae
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj
@@ -0,0 +1,33 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <Import Project="..\..\..\build\testsite.props" />
+
+  <PropertyGroup>
+    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
+    <InProcessTestSite>true</InProcessTestSite>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Server.IIS\Microsoft.AspNetCore.Server.IIS.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="..\shared\**\*.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Include="wwwroot\**" CopyToOutputDirectory="Always" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="$(MicrosoftAspNetCoreWebUtilitiesPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsConfigurationJsonPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c40448ee918d50193adbb058e95a71e5ae8e9589
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs
@@ -0,0 +1,114 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Hosting.Server;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace TestSite
+{
+    public static class Program
+    {
+        public static int Main(string[] args)
+        {
+            var mode = args.FirstOrDefault();
+            switch (mode)
+            {
+                case "CreateFile":
+                    File.WriteAllText(args[1], "");
+                    return StartServer();
+                case "CheckLargeStdOutWrites":
+                    Console.WriteLine(new string('a', 30000));
+                    break;
+                case "CheckLargeStdErrWrites":
+                    Console.Error.WriteLine(new string('a', 30000));
+                    Console.Error.Flush();
+                    break;
+                case "ConsoleWrite":
+                    Console.WriteLine($"Random number: {args[1]}");
+                    break;
+                case "ConsoleErrorWrite":
+                    Console.Error.WriteLine($"Random number: {args[1]}");
+                    Console.Error.Flush();
+                    break;
+                case "CheckOversizedStdErrWrites":
+                    Console.WriteLine(new string('a', 31000));
+                    break;
+                case "CheckOversizedStdOutWrites":
+                    Console.Error.WriteLine(new string('a', 31000));
+                    Console.Error.Flush();
+                    break;
+                case "Hang":
+                    Thread.Sleep(Timeout.Infinite);
+                    break;
+                case "Throw":
+                    throw new InvalidOperationException("Program.Main exception");
+                case "EarlyReturn":
+                    return 12;
+                case "HangOnStop":
+                    {
+                        var host = new WebHostBuilder()
+                            .UseIIS()
+                            .UseStartup<Startup>()
+                            .Build();
+                        host.Run();
+
+                        Thread.Sleep(Timeout.Infinite);
+                    }
+                    break;
+                case "CheckConsoleFunctions":
+                    // Call a bunch of console functions and make sure none return invalid handle.
+                    Console.OutputEncoding = Encoding.UTF8;
+                    Console.Title = "Test";
+                    Console.WriteLine($"Is Console redirection: {Console.IsOutputRedirected}");
+                    Console.BackgroundColor = ConsoleColor.Blue;
+                    Console.WriteLine("彡⾔");
+                    break;
+                case "OverriddenServer":
+                    {
+                        var host = new WebHostBuilder()
+                             .UseIIS()
+                             .ConfigureServices(services => services.AddSingleton<IServer, DummyServer>())
+                             .Configure(builder => builder.Run(async context => { await context.Response.WriteAsync("I shouldn't work"); }))
+                             .Build();
+                        host.Run();
+                    }
+                    break;
+                case "ConsoleErrorWriteStartServer":
+                    Console.Error.WriteLine("TEST MESSAGE");
+                    return StartServer();
+                case "ConsoleWriteStartServer":
+                    Console.WriteLine("TEST MESSAGE");
+                    return StartServer();
+                default:
+                    return StartServer();
+
+            }
+            return 12;
+        }
+
+        private static int StartServer()
+        {
+            var host = new WebHostBuilder()
+                .ConfigureLogging((_, factory) =>
+                {
+                    factory.AddConsole();
+                    factory.AddFilter("Console", level => level >= LogLevel.Information);
+                })
+                .UseIIS()
+                .UseStartup<Startup>()
+                .Build();
+
+            host.Run();
+            return 0;
+        }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json
new file mode 100644
index 0000000000000000000000000000000000000000..246b7a0b47d4fd6d27518dc694f3490ac52f2a56
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json
@@ -0,0 +1,42 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": true,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:5762/",
+      "sslPort": 0
+    }
+  },
+  "profiles": {
+    "ANCM IIS Express": {
+      "commandName": "Executable",
+      "executablePath": "$(IISExpressPath)",
+      "commandLineArgs": "$(IISExpressArguments)",
+      "environmentVariables": {
+        "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)",
+        "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)",
+        "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)",
+        "ANCM_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)",
+        "LAUNCHER_ARGS": "$(TargetPath)",
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "LAUNCHER_PATH": "$(DotNetPath)",
+        "ASPNETCORE_MODULE_DEBUG": "console"
+      }
+    },
+    "ANCM IIS": {
+      "commandName": "Executable",
+      "executablePath": "$(IISPath)",
+      "commandLineArgs": "$(IISArguments)",
+      "environmentVariables": {
+        "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)",
+        "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)",
+        "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)",
+        "ASPNETCORE_MODULE_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)",
+        "LAUNCHER_ARGS": "$(TargetPath)",
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "LAUNCHER_PATH": "$(DotNetPath)",
+        "ASPNETCORE_MODULE_DEBUG": "console"
+      }
+    }
+  }
+}
diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d658ebd03fe0d647b97d275afee0e8bdf2005b81
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs
@@ -0,0 +1,147 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net.WebSockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit;
+
+namespace TestSite
+{
+    public partial class Startup
+    {
+
+        private void WebsocketRequest(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                await context.Response.WriteAsync("test");
+            });
+        }
+
+        private void WebReadBeforeUpgrade(IApplicationBuilder app)
+        {
+            app.Run(async context => {
+
+                var singleByteArray = new byte[1];
+                Assert.Equal(0, await context.Request.Body.ReadAsync(singleByteArray, 0, 1));
+
+                var ws = await Upgrade(context);
+                await SendMessages(ws, "Yay");
+            });
+        }
+
+        private void WebSocketEcho(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                var ws = await Upgrade(context);
+
+                var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
+
+                await Echo(ws, appLifetime.ApplicationStopping);
+            });
+        }
+
+        private void WebSocketLifetimeEvents(IApplicationBuilder app)
+        {
+            app.Run(async context => {
+
+                var messages = new List<string>();
+
+                context.Response.OnStarting(() => {
+                    context.Response.Headers["custom-header"] = "value";
+                    messages.Add("OnStarting");
+                    return Task.CompletedTask;
+                });
+
+                var ws = await Upgrade(context);
+                messages.Add("Upgraded");
+
+                await SendMessages(ws, messages.ToArray());
+            });
+        }
+
+        private static async Task SendMessages(WebSocket webSocket, params string[] messages)
+        {
+            foreach (var message in messages)
+            {
+                await webSocket.SendAsync(new ArraySegment<byte>(Encoding.ASCII.GetBytes(message)), WebSocketMessageType.Text, true, CancellationToken.None);
+            }
+        }
+
+        private static async Task<WebSocket> Upgrade(HttpContext context)
+        {
+            var upgradeFeature = context.Features.Get<IHttpUpgradeFeature>();
+
+            // Generate WebSocket response headers
+            string key = context.Request.Headers[Constants.Headers.SecWebSocketKey].ToString();
+            var responseHeaders = HandshakeHelpers.GenerateResponseHeaders(key);
+            foreach (var headerPair in responseHeaders)
+            {
+                context.Response.Headers[headerPair.Key] = headerPair.Value;
+            }
+
+            // Upgrade the connection
+            Stream opaqueTransport = await upgradeFeature.UpgradeAsync();
+
+            // Get the WebSocket object
+            var ws = WebSocketProtocol.CreateFromStream(opaqueTransport, isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2));
+            return ws;
+        }
+
+        private async Task Echo(WebSocket webSocket, CancellationToken token)
+        {
+            var buffer = new byte[1024 * 4];
+            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
+            bool closeFromServer = false;
+            string closeFromServerCmd = "CloseFromServer";
+            int closeFromServerLength = closeFromServerCmd.Length;
+
+            while (!result.CloseStatus.HasValue && !token.IsCancellationRequested && !closeFromServer)
+            {
+                if (result.Count == closeFromServerLength &&
+                    Encoding.ASCII.GetString(buffer).Substring(0, result.Count) == closeFromServerCmd)
+                {
+                    // The client sent "CloseFromServer" text message to request the server to close (a test scenario).
+                    closeFromServer = true;
+                }
+                else
+                {
+                    await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, token);
+                    result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
+                }
+            }
+
+            if (result.CloseStatus.HasValue)
+            {
+                // Client-initiated close handshake
+                await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
+            }
+            else
+            {
+                // Server-initiated close handshake due to either of the two conditions:
+                // (1) The applicaton host is performing a graceful shutdown.
+                // (2) The client sent "CloseFromServer" text message to request the server to close (a test scenario).
+                await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeFromServerCmd, CancellationToken.None);
+
+                // The server has sent the Close frame.
+                // Stop sending but keep receiving until we get the Close frame from the client.
+                while (!result.CloseStatus.HasValue)
+                {
+                    result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
+                }
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs
new file mode 100644
index 0000000000000000000000000000000000000000..eb84272b76cdc66f0d047d5005fac71ffeac0a07
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs
@@ -0,0 +1,699 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Server.IIS;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Primitives;
+using Xunit;
+
+namespace TestSite
+{
+    public partial class Startup
+    {
+        public void Configure(IApplicationBuilder app)
+        {
+            TestStartup.Register(app, this);
+        }
+
+        private async Task ServerVariable(HttpContext ctx)
+        {
+            var varName = ctx.Request.Query["q"];
+            var newValue = ctx.Request.Query["v"];
+            var feature = ctx.Features.Get<IServerVariablesFeature>();
+            if (newValue.Count != 0)
+            {
+                feature[varName] = newValue;
+            }
+            await ctx.Response.WriteAsync($"{varName}: {feature[varName] ?? "(null)"}");
+        }
+
+        private async Task AuthenticationAnonymous(HttpContext ctx)
+        {
+            await ctx.Response.WriteAsync("Anonymous?" + !ctx.User.Identity.IsAuthenticated);
+        }
+
+        private async Task AuthenticationRestricted(HttpContext ctx)
+        {
+            if (ctx.User.Identity.IsAuthenticated)
+            {
+                await ctx.Response.WriteAsync(ctx.User.Identity.AuthenticationType);
+            }
+            else
+            {
+                await ctx.ChallengeAsync(IISServerDefaults.AuthenticationScheme);
+            }
+        }
+
+        private async Task AuthenticationForbidden(HttpContext ctx)
+        {
+            await ctx.ForbidAsync(IISServerDefaults.AuthenticationScheme);
+        }
+
+        private async Task AuthenticationRestrictedNTLM(HttpContext ctx)
+        {
+            if (string.Equals("NTLM", ctx.User.Identity.AuthenticationType, StringComparison.Ordinal))
+            {
+                await ctx.Response.WriteAsync("NTLM");
+            }
+            else
+            {
+                await ctx.ChallengeAsync(IISServerDefaults.AuthenticationScheme);
+            }
+        }
+
+        private async Task FeatureCollectionSetRequestFeatures(HttpContext ctx)
+        {
+            try
+            {
+                Assert.Equal("GET", ctx.Request.Method);
+                ctx.Request.Method = "test";
+                Assert.Equal("test", ctx.Request.Method);
+
+                Assert.Equal("http", ctx.Request.Scheme);
+                ctx.Request.Scheme = "test";
+                Assert.Equal("test", ctx.Request.Scheme);
+
+                Assert.Equal("/FeatureCollectionSetRequestFeatures", ctx.Request.PathBase);
+                ctx.Request.PathBase = "/base";
+                Assert.Equal("/base", ctx.Request.PathBase);
+
+                Assert.Equal("/path", ctx.Request.Path);
+                ctx.Request.Path = "/path";
+                Assert.Equal("/path", ctx.Request.Path);
+
+                Assert.Equal("?query", ctx.Request.QueryString.Value);
+                ctx.Request.QueryString = QueryString.Empty;
+                Assert.Equal("", ctx.Request.QueryString.Value);
+
+                Assert.Equal("HTTP/1.1", ctx.Request.Protocol);
+                ctx.Request.Protocol = "HTTP/1.0";
+                Assert.Equal("HTTP/1.0", ctx.Request.Protocol);
+
+                Assert.NotNull(ctx.Request.Headers);
+                var headers = new HeaderDictionary();
+                ctx.Features.Get<IHttpRequestFeature>().Headers = headers;
+                Assert.Same(headers, ctx.Features.Get<IHttpRequestFeature>().Headers);
+
+                Assert.NotNull(ctx.Request.Body);
+                var body = new MemoryStream();
+                ctx.Request.Body = body;
+                Assert.Same(body, ctx.Request.Body);
+
+                //Assert.NotNull(ctx.Features.Get<IHttpRequestIdentifierFeature>().TraceIdentifier);
+                //Assert.NotEqual(CancellationToken.None, ctx.RequestAborted);
+                //var token = new CancellationTokenSource().Token;
+                //ctx.RequestAborted = token;
+                //Assert.Equal(token, ctx.RequestAborted);
+
+                await ctx.Response.WriteAsync("Success");
+                return;
+            }
+            catch (Exception exception)
+            {
+                ctx.Response.StatusCode = 500;
+                await ctx.Response.WriteAsync(exception.ToString());
+            }
+            await ctx.Response.WriteAsync("_Failure");
+        }
+
+        private async Task FeatureCollectionSetResponseFeatures(HttpContext ctx)
+        {
+            try
+            {
+                Assert.Equal(200, ctx.Response.StatusCode);
+                ctx.Response.StatusCode = 404;
+                Assert.Equal(404, ctx.Response.StatusCode);
+                ctx.Response.StatusCode = 200;
+
+                Assert.Null(ctx.Features.Get<IHttpResponseFeature>().ReasonPhrase);
+                ctx.Features.Get<IHttpResponseFeature>().ReasonPhrase = "Set Response";
+                Assert.Equal("Set Response", ctx.Features.Get<IHttpResponseFeature>().ReasonPhrase);
+
+                Assert.NotNull(ctx.Response.Headers);
+                var headers = new HeaderDictionary();
+                ctx.Features.Get<IHttpResponseFeature>().Headers = headers;
+                Assert.Same(headers, ctx.Features.Get<IHttpResponseFeature>().Headers);
+
+                var originalBody = ctx.Response.Body;
+                Assert.NotNull(originalBody);
+                var body = new MemoryStream();
+                ctx.Response.Body = body;
+                Assert.Same(body, ctx.Response.Body);
+                ctx.Response.Body = originalBody;
+
+                await ctx.Response.WriteAsync("Success");
+                return;
+            }
+            catch (Exception exception)
+            {
+                ctx.Response.StatusCode = 500;
+                await ctx.Response.WriteAsync(exception.ToString());
+            }
+            await ctx.Response.WriteAsync("_Failure");
+        }
+
+        private async Task FeatureCollectionSetConnectionFeatures(HttpContext ctx)
+        {
+            try
+            {
+                Assert.True(IPAddress.IsLoopback(ctx.Connection.LocalIpAddress));
+                ctx.Connection.LocalIpAddress = IPAddress.IPv6Any;
+                Assert.Equal(IPAddress.IPv6Any, ctx.Connection.LocalIpAddress);
+
+                Assert.True(IPAddress.IsLoopback(ctx.Connection.RemoteIpAddress));
+                ctx.Connection.RemoteIpAddress = IPAddress.IPv6Any;
+                Assert.Equal(IPAddress.IPv6Any, ctx.Connection.RemoteIpAddress);
+                await ctx.Response.WriteAsync("Success");
+                return;
+            }
+            catch (Exception exception)
+            {
+                ctx.Response.StatusCode = 500;
+                await ctx.Response.WriteAsync(exception.ToString());
+            }
+            await ctx.Response.WriteAsync("_Failure");
+        }
+
+        private void Throw(HttpContext ctx)
+        {
+            throw new Exception();
+        }
+
+        private async Task SetCustomErorCode(HttpContext ctx)
+        {
+            var feature = ctx.Features.Get<IHttpResponseFeature>();
+            feature.ReasonPhrase = ctx.Request.Query["reason"];
+            feature.StatusCode = int.Parse(ctx.Request.Query["code"]);
+            if (ctx.Request.Query["writeBody"] == "True")
+            {
+                await ctx.Response.WriteAsync(ctx.Request.Query["body"]);
+            }
+        }
+
+        private async Task HelloWorld(HttpContext ctx)
+        {
+            if (ctx.Request.Path.Value.StartsWith("/Path"))
+            {
+                await ctx.Response.WriteAsync(ctx.Request.Path.Value);
+                return;
+            }
+            if (ctx.Request.Path.Value.StartsWith("/Query"))
+            {
+                await ctx.Response.WriteAsync(ctx.Request.QueryString.Value);
+                return;
+            }
+
+            await ctx.Response.WriteAsync("Hello World");
+        }
+
+        private async Task LargeResponseBody(HttpContext ctx)
+        {
+            if (int.TryParse(ctx.Request.Query["length"], out var length))
+            {
+                await ctx.Response.WriteAsync(new string('a', length));
+            }
+        }
+
+        private async Task ResponseHeaders(HttpContext ctx)
+        {
+            ctx.Response.Headers["UnknownHeader"] = "test123=foo";
+            ctx.Response.ContentType = "text/plain";
+            ctx.Response.Headers["MultiHeader"] = new StringValues(new string[] { "1", "2" });
+            await ctx.Response.WriteAsync("Request Complete");
+        }
+
+        private async Task ResponseInvalidOrdering(HttpContext ctx)
+        {
+            if (ctx.Request.Path.Equals("/SetStatusCodeAfterWrite"))
+            {
+                await ctx.Response.WriteAsync("Started_");
+                try
+                {
+                    ctx.Response.StatusCode = 200;
+                }
+                catch (InvalidOperationException)
+                {
+                    await ctx.Response.WriteAsync("SetStatusCodeAfterWriteThrew_");
+                }
+                await ctx.Response.WriteAsync("Finished");
+                return;
+            }
+            else if (ctx.Request.Path.Equals("/SetHeaderAfterWrite"))
+            {
+                await ctx.Response.WriteAsync("Started_");
+                try
+                {
+                    ctx.Response.Headers["This will fail"] = "some value";
+                }
+                catch (InvalidOperationException)
+                {
+                    await ctx.Response.WriteAsync("SetHeaderAfterWriteThrew_");
+                }
+                await ctx.Response.WriteAsync("Finished");
+                return;
+            }
+        }
+
+        private async Task CheckEnvironmentVariable(HttpContext ctx)
+        {
+            var variable = Environment.GetEnvironmentVariable("ASPNETCORE_INPROCESS_TESTING_VALUE");
+            await ctx.Response.WriteAsync(variable);
+        }
+
+        private async Task CheckEnvironmentLongValueVariable(HttpContext ctx)
+        {
+            var variable = Environment.GetEnvironmentVariable("ASPNETCORE_INPROCESS_TESTING_LONG_VALUE");
+            await ctx.Response.WriteAsync(variable);
+        }
+
+        private async Task CheckAppendedEnvironmentVariable(HttpContext ctx)
+        {
+            var variable = Environment.GetEnvironmentVariable("ProgramFiles");
+            await ctx.Response.WriteAsync(variable);
+        }
+
+        private async Task CheckRemoveAuthEnvironmentVariable(HttpContext ctx)
+        {
+            var variable = Environment.GetEnvironmentVariable("ASPNETCORE_IIS_HTTPAUTH");
+            await ctx.Response.WriteAsync(variable);
+        }
+        private async Task ReadAndWriteSynchronously(HttpContext ctx)
+        {
+            var t2 = Task.Run(() => WriteManyTimesToResponseBody(ctx));
+            var t1 = Task.Run(() => ReadRequestBody(ctx));
+            await Task.WhenAll(t1, t2);
+        }
+
+        private async Task ReadRequestBody(HttpContext ctx)
+        {
+            var readBuffer = new byte[1];
+            var result = await ctx.Request.Body.ReadAsync(readBuffer, 0, 1);
+            while (result != 0)
+            {
+                result = await ctx.Request.Body.ReadAsync(readBuffer, 0, 1);
+            }
+        }
+
+        private async Task WriteManyTimesToResponseBody(HttpContext ctx)
+        {
+            for (var i = 0; i < 10000; i++)
+            {
+                await ctx.Response.WriteAsync("hello world");
+            }
+        }
+
+        private async Task ReadAndWriteEcho(HttpContext ctx)
+        {
+            var readBuffer = new byte[4096];
+            var result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length);
+            while (result != 0)
+            {
+                await ctx.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result));
+                result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length);
+            }
+        }
+        private async Task ReadAndFlushEcho(HttpContext ctx)
+        {
+            var readBuffer = new byte[4096];
+            var result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length);
+            while (result != 0)
+            {
+                await ctx.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result));
+                await ctx.Response.Body.FlushAsync();
+                result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length);
+            }
+        }
+
+        private async Task ReadAndWriteEchoLines(HttpContext ctx)
+        {
+            if (ctx.Request.Headers.TryGetValue("Response-Content-Type", out var contentType))
+            {
+                ctx.Response.ContentType = contentType;
+            }
+
+            //Send headers
+            await ctx.Response.Body.FlushAsync();
+
+            var reader = new StreamReader(ctx.Request.Body);
+            while (!reader.EndOfStream)
+            {
+                var line = await reader.ReadLineAsync();
+                if (line == "")
+                {
+                    return;
+                }
+                await ctx.Response.WriteAsync(line + Environment.NewLine);
+                await ctx.Response.Body.FlushAsync();
+            }
+        }
+
+        private async Task ReadAndWriteEchoLinesNoBuffering(HttpContext ctx)
+        {
+            var feature = ctx.Features.Get<IHttpBufferingFeature>();
+            feature.DisableResponseBuffering();
+
+            if (ctx.Request.Headers.TryGetValue("Response-Content-Type", out var contentType))
+            {
+                ctx.Response.ContentType = contentType;
+            }
+
+            //Send headers
+            await ctx.Response.Body.FlushAsync();
+
+            var reader = new StreamReader(ctx.Request.Body);
+            while (!reader.EndOfStream)
+            {
+                var line = await reader.ReadLineAsync();
+                if (line == "")
+                {
+                    return;
+                }
+                await ctx.Response.WriteAsync(line + Environment.NewLine);
+            }
+        }
+
+        private async Task ReadPartialBody(HttpContext ctx)
+        {
+            var data = new byte[5];
+            var count = 0;
+            do
+            {
+                count += await ctx.Request.Body.ReadAsync(data, count, data.Length - count);
+            } while (count != data.Length);
+            await ctx.Response.Body.WriteAsync(data, 0, data.Length);
+        }
+
+        private async Task SetHeaderFromBody(HttpContext ctx)
+        {
+            using (var reader = new StreamReader(ctx.Request.Body))
+            {
+                var value = await reader.ReadToEndAsync();
+                ctx.Response.Headers["BodyAsString"] = value;
+                await ctx.Response.WriteAsync(value);
+            }
+        }
+
+        private async Task ReadAndWriteEchoTwice(HttpContext ctx)
+        {
+            var readBuffer = new byte[4096];
+            var result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length);
+            while (result != 0)
+            {
+                await ctx.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result));
+                await ctx.Response.Body.FlushAsync();
+                await ctx.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result));
+                await ctx.Response.Body.FlushAsync();
+                result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length);
+            }
+        }
+
+        private async Task ReadAndWriteSlowConnection(HttpContext ctx)
+        {
+            var t2 = Task.Run(() => WriteResponseBodyAFewTimes(ctx));
+            var t1 = Task.Run(() => ReadRequestBody(ctx));
+            await Task.WhenAll(t1, t2);
+        }
+
+        private async Task WriteResponseBodyAFewTimes(HttpContext ctx)
+        {
+            for (var i = 0; i < 100; i++)
+            {
+                await ctx.Response.WriteAsync("hello world");
+            }
+        }
+
+        private async Task ReadAndWriteCopyToAsync(HttpContext ctx)
+        {
+            await ctx.Request.Body.CopyToAsync(ctx.Response.Body);
+        }
+
+        private async Task UpgradeFeatureDetection(HttpContext ctx)
+        {
+            if (ctx.Features.Get<IHttpUpgradeFeature>() != null)
+            {
+                await ctx.Response.WriteAsync("Enabled");
+            }
+            else
+            {
+                await ctx.Response.WriteAsync("Disabled");
+            }
+        }
+
+        private async Task TestReadOffsetWorks(HttpContext ctx)
+        {
+            var buffer = new byte[11];
+            ctx.Request.Body.Read(buffer, 0, 6);
+            ctx.Request.Body.Read(buffer, 6, 5);
+
+            await ctx.Response.WriteAsync(Encoding.UTF8.GetString(buffer));
+        }
+
+        private async Task TestInvalidReadOperations(HttpContext ctx)
+        {
+            var success = false;
+            if (ctx.Request.Path.StartsWithSegments("/NullBuffer"))
+            {
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(null, 0, 0);
+                }
+                catch (Exception)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidOffsetSmall"))
+            {
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(new byte[1], -1, 0);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidOffsetLarge"))
+            {
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(new byte[1], 2, 0);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidCountSmall"))
+            {
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(new byte[1], 0, -1);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidCountLarge"))
+            {
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(new byte[1], 0, -1);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidCountWithOffset"))
+            {
+                try
+                {
+                    await ctx.Request.Body.ReadAsync(new byte[3], 1, 3);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+
+
+            await ctx.Response.WriteAsync(success ? "Success" : "Failure");
+        }
+
+        private async Task TestValidReadOperations(HttpContext ctx)
+        {
+            var count = -1;
+
+            if (ctx.Request.Path.StartsWithSegments("/NullBuffer"))
+            {
+                count = await ctx.Request.Body.ReadAsync(null, 0, 0);
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/NullBufferPost"))
+            {
+                count = await ctx.Request.Body.ReadAsync(null, 0, 0);
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidCountZeroRead"))
+            {
+                count = await ctx.Request.Body.ReadAsync(new byte[1], 0, 0);
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidCountZeroReadPost"))
+            {
+                count = await ctx.Request.Body.ReadAsync(new byte[1], 0, 0);
+            }
+
+            await ctx.Response.WriteAsync(count == 0 ? "Success" : "Failure");
+        }
+
+        private async Task TestInvalidWriteOperations(HttpContext ctx)
+        {
+            var success = false;
+
+            if (ctx.Request.Path.StartsWithSegments("/InvalidOffsetSmall"))
+            {
+                try
+                {
+                    await ctx.Response.Body.WriteAsync(new byte[1], -1, 0);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidOffsetLarge"))
+            {
+                try
+                {
+                    await ctx.Response.Body.WriteAsync(new byte[1], 2, 0);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidCountSmall"))
+            {
+                try
+                {
+                    await ctx.Response.Body.WriteAsync(new byte[1], 0, -1);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidCountLarge"))
+            {
+                try
+                {
+                    await ctx.Response.Body.WriteAsync(new byte[1], 0, -1);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/InvalidCountWithOffset"))
+            {
+                try
+                {
+                    await ctx.Response.Body.WriteAsync(new byte[3], 1, 3);
+                }
+                catch (ArgumentOutOfRangeException)
+                {
+                    success = true;
+                }
+            }
+
+            await ctx.Response.WriteAsync(success ? "Success" : "Failure");
+        }
+
+        private async Task TestValidWriteOperations(HttpContext ctx)
+        {
+            if (ctx.Request.Path.StartsWithSegments("/NullBuffer"))
+            {
+                await ctx.Response.Body.WriteAsync(null, 0, 0);
+            }
+            else if (ctx.Request.Path.StartsWithSegments("/NullBufferPost"))
+            {
+                await ctx.Response.Body.WriteAsync(null, 0, 0);
+            }
+
+            await ctx.Response.WriteAsync("Success");
+        }
+
+        private async Task LargeResponseFile(HttpContext ctx)
+        {
+            var tempFile = Path.GetTempFileName();
+            var fileContent = new string('a', 200000);
+            var fileStream = File.OpenWrite(tempFile);
+
+            for (var i = 0; i < 1000; i++)
+            {
+                await fileStream.WriteAsync(Encoding.UTF8.GetBytes(fileContent), 0, fileContent.Length);
+            }
+            fileStream.Close();
+
+            await ctx.Response.SendFileAsync(tempFile, 0, null);
+
+            // Try to delete the file from the temp directory. If it fails, don't report an error
+            // to the application. File should eventually be cleaned up from the temp directory
+            // by OS.
+            try
+            {
+                File.Delete(tempFile);
+            }
+            catch (Exception)
+            {
+            }
+        }
+
+        private async Task BasePath(HttpContext ctx)
+        {
+            await ctx.Response.WriteAsync(AppDomain.CurrentDomain.BaseDirectory);
+        }
+
+        private async Task Shutdown(HttpContext ctx)
+        {
+            await ctx.Response.WriteAsync("Shutting down");
+            ctx.RequestServices.GetService<IApplicationLifetime>().StopApplication();
+        }
+
+        private async Task GetServerVariableStress(HttpContext ctx)
+        {
+            // This test simulates the scenario where native Flush call is being
+            // executed on background thread while request thread calls GetServerVariable
+            // concurrent native calls may cause native object corruption
+
+            var serverVariableFeature = ctx.Features.Get<IServerVariablesFeature>();
+            await ctx.Response.WriteAsync("Response Begin");
+            for (int i = 0; i < 1000; i++)
+            {
+                await ctx.Response.WriteAsync(serverVariableFeature["REMOTE_PORT"]);
+                await ctx.Response.Body.FlushAsync();
+            }
+            await ctx.Response.WriteAsync("Response End");
+        }
+
+        private async Task CommandLineArgs(HttpContext ctx)
+        {
+            await ctx.Response.WriteAsync(string.Join("|", Environment.GetCommandLineArgs().Skip(1)));
+        }
+
+        public Task HttpsHelloWorld(HttpContext ctx) =>
+           ctx.Response.WriteAsync("Scheme:" + ctx.Request.Scheme + "; Original:" + ctx.Request.Headers["x-original-proto"]);
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/web.config b/src/IISIntegration/test/WebSites/InProcessWebSite/web.config
new file mode 100644
index 0000000000000000000000000000000000000000..2a9bd223c31b4ada3f770bcf831ac1e2a8505e86
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/InProcessWebSite/web.config
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <system.webServer>
+    <handlers>
+      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
+    </handlers>
+    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" hostingModel="inprocess">
+      <environmentVariables>
+        <environmentVariable name="ASPNETCORE_INPROCESS_TESTING_VALUE" value="foobar" />
+        <environmentVariable name="ASPNETCORE_INPROCESS_TESTING_LONG_VALUE" value="AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" />
+        <environmentVariable name="ProgramFiles" value="foobarbaz" />
+        <environmentVariable name="ASPNETCORE_IIS_HTTPAUTH" value="shouldberemoved" />
+      </environmentVariables>
+    </aspNetCore>
+  </system.webServer>
+</configuration>
diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/wwwroot/static.txt b/src/IISIntegration/test/WebSites/InProcessWebSite/wwwroot/static.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..14beb7394ee8bab464dbd0426042da58f1b4fc49
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj
@@ -0,0 +1,31 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <Import Project="..\..\..\build\testsite.props" />
+
+  <PropertyGroup>
+    <TargetFrameworks>$(StandardTestTfms)</TargetFrameworks>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Server.IISIntegration\Microsoft.AspNetCore.Server.IISIntegration.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="..\shared\**\*.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Include="wwwroot\**" CopyToOutputDirectory="Always" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="$(MicrosoftAspNetCoreWebUtilitiesPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsConfigurationJsonPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" />
+    <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs
new file mode 100644
index 0000000000000000000000000000000000000000..90895237d243c5e7855b3c39f0b07516e0787f8c
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs
@@ -0,0 +1,45 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using System.Linq;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Logging;
+
+namespace TestSite
+{
+    public static class Program
+    {
+        public static int Main(string[] args)
+        {
+            var mode = args.FirstOrDefault();
+            switch (mode)
+            {
+                case "CreateFile":
+                    File.WriteAllText(args[1], "");
+                    return StartServer();
+            }
+
+            return StartServer();
+        }
+
+        private static int StartServer()
+        {
+            var host = new WebHostBuilder()
+                .ConfigureLogging(
+                    (_, factory) => {
+                        factory.AddConsole();
+                        factory.AddFilter("Console", level => level >= LogLevel.Information);
+                    })
+                .UseContentRoot(Directory.GetCurrentDirectory())
+                .UseIISIntegration()
+                .UseStartup<Startup>()
+                .UseKestrel()
+                .Build();
+
+            host.Run();
+            return 0;
+        }
+    }
+}
+
diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json
new file mode 100644
index 0000000000000000000000000000000000000000..246b7a0b47d4fd6d27518dc694f3490ac52f2a56
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json
@@ -0,0 +1,42 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": true,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:5762/",
+      "sslPort": 0
+    }
+  },
+  "profiles": {
+    "ANCM IIS Express": {
+      "commandName": "Executable",
+      "executablePath": "$(IISExpressPath)",
+      "commandLineArgs": "$(IISExpressArguments)",
+      "environmentVariables": {
+        "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)",
+        "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)",
+        "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)",
+        "ANCM_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)",
+        "LAUNCHER_ARGS": "$(TargetPath)",
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "LAUNCHER_PATH": "$(DotNetPath)",
+        "ASPNETCORE_MODULE_DEBUG": "console"
+      }
+    },
+    "ANCM IIS": {
+      "commandName": "Executable",
+      "executablePath": "$(IISPath)",
+      "commandLineArgs": "$(IISArguments)",
+      "environmentVariables": {
+        "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)",
+        "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)",
+        "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)",
+        "ASPNETCORE_MODULE_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)",
+        "LAUNCHER_ARGS": "$(TargetPath)",
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "LAUNCHER_PATH": "$(DotNetPath)",
+        "ASPNETCORE_MODULE_DEBUG": "console"
+      }
+    }
+  }
+}
diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs
new file mode 100644
index 0000000000000000000000000000000000000000..de54a85a8a3975c6c7af98b748f8b8ed15b7a0bf
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs
@@ -0,0 +1,105 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Security.Principal;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting.Server.Features;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.IISIntegration.FunctionalTests;
+using Microsoft.AspNetCore.Server.IISIntegration;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit;
+
+namespace TestSite
+{
+    public partial class Startup
+    {
+        private IServerAddressesFeature _serverAddresses;
+
+        public void Configure(IApplicationBuilder app)
+        {
+            TestStartup.Register(app, this);
+
+            _serverAddresses = app.ServerFeatures.Get<IServerAddressesFeature>();
+        }
+
+        public Task Path(HttpContext ctx) => ctx.Response.WriteAsync(ctx.Request.Path.Value);
+
+        public Task Query(HttpContext ctx) => ctx.Response.WriteAsync(ctx.Request.QueryString.Value);
+
+        public Task BodyLimit(HttpContext ctx) => ctx.Response.WriteAsync(ctx.Features.Get<IHttpMaxRequestBodySizeFeature>()?.MaxRequestBodySize?.ToString() ?? "null");
+
+
+        public Task HelloWorld(HttpContext ctx) => ctx.Response.WriteAsync("Hello World");
+
+        public Task HttpsHelloWorld(HttpContext ctx) =>
+            ctx.Response.WriteAsync("Scheme:" + ctx.Request.Scheme + "; Original:" + ctx.Request.Headers["x-original-proto"]);
+
+        public Task Anonymous(HttpContext context) => context.Response.WriteAsync("Anonymous?" + !context.User.Identity.IsAuthenticated);
+
+        public Task Restricted(HttpContext context)
+        {
+            if (context.User.Identity.IsAuthenticated)
+            {
+                Assert.IsType<WindowsPrincipal>(context.User);
+                return context.Response.WriteAsync(context.User.Identity.AuthenticationType);
+            }
+            else
+            {
+                return context.ChallengeAsync(IISDefaults.AuthenticationScheme);
+            }
+        }
+
+        public Task Forbidden(HttpContext context) => context.ForbidAsync(IISDefaults.AuthenticationScheme);
+
+        public Task RestrictedNTLM(HttpContext context)
+        {
+            if (string.Equals("NTLM", context.User.Identity.AuthenticationType, StringComparison.Ordinal))
+            {
+                return context.Response.WriteAsync("NTLM");
+            }
+            else
+            {
+                return context.ChallengeAsync(IISDefaults.AuthenticationScheme);
+            }
+        }
+
+        public Task UpgradeFeatureDetection(HttpContext context) =>
+            context.Response.WriteAsync(context.Features.Get<IHttpUpgradeFeature>() != null? "Enabled": "Disabled");
+
+        public Task CheckRequestHandlerVersion(HttpContext context)
+        {
+            // We need to check if the aspnetcorev2_outofprocess dll is loaded by iisexpress.exe
+            // As they aren't in the same process, we will try to delete the file and expect a file
+            // in use error
+            try
+            {
+                File.Delete(context.Request.Headers["ANCMRHPath"]);
+            }
+            catch(UnauthorizedAccessException)
+            {
+                // TODO calling delete on the file will succeed when running with IIS
+                return context.Response.WriteAsync("Hello World");
+            }
+
+            return context.Response.WriteAsync(context.Request.Headers["ANCMRHPath"]);
+        }
+
+        private async Task ProcessId(HttpContext context)
+        {
+            await context.Response.WriteAsync(Process.GetCurrentProcess().Id.ToString());
+        }
+
+        private async Task ServerAddresses(HttpContext context)
+        {
+            await context.Response.WriteAsync(string.Join(",", _serverAddresses.Addresses));
+        }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs b/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e8e5392c2c7269b067b512e442dc7ca8ea5adda2
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs
@@ -0,0 +1,26 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Logging;
+
+namespace ANCMStressTestApp
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            var host = new WebHostBuilder()
+                .ConfigureLogging((_, factory) =>
+                {
+                    factory.AddConsole();
+                })
+                .UseKestrel()
+                .UseIISIntegration()
+                .UseStartup<Startup>()
+                .Build();
+
+            host.Run();
+        }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json
new file mode 100644
index 0000000000000000000000000000000000000000..246b7a0b47d4fd6d27518dc694f3490ac52f2a56
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json
@@ -0,0 +1,42 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": true,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:5762/",
+      "sslPort": 0
+    }
+  },
+  "profiles": {
+    "ANCM IIS Express": {
+      "commandName": "Executable",
+      "executablePath": "$(IISExpressPath)",
+      "commandLineArgs": "$(IISExpressArguments)",
+      "environmentVariables": {
+        "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)",
+        "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)",
+        "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)",
+        "ANCM_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)",
+        "LAUNCHER_ARGS": "$(TargetPath)",
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "LAUNCHER_PATH": "$(DotNetPath)",
+        "ASPNETCORE_MODULE_DEBUG": "console"
+      }
+    },
+    "ANCM IIS": {
+      "commandName": "Executable",
+      "executablePath": "$(IISPath)",
+      "commandLineArgs": "$(IISArguments)",
+      "environmentVariables": {
+        "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)",
+        "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)",
+        "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)",
+        "ASPNETCORE_MODULE_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)",
+        "LAUNCHER_ARGS": "$(TargetPath)",
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "LAUNCHER_PATH": "$(DotNetPath)",
+        "ASPNETCORE_MODULE_DEBUG": "console"
+      }
+    }
+  }
+}
diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs b/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs
new file mode 100644
index 0000000000000000000000000000000000000000..68f6eb1f770603de0a532811a5e1d2f0b8be9828
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs
@@ -0,0 +1,232 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Threading;
+using System.Text;
+using System.Net.WebSockets;
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.Net.Http.Headers;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Primitives;
+
+namespace ANCMStressTestApp
+{
+    public class Startup
+    {
+        // This method gets called by the runtime. Use this method to add services to the container.
+        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
+        public void ConfigureServices(IServiceCollection services)
+        {
+        }
+
+        public void Configure(IApplicationBuilder app)
+        {
+            app.Map("/HelloWorld", HelloWorld);
+            app.Map("/ConnectionClose", ConnectionClose);
+            app.Map("/EchoPostData", EchoPostData);
+            app.Map("/LargeResponseBody", LargeResponseBody);
+            app.Map("/ResponseHeaders", ResponseHeaders);
+            app.Map("/EnvironmentVariables", EnvironmentVariables);
+            app.Map("/RequestInformation", RequestInformation);
+            app.Map("/WebSocket", WebSocket);
+
+            app.Run(async context =>
+            {
+                await context.Response.WriteAsync("Default Page");
+            });
+        }
+
+        private void HelloWorld(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                await context.Response.WriteAsync("Hello World");
+            });
+        }
+
+        private void ConnectionClose(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                context.Response.Headers[HeaderNames.Connection] = "close";
+                await context.Response.WriteAsync("Connnection Close");
+                await context.Response.Body.FlushAsync();
+            });
+        }
+
+        private void EchoPostData(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                string responseBody = string.Empty;
+
+                if (string.Equals(context.Request.Method, "POST", StringComparison.OrdinalIgnoreCase))
+                {
+                    using (StreamReader reader = new StreamReader(context.Request.Body, Encoding.UTF8))
+                    {
+                        responseBody = await reader.ReadToEndAsync();
+                    }
+                }
+                else
+                {
+                    responseBody = "NoAction";
+                }
+
+                await context.Response.WriteAsync(responseBody);
+            });
+        }
+
+        private void LargeResponseBody(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                if (int.TryParse(context.Request.Query["length"], out var length))
+                {
+                    await context.Response.WriteAsync(new string('a', length));
+                }
+            });
+        }
+
+        private void ResponseHeaders(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                context.Response.Headers["UnknownHeader"] = "test123=foo";
+                context.Response.ContentType = "text/plain";
+                context.Response.Headers["MultiHeader"] = new StringValues(new string[] { "1", "2" });
+                await context.Response.WriteAsync("Request Complete");
+            });
+        }
+
+        private void EnvironmentVariables(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                context.Response.ContentType = "text/plain";
+                await context.Response.WriteAsync("Environment Variables:" + Environment.NewLine);
+                var vars = Environment.GetEnvironmentVariables();
+                foreach (var key in vars.Keys.Cast<string>().OrderBy(key => key, StringComparer.OrdinalIgnoreCase))
+                {
+                    var value = vars[key];
+                    await context.Response.WriteAsync(key + ": " + value + Environment.NewLine);
+                }
+                await context.Response.WriteAsync(Environment.NewLine);
+            });
+        }
+
+        private void RequestInformation(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                context.Response.ContentType = "text/plain";
+
+                await context.Response.WriteAsync("Address:" + Environment.NewLine);
+                await context.Response.WriteAsync("Scheme: " + context.Request.Scheme + Environment.NewLine);
+                await context.Response.WriteAsync("Host: " + context.Request.Headers["Host"] + Environment.NewLine);
+                await context.Response.WriteAsync("PathBase: " + context.Request.PathBase.Value + Environment.NewLine);
+                await context.Response.WriteAsync("Path: " + context.Request.Path.Value + Environment.NewLine);
+                await context.Response.WriteAsync("Query: " + context.Request.QueryString.Value + Environment.NewLine);
+                await context.Response.WriteAsync(Environment.NewLine);
+
+                await context.Response.WriteAsync("Connection:" + Environment.NewLine);
+                await context.Response.WriteAsync("RemoteIp: " + context.Connection.RemoteIpAddress + Environment.NewLine);
+                await context.Response.WriteAsync("RemotePort: " + context.Connection.RemotePort + Environment.NewLine);
+                await context.Response.WriteAsync("LocalIp: " + context.Connection.LocalIpAddress + Environment.NewLine);
+                await context.Response.WriteAsync("LocalPort: " + context.Connection.LocalPort + Environment.NewLine);
+                await context.Response.WriteAsync(Environment.NewLine);
+
+                await context.Response.WriteAsync("Headers:" + Environment.NewLine);
+                foreach (var header in context.Request.Headers)
+                {
+                    await context.Response.WriteAsync(header.Key + ": " + header.Value + Environment.NewLine);
+                }
+                await context.Response.WriteAsync(Environment.NewLine);
+            });
+        }
+
+        private void WebSocket(IApplicationBuilder app)
+        {
+            app.Run(async context =>
+            {
+                var upgradeFeature = context.Features.Get<IHttpUpgradeFeature>();
+
+                // Generate WebSocket response headers
+                string key = context.Request.Headers[Constants.Headers.SecWebSocketKey].ToString();
+                var responseHeaders = HandshakeHelpers.GenerateResponseHeaders(key);
+                foreach (var headerPair in responseHeaders)
+                {
+                    context.Response.Headers[headerPair.Key] = headerPair.Value;
+                }
+
+                // Upgrade the connection
+                Stream opaqueTransport = await upgradeFeature.UpgradeAsync();
+
+                // Get the WebSocket object
+                var ws = WebSocketProtocol.CreateFromStream(opaqueTransport, isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2));
+
+                var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
+
+                await Echo(ws, appLifetime.ApplicationStopping);
+            });
+        }
+
+        private async Task Echo(WebSocket webSocket, CancellationToken token)
+        {
+            try
+            {
+                var buffer = new byte[1024 * 4];
+                var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
+                bool closeFromServer = false;
+                string closeFromServerCmd = "CloseFromServer";
+                int closeFromServerLength = closeFromServerCmd.Length;
+
+                while (!result.CloseStatus.HasValue && !token.IsCancellationRequested && !closeFromServer)
+                {
+                    if (result.Count == closeFromServerLength &&
+                        Encoding.ASCII.GetString(buffer).Substring(0, result.Count) == closeFromServerCmd)
+                    {
+                        // The client sent "CloseFromServer" text message to request the server to close (a test scenario).
+                        closeFromServer = true;
+                    }
+                    else
+                    {
+                        await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, token);
+                        result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
+                    }
+                }
+
+                if (result.CloseStatus.HasValue)
+                {
+                    // Client-initiated close handshake
+                    await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
+                }
+                else
+                {
+                    // Server-initiated close handshake due to either of the two conditions:
+                    // (1) The applicaton host is performing a graceful shutdown.
+                    // (2) The client sent "CloseFromServer" text message to request the server to close (a test scenario).
+                    await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeFromServerCmd, CancellationToken.None);
+
+                    // The server has sent the Close frame.
+                    // Stop sending but keep receiving until we get the Close frame from the client.
+                    while (!result.CloseStatus.HasValue)
+                    {
+                        result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine("{0} Exception caught!", e);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj b/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..25ae0322215f672533e780f5d6d1e87e37d9d7d3
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj
@@ -0,0 +1,25 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <Import Project="..\..\..\build\testsite.props" />
+
+  <PropertyGroup>
+    <TargetFrameworks>$(StandardTestTfms)</TargetFrameworks>
+    <InProcessTestSite>true</InProcessTestSite>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Server.IISIntegration\Microsoft.AspNetCore.Server.IISIntegration.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="..\shared\**\*.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" />
+    <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs b/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b5d7f0305f07e3302d2033c57eccf657ffe1f481
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs
@@ -0,0 +1,117 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace TestSite
+{
+    public partial class Startup
+    {
+        public void ConfigureServices(IServiceCollection serviceCollection)
+        {
+            serviceCollection.AddResponseCompression();
+        }
+
+        private async Task HostingEnvironment(HttpContext ctx)
+        {
+            var hostingEnv = ctx.RequestServices.GetService<IHostingEnvironment>();
+
+            await ctx.Response.WriteAsync("ContentRootPath " + hostingEnv.ContentRootPath + Environment.NewLine);
+            await ctx.Response.WriteAsync("WebRootPath " + hostingEnv.WebRootPath + Environment.NewLine);
+            await ctx.Response.WriteAsync("CurrentDirectory " + Environment.CurrentDirectory);
+        }
+
+        private async Task ConsoleWrite(HttpContext ctx)
+        {
+            Console.WriteLine("TEST MESSAGE");
+
+            await ctx.Response.WriteAsync("Hello World");
+        }
+
+        private async Task ConsoleErrorWrite(HttpContext ctx)
+        {
+            Console.Error.WriteLine("TEST MESSAGE");
+
+            await ctx.Response.WriteAsync("Hello World");
+        }
+
+        public async Task Auth(HttpContext ctx)
+        {
+            var authProvider = ctx.RequestServices.GetService<IAuthenticationSchemeProvider>();
+            var authScheme = (await authProvider.GetAllSchemesAsync()).SingleOrDefault();
+
+            await ctx.Response.WriteAsync(authScheme?.Name ?? "null");
+            if (ctx.User.Identity.Name != null)
+            {
+                await ctx.Response.WriteAsync(":" + ctx.User.Identity.Name);
+            }
+        }
+
+        public async Task GetClientCert(HttpContext context)
+        {
+            var clientCert = context.Connection.ClientCertificate;
+            await context.Response.WriteAsync(clientCert != null ? $"Enabled;{clientCert.GetCertHashString()}" : "Disabled");
+        }
+
+        private static int _waitingRequestCount;
+
+        public Task WaitForAbort(HttpContext context)
+        {
+            Interlocked.Increment(ref _waitingRequestCount);
+            try
+            {
+                context.RequestAborted.WaitHandle.WaitOne();
+                return Task.CompletedTask;
+            }
+            finally
+            {
+                Interlocked.Decrement(ref _waitingRequestCount);
+            }
+        }
+
+        public Task Abort(HttpContext context)
+        {
+            context.Abort();
+            return Task.CompletedTask;
+        }
+
+        public async Task WaitingRequestCount(HttpContext context)
+        {
+            await context.Response.WriteAsync(_waitingRequestCount.ToString());
+        }
+
+        public Task CreateFile(HttpContext context)
+        {
+            var hostingEnv = context.RequestServices.GetService<IHostingEnvironment>();
+            File.WriteAllText(System.IO.Path.Combine(hostingEnv.ContentRootPath, "Started.txt"), "");
+            return Task.CompletedTask;
+        }
+
+        public Task OverrideServer(HttpContext context)
+        {
+            context.Response.Headers["Server"] = "MyServer/7.8";
+            return Task.CompletedTask;
+        }
+
+        public void CompressedData(IApplicationBuilder builder)
+        {
+            builder.UseResponseCompression();
+            // write random bytes to check that compressed data is passed through
+            builder.Run(
+                async context =>
+                {
+                    context.Response.ContentType = "text/html";
+                    await context.Response.Body.WriteAsync(new byte[100], 0, 100);
+                });
+        }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs b/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs
new file mode 100644
index 0000000000000000000000000000000000000000..95b53003cc9f4ceb5940ecd036662083713999cf
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs
@@ -0,0 +1,17 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
+{
+    public static class Constants
+    {
+        public static class Headers
+        {
+            public const string Upgrade = "Upgrade";
+            public const string UpgradeWebSocket = "websocket";
+            public const string Connection = "Connection";
+            public const string SecWebSocketKey = "Sec-WebSocket-Key";
+            public const string SecWebSocketAccept = "Sec-WebSocket-Accept";
+        }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs b/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b079ea3f857888bbdc4e28a8c76c89f8ebb1f290
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs
@@ -0,0 +1,41 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Security.Cryptography;
+using System.Text;
+
+namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
+{
+    internal static class HandshakeHelpers
+    {
+        public static IEnumerable<KeyValuePair<string, string>> GenerateResponseHeaders(string key)
+        {
+            yield return new KeyValuePair<string, string>(Constants.Headers.Connection, Constants.Headers.Upgrade);
+            yield return new KeyValuePair<string, string>(Constants.Headers.Upgrade, Constants.Headers.UpgradeWebSocket);
+            yield return new KeyValuePair<string, string>(Constants.Headers.SecWebSocketAccept, CreateResponseKey(key));
+        }
+
+        public static string CreateResponseKey(string requestKey)
+        {
+            // "The value of this header field is constructed by concatenating /key/, defined above in step 4
+            // in Section 4.2.2, with the string "258EAFA5- E914-47DA-95CA-C5AB0DC85B11", taking the SHA-1 hash of
+            // this concatenated value to obtain a 20-byte value and base64-encoding"
+            // https://tools.ietf.org/html/rfc6455#section-4.2.2
+
+            if (requestKey == null)
+            {
+                throw new ArgumentNullException(nameof(requestKey));
+            }
+
+            using (var algorithm = SHA1.Create())
+            {
+                string merged = requestKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+                byte[] mergedBytes = Encoding.UTF8.GetBytes(merged);
+                byte[] hashedBytes = algorithm.ComputeHash(mergedBytes);
+                return Convert.ToBase64String(hashedBytes);
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs b/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b1604e367afb2df3371f60a00adb8c3c775a2827
--- /dev/null
+++ b/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Reflection;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.IISIntegration.FunctionalTests
+{
+    public static class TestStartup
+    {
+        public static void Register(IApplicationBuilder app, object startup)
+        {
+            var type = startup.GetType();
+            foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
+            {
+                var parameters = method.GetParameters();
+                if (method.Name != "Configure" &&
+                    parameters.Length == 1)
+                {
+                    Action<IApplicationBuilder> appfunc = null;
+                    if (parameters[0].ParameterType == typeof(IApplicationBuilder))
+                    {
+                        appfunc = innerAppBuilder => method.Invoke(startup, new[] { innerAppBuilder });
+                    }
+                    else if (parameters[0].ParameterType == typeof(HttpContext))
+                    {
+                        appfunc = innerAppBuilder => innerAppBuilder.Run(ctx => (Task)method.Invoke(startup, new[] { ctx }));
+                    }
+
+                    if (appfunc != null)
+                    {
+                        app.Map("/" + method.Name, appfunc);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/src/IISIntegration/test/gtest/gtest.vcxproj b/src/IISIntegration/test/gtest/gtest.vcxproj
new file mode 100644
index 0000000000000000000000000000000000000000..924f26337ddf1a946f9c1a6e3114846ae1a5fbf9
--- /dev/null
+++ b/src/IISIntegration/test/gtest/gtest.vcxproj
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="googletest\googlemock\src\gmock-all.cc" />
+    <ClCompile Include="googletest\googletest\src\gtest-all.cc" />
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>15.0</VCProjectVersion>
+    <ProjectGuid>{CAC1267B-8778-4257-AAC6-CAF481723B01}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>gtest</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+    <TargetName>gtestd</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <TargetName>gtest</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+    <TargetName>gtestd</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <TargetName>gtest</TargetName>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>
+    <SourcePath>$(VC_SourcePath);</SourcePath>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>
+    <SourcePath>$(VC_SourcePath);</SourcePath>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>
+    <SourcePath>$(VC_SourcePath);</SourcePath>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>
+    <SourcePath>$(VC_SourcePath);</SourcePath>
+    <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/tools/GenerateNativeAssets.ps1 b/src/IISIntegration/tools/GenerateNativeAssets.ps1
similarity index 100%
rename from tools/GenerateNativeAssets.ps1
rename to src/IISIntegration/tools/GenerateNativeAssets.ps1
diff --git a/tools/SetupTestEnvironment.ps1 b/src/IISIntegration/tools/SetupTestEnvironment.ps1
similarity index 100%
rename from tools/SetupTestEnvironment.ps1
rename to src/IISIntegration/tools/SetupTestEnvironment.ps1
diff --git a/tools/UpdateIISExpressCertificate.ps1 b/src/IISIntegration/tools/UpdateIISExpressCertificate.ps1
similarity index 100%
rename from tools/UpdateIISExpressCertificate.ps1
rename to src/IISIntegration/tools/UpdateIISExpressCertificate.ps1
diff --git a/tools/certificate.ps1 b/src/IISIntegration/tools/certificate.ps1
similarity index 100%
rename from tools/certificate.ps1
rename to src/IISIntegration/tools/certificate.ps1
diff --git a/tools/httpsys.ps1 b/src/IISIntegration/tools/httpsys.ps1
similarity index 100%
rename from tools/httpsys.ps1
rename to src/IISIntegration/tools/httpsys.ps1
diff --git a/tools/installancm.ps1 b/src/IISIntegration/tools/installancm.ps1
similarity index 100%
rename from tools/installancm.ps1
rename to src/IISIntegration/tools/installancm.ps1
diff --git a/tools/update_schema.ps1 b/src/IISIntegration/tools/update_schema.ps1
similarity index 100%
rename from tools/update_schema.ps1
rename to src/IISIntegration/tools/update_schema.ps1
diff --git a/version.props b/src/IISIntegration/version.props
similarity index 100%
rename from version.props
rename to src/IISIntegration/version.props
diff --git a/test/gtest/googletest b/test/gtest/googletest
deleted file mode 160000
index 4e4df226fc197c0dda6e37f5c8c3845ca1e73a49..0000000000000000000000000000000000000000
--- a/test/gtest/googletest
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4e4df226fc197c0dda6e37f5c8c3845ca1e73a49