Merge pull request #930 from paulirwin/net8-tests

Upgrade tests and CLI to .NET 8, fix benchmark formatting issue
diff --git a/.build/azure-templates/install-dotnet-sdk.yml b/.build/azure-templates/install-dotnet-sdk.yml
index ec0e121..f499709 100644
--- a/.build/azure-templates/install-dotnet-sdk.yml
+++ b/.build/azure-templates/install-dotnet-sdk.yml
@@ -30,15 +30,17 @@
         }
     }
     EnsureNotNullOrEmpty('${{ parameters.sdkVersion }}', 'sdkVersion')
+    EnsureNotNullOrEmpty('${{ parameters.performMultiLevelLookup }}', 'performMultiLevelLookup')
   displayName: 'Validate Template Parameters'
 
 - bash: |
     echo "##vso[task.setvariable variable=DOTNET_NOLOGO;]1"
     echo "##vso[task.setvariable variable=DOTNET_CLI_TELEMETRY_OPTOUT;]1"
+  displayName: Disable Telemetry
 
 - task: UseDotNet@2
   displayName: 'Use .NET SDK ${{ parameters.sdkVersion }}'
   inputs:
     packageType: 'sdk'
     version: '${{ parameters.sdkVersion }}'
-    performMultiLevelLookup: '${{ parameters.performMultiLevelLookup }}'
\ No newline at end of file
+    performMultiLevelLookup: '${{ parameters.performMultiLevelLookup }}'
diff --git a/.build/azure-templates/publish-test-results-for-test-projects.yml b/.build/azure-templates/publish-test-results-for-test-projects.yml
index 11ebac7..a113396 100644
--- a/.build/azure-templates/publish-test-results-for-test-projects.yml
+++ b/.build/azure-templates/publish-test-results-for-test-projects.yml
@@ -5,9 +5,9 @@
 # to you 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,-with-title
 # software distributed under the License is distributed on an
 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -81,11 +81,11 @@
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-# Special case: Only supports net7.0 and net6.0
+# Special case: Only supports net8.0 and net6.0
 - template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Cli'
-    framework: 'net7.0' # Since condtions are not supported for templates, we check for the file existence within publish-test-results.yml
+    framework: 'net8.0' # Since condtions are not supported for templates, we check for the file existence within publish-test-results.yml
     vsTestPlatform: '${{ parameters.vsTestPlatform }}'
     osName: '${{ parameters.osName }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
@@ -102,12 +102,12 @@
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-# Special case: Only supports net7.0, net6.0 and net48
+# Special case: Only supports net8.0, net6.0 and net48
 
 - template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Analysis.OpenNLP'
-    framework: 'net7.0' # Since condtions are not supported for templates, we check for the file existence within publish-test-results.yml
+    framework: 'net8.0' # Since condtions are not supported for templates, we check for the file existence within publish-test-results.yml
     vsTestPlatform: '${{ parameters.vsTestPlatform }}'
     osName: '${{ parameters.osName }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
diff --git a/.build/azure-templates/publish-test-results.yml b/.build/azure-templates/publish-test-results.yml
index 28f4281..1a71be0 100644
--- a/.build/azure-templates/publish-test-results.yml
+++ b/.build/azure-templates/publish-test-results.yml
@@ -76,7 +76,11 @@
                     if ($inRunInfos -and !$crashed -and $reader.Name -eq 'Text') {
                         $innerXml = $reader.ReadInnerXml()
                         # Test for specific error messages - we may need to adjust this, as needed
-                        if ($innerXml -and ($innerXml.Contains('Test host process crashed') -or $innerXml.Contains('Could not load file or assembly'))) {
+                        if ($innerXml -and ($innerXml.Contains('Test host process crashed') `
+                            -or $innerXml.Contains('Could not load file or assembly') `
+                            -or $innerXml.Contains("Could not find `'dotnet.exe`' host") `
+                            -or $innerXml.Contains('No test is available') `
+                            -or $innerXml.Contains('exited with error'))) {
                             Write-Host "##vso[task.setvariable variable=HostCrashed;]true"
                             # Report all of the test projects that crashed
                             $crashedRuns = "$env:CRASHEDRUNS,$testProjectName".TrimStart(',')
@@ -104,4 +108,4 @@
     testResultsFormat: ${{ parameters.testResultsFormat }}
     testResultsFiles: '$(Build.ArtifactStagingDirectory)/${{ parameters.testResultsArtifactName }}/${{ parameters.osName }}/${{ parameters.framework }}/${{ parameters.vsTestPlatform }}/${{ parameters.testProjectName }}/${{ parameters.testResultsFileName }}'
     testRunTitle: '${{ parameters.testProjectName }} - ${{ parameters.framework }} - ${{ parameters.vsTestPlatform }} - ${{ parameters.osName }} | $(TestResults)'
-  condition: and(succeeded(), eq(variables['TestResultsFileExists'], 'true'))
\ No newline at end of file
+  condition: and(succeeded(), eq(variables['TestResultsFileExists'], 'true'))
diff --git a/.build/azure-templates/run-tests-on-os.yml b/.build/azure-templates/run-tests-on-os.yml
index 146a798..a6d771d 100644
--- a/.build/azure-templates/run-tests-on-os.yml
+++ b/.build/azure-templates/run-tests-on-os.yml
@@ -5,9 +5,9 @@
 # to you 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
@@ -34,7 +34,7 @@
   maximumAllowedFailures: 0
   where: '' # A test filter expression, as defined by dotnet test
   dotNetSdkVersion: '' # The .NET SDK version to install
-  
+
 steps:
 - checkout: none # self represents the repo where the initial Pipelines YAML file was found
 
@@ -83,34 +83,79 @@
     $performMulitLevelLookup = if ($IsWindows -and $testPlatform.Equals('x86')) { 'true' } else { 'false' }
     Write-Host "##vso[task.setvariable variable=PerformMultiLevelLookup;]$performMulitLevelLookup"
 
+#- template: 'show-all-environment-variables.yml' # Uncomment for debugging
+
 - template: 'install-dotnet-sdk.yml'
   parameters:
     sdkVersion: '${{ parameters.dotNetSdkVersion }}'
     performMultiLevelLookup: '${{ variables.PerformMultiLevelLookup }}'
 
-- task: UseDotNet@2
-  displayName: 'Use .NET Core sdk 3.1.412'
-  inputs:
-    packageType: 'sdk'
-    version: '3.1.412'
-    performMultiLevelLookup: '${{ variables.PerformMultiLevelLookup }}'
-  condition: and(succeeded(), contains('${{ parameters.framework }}', 'netcoreapp3.'))
+    # Hack: .NET 8 no longer installs the x86 bits and they must be installed separately. However, it is not
+    # trivial to get it into the path and to get it to pass the minimum SDK version check in runbuild.ps1.
+    # So, we install it afterward and set the environment variable so the above SDK can delegate to it.
+    # This code only works on Windows.
+- pwsh: |
+    $sdkVersion = '${{ parameters.dotNetSdkVersion }}'
+    $architecture = '${{ parameters.vsTestPlatform }}'
+    $installScriptPath = "${env:AGENT_TEMPDIRECTORY}/dotnet-install.ps1"
+    $installScriptUrl = "https://raw.githubusercontent.com/dotnet/install-scripts/main/src/dotnet-install.ps1"
+    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+    Invoke-WebRequest $installScriptUrl -OutFile $installScriptPath -TimeoutSec 60
+    $installPath = "${env:ProgramFiles(x86)}/dotnet"
+    & $installScriptPath -Version $sdkVersion -Architecture $architecture -InstallDir $installPath
+    Write-Host "##vso[task.setvariable variable=DOTNET_ROOT_X86;]$installPath"
+  displayName: 'Use .NET SDK ${{ parameters.dotNetSdkVersion }} (x86)'
+  condition: and(succeeded(), contains('${{ parameters.framework }}', 'net8.'), eq('${{ parameters.vsTestPlatform }}', 'x86'))
 
 - task: UseDotNet@2
-  displayName: 'Use .NET sdk 5.0.400'
+  displayName: 'Use .NET SDK 6.0.421'
   inputs:
     packageType: 'sdk'
-    version: '5.0.400'
+    version: '6.0.421'
+    performMultiLevelLookup: '${{ variables.PerformMultiLevelLookup }}'
+  condition: and(succeeded(), contains('${{ parameters.framework }}', 'net6.'))
+
+    # Hack: .NET 8 no longer installs the x86 bits and they must be installed separately. However, it is not
+    # trivial to get it into the path and to get it to pass the minimum SDK version check in runbuild.ps1.
+    # So, we install it afterward and set the environment variable so the above SDK can delegate to it.
+    # This code only works on Windows.
+- pwsh: |
+    $sdkVersion = '6.0.421'
+    $architecture = '${{ parameters.vsTestPlatform }}'
+    $installScriptPath = "${env:AGENT_TEMPDIRECTORY}/dotnet-install.ps1"
+    $installScriptUrl = "https://raw.githubusercontent.com/dotnet/install-scripts/main/src/dotnet-install.ps1"
+    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+    Invoke-WebRequest $installScriptUrl -OutFile $installScriptPath -TimeoutSec 60
+    $installPath = "${env:ProgramFiles(x86)}/dotnet"
+    & $installScriptPath -Version $sdkVersion -Architecture $architecture -InstallDir $installPath
+    Write-Host "##vso[task.setvariable variable=DOTNET_ROOT_X86;]$installPath"
+  displayName: 'Use .NET SDK 6.0.421 (x86)'
+  condition: and(succeeded(), contains('${{ parameters.framework }}', 'net6.'), eq('${{ parameters.vsTestPlatform }}', 'x86'))
+
+- task: UseDotNet@2
+  displayName: 'Use .NET SDK 5.0.408'
+  inputs:
+    packageType: 'sdk'
+    version: '5.0.408'
     performMultiLevelLookup: '${{ variables.PerformMultiLevelLookup }}'
   condition: and(succeeded(), contains('${{ parameters.framework }}', 'net5.'))
 
-- task: UseDotNet@2
-  displayName: 'Use .NET sdk 6.0.403'
-  inputs:
-    packageType: 'sdk'
-    version: '5.0.403'
-    performMultiLevelLookup: '${{ variables.PerformMultiLevelLookup }}'
-  condition: and(succeeded(), contains('${{ parameters.framework }}', 'net6.'))
+    # Hack: .NET 8 no longer installs the x86 bits and they must be installed separately. However, it is not
+    # trivial to get it into the path and to get it to pass the minimum SDK version check in runbuild.ps1.
+    # So, we install it afterward and set the environment variable so the above SDK can delegate to it.
+    # This code only works on Windows.
+- pwsh: |
+    $sdkVersion = '5.0.408'
+    $architecture = '${{ parameters.vsTestPlatform }}'
+    $installScriptPath = "${env:AGENT_TEMPDIRECTORY}/dotnet-install.ps1"
+    $installScriptUrl = "https://raw.githubusercontent.com/dotnet/install-scripts/main/src/dotnet-install.ps1"
+    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+    Invoke-WebRequest $installScriptUrl -OutFile $installScriptPath -TimeoutSec 60
+    $installPath = "${env:ProgramFiles(x86)}/dotnet"
+    & $installScriptPath -Version $sdkVersion -Architecture $architecture -InstallDir $installPath
+    Write-Host "##vso[task.setvariable variable=DOTNET_ROOT_X86;]$installPath"
+  displayName: 'Use .NET SDK 5.0.408 (x86)'
+  condition: and(succeeded(), contains('${{ parameters.framework }}', 'net5.'), eq('${{ parameters.vsTestPlatform }}', 'x86'))
 
 #- template: 'show-all-files.yml' # Uncomment for debugging
 - pwsh: |
@@ -126,7 +171,7 @@
     $tempDirectory = "$(Agent.TempDirectory)"
     $isNightly = if ($env:ISNIGHTLY -eq 'true') { 'true' } else { 'false' }
     $isWeekly = if ($env:ISWEEKLY -eq 'true') { 'true' } else { 'false' }
-    
+
     function IsSupportedFramework([string]$framework) {
         if ($IsWindows -eq $null) {
             $IsWindows = $env:OS.StartsWith('Win')
@@ -136,15 +181,15 @@
         }
         return $true
     }
-    
+
     function RunTests([string]$framework, [string]$fileRegexPattern) {
         if (!(IsSupportedFramework($framework))) { continue }
-    
+
         $testBinaries = Get-ChildItem -Path "$testBinaryRootDirectory" -File -Recurse | Where-Object {$_.FullName -match "$framework" -and $_.FullName -match "$fileRegexPattern" -and !$_.Name.EndsWith('.resources.dll') } | Sort-Object -Property FullName
         Write-Host $testBinaries
         foreach ($testBinary in $testBinaries) {
             $testName = [System.IO.Path]::GetFileNameWithoutExtension($testBinary.FullName)
-    
+
             if ($maximumParalellJobs -gt 1) {
                 # Pause if we have queued too many parallel jobs
                 $running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
@@ -155,7 +200,7 @@
                     $running | Wait-Job -Any | Out-Null
                 }
             }
-    
+
             $testResultDirectory = "$testResultsArtifactDirectory/$testOSName/$framework/$testPlatform/$testName"
             if (!(Test-Path "$testResultDirectory")) {
                 New-Item "$testResultDirectory" -ItemType Directory -Force
@@ -186,32 +231,32 @@
             if (![string]::IsNullOrEmpty($where)) {
                 $testExpression = "$testExpression --filter ""$where"""
             }
-    
+
             $testExpression = "$testExpression -- RunConfiguration.TargetPlatform=$testPlatform"
-    
+
             Write-Host "Testing '$($testBinary.FullName)' on framework '$framework' and outputting test results to '$testResultDirectory/$testResultsFileName'..."
             Write-Host $testExpression -ForegroundColor Magenta
             if ($maximumParalellJobs -le 1) {
                 Invoke-Expression $testExpression # For running in the foreground
             } else {
-    
+
                 $testExpression += " > ""$testResultDirectory/dotnet-test.log"" 2> ""$testResultDirectory/dotnet-test-error.log"""
                 $scriptBlock = {
                     param([string]$testExpression)
                     Invoke-Expression $testExpression
                 }
-    
+
                 # Avoid dotnet test collisions by delaying for 500ms
                 Start-Sleep -Milliseconds 500
-    
+
                 # Execute the jobs in parallel
                 Start-Job -Name "$testName,$framework,$testPlatform" -ScriptBlock $scriptBlock -ArgumentList $testExpression
             }
         }
     }
-    
+
     RunTests -Framework "$framework" -FileRegexPattern "$testBinaryFilesPattern"
-    
+
     if ($maximumParalellJobs -gt 1) {
         # Wait for it all to complete
         do {
@@ -229,7 +274,7 @@
             }
         } until ($running.Count -eq 0)
     }
-    
+
     $global:LASTEXITCODE = 0 # Force the script to continue on error
   displayName: 'dotnet test ${{ parameters.framework }},${{ parameters.vsTestPlatform }}'
   ignoreLASTEXITCODE: true
@@ -247,7 +292,7 @@
 # it would be a ton of work to make a replacement for the
 # Publish Test Results task or the (deprecated) TfsPublisher
 # our only other option is to make a task for every supported
-# platform and project and update it whenever a new platform 
+# platform and project and update it whenever a new platform
 # is targeted or test project is created in Lucene.Net.
 
 - template: 'publish-test-results-for-test-projects.yml'
@@ -270,4 +315,4 @@
     }
     if ($failed) {
         Write-Host "##vso[task.complete result=Failed;]"
-    }
\ No newline at end of file
+    }
diff --git a/.build/dependencies.props b/.build/dependencies.props
index 22d4e0e..0915432 100644
--- a/.build/dependencies.props
+++ b/.build/dependencies.props
@@ -60,7 +60,7 @@
     <MicrosoftExtensionsDependencyInjectionPackageVersion>$(MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion)</MicrosoftExtensionsDependencyInjectionPackageVersion>
     <MicrosoftExtensionsOptionsPackageVersion>2.0.0</MicrosoftExtensionsOptionsPackageVersion>
     <MicrosoftNETFrameworkReferenceAssembliesPackageReferenceVersion>1.0.2</MicrosoftNETFrameworkReferenceAssembliesPackageReferenceVersion>
-    <MicrosoftNETTestSdkPackageVersion>16.6.1</MicrosoftNETTestSdkPackageVersion>
+    <MicrosoftNETTestSdkPackageVersion>17.9.0</MicrosoftNETTestSdkPackageVersion>
     <MicrosoftSourceLinkAzureReposGitPackageReferenceVersion>1.1.1</MicrosoftSourceLinkAzureReposGitPackageReferenceVersion>
     <MicrosoftSourceLinkGitHubPackageReferenceVersion>$(MicrosoftSourceLinkAzureReposGitPackageReferenceVersion)</MicrosoftSourceLinkGitHubPackageReferenceVersion>
     <MorfologikFsaPackageVersion>2.1.7</MorfologikFsaPackageVersion>
@@ -68,7 +68,7 @@
     <MorfologikStemmingPackageVersion>$(MorfologikFsaPackageVersion)</MorfologikStemmingPackageVersion>
     <NETStandardLibrary20PackageVersion>2.0.3</NETStandardLibrary20PackageVersion>
     <NewtonsoftJsonPackageVersion>13.0.1</NewtonsoftJsonPackageVersion>
-    <NUnit3TestAdapterPackageVersion>3.17.0</NUnit3TestAdapterPackageVersion>
+    <NUnit3TestAdapterPackageVersion>4.5.0</NUnit3TestAdapterPackageVersion>
     <NUnitPackageVersion>3.13.1</NUnitPackageVersion>
     <RandomizedTestingGeneratorsPackageVersion>2.7.8</RandomizedTestingGeneratorsPackageVersion>
     <SharpZipLibPackageVersion>1.4.2</SharpZipLibPackageVersion>
@@ -81,7 +81,7 @@
     <SystemRuntimeInteropServicesRuntimeInformationPackageVersion>4.3.0</SystemRuntimeInteropServicesRuntimeInformationPackageVersion>
     <SystemSecurityCryptographyXmlPackageVersion>6.0.1</SystemSecurityCryptographyXmlPackageVersion>
     <SystemTextEncodingCodePagesPackageVersion>4.3.0</SystemTextEncodingCodePagesPackageVersion>
-    <SystemTextEncodingCodePagesPackageVersion Condition=" '$(TargetFramework)' == 'net461' ">5.0.0</SystemTextEncodingCodePagesPackageVersion>
+    <SystemTextEncodingCodePagesPackageVersion Condition=" '$(TargetFramework)' == 'net472' ">5.0.0</SystemTextEncodingCodePagesPackageVersion>
     <SystemTextJsonPackageVersion>6.0.6</SystemTextJsonPackageVersion>
     <TimeZoneConverterPackageVersion>6.1.0</TimeZoneConverterPackageVersion>
   </PropertyGroup>
@@ -89,4 +89,4 @@
     <OpenNLPToolsMavenReferenceVersion>1.9.1</OpenNLPToolsMavenReferenceVersion>
     <OSGICoreMavenReferenceVersion>4.2.0</OSGICoreMavenReferenceVersion>
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
diff --git a/.build/runbuild.ps1 b/.build/runbuild.ps1
index d8d1c0a..35f5abe 100644
--- a/.build/runbuild.ps1
+++ b/.build/runbuild.ps1
@@ -6,9 +6,9 @@
 # The ASF licenses this file to You 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.
@@ -27,7 +27,7 @@
     [string]$testResultsDirectory = "$artifactsDirectory/TestResults"
     [string]$publishDirectory = "$artifactsDirectory/Publish"
     [string]$solutionFile = "$baseDirectory/Lucene.Net.sln"
-    [string]$minimumSdkVersion = "7.0.100"
+    [string]$minimumSdkVersion = "8.0.100"
     [string]$globalJsonFile = "$baseDirectory/global.json"
     [string]$versionPropsFile = "$baseDirectory/version.props"
     [string]$luceneReadmeFile = "$baseDirectory/src/Lucene.Net/readme-nuget.md"
@@ -48,7 +48,7 @@
     [string]$publishedArtifactZipFileName = "artifact.zip"
 
     [int]$maximumParallelJobs = 8
-    
+
     #test parameters
     #The build uses Lucene.Net.Tests.Analysis.Common to determine all of the targets for the solution:
     [string]$projectWithAllTestFrameworks = "$baseDirectory/src/Lucene.Net.Tests.Analysis.Common/Lucene.Net.Tests.Analysis.Common.csproj"
@@ -116,7 +116,7 @@
 task Restore -description "This task restores the dependencies" {
     Write-Host "##teamcity[progressMessage 'Restoring']"
     Write-Host "##vso[task.setprogress]'Restoring'"
-    Exec { 
+    Exec {
         & dotnet restore $solutionFile --no-dependencies /p:TestFrameworks=true
     }
 }
@@ -195,13 +195,13 @@
 
     try {
         $frameworksToTest = Get-FrameworksToTest
-        
+
         if ($zipPublishedArtifacts) {
             $outDirectory = New-TemporaryDirectory
         } else {
             $outDirectory = $publishDirectory
         }
-        
+
         foreach ($framework in $frameworksToTest) {
 
             # Pause if we have queued too many parallel jobs
@@ -215,7 +215,7 @@
 
             # Do this first so there is no conflict
             Ensure-Directory-Exists $outputPath
-            
+
             Write-Host "Configuration: $configuration"
 
             $expression = "dotnet publish `"$solutionFile`" --configuration `"$configuration`" --framework `"$framework`" --output `"$outputPath`""
@@ -271,7 +271,7 @@
     popd
 
     $testProjects = $testProjects | Sort-Object -Property FullName
-    
+
     $frameworksToTest = Get-FrameworksToTest
 
     [int]$totalProjects = $testProjects.Length * $frameworksToTest.Length
@@ -281,7 +281,7 @@
 
     foreach ($testProject in $testProjects) {
         $testName = $testProject.Directory.Name
-        
+
         # Call the target to get the configured test frameworks for this project. We only read the first line because MSBuild adds extra output.
         $frameworksString = $(dotnet build "$testProject" --verbosity minimal --nologo --no-restore /t:PrintTargetFrameworks /p:TestProjectsOnly=true /p:TestFrameworks=true)[0].Trim()
 
@@ -296,7 +296,7 @@
 
         $frameworks = [System.Collections.Generic.HashSet[string]]::new($frameworksString -split '\s*;\s*')
         foreach ($framework in $frameworksToTest) {
-            
+
             # If the framework is not valid for this configuration, we need to adjust our
             # initial estimate and skip the combination.
             if (-not $frameworks.Contains($framework)) {
@@ -304,7 +304,7 @@
                 $remainingProjects--
                 continue
             }
-            
+
             Write-Host ""
             Write-Host "  Next Project in Queue: $testName, Framework: $framework" -ForegroundColor Yellow
 
@@ -336,7 +336,7 @@
             # Also log to a file in TRX format, so we have a build artifact both when
             # doing release inspection and on the CI server.
             $testExpression = "$testExpression --logger:""trx;LogFileName=TestResults.trx"""
-            
+
             if (![string]::IsNullOrEmpty($where)) {
                 $testExpression = "$testExpression --TestCaseFilter:""$where"""
             }
@@ -580,7 +580,7 @@
             $_.FullName
         }
         popd
-        
+
         [int]$totalCountForFramework = 0
         [int]$executedCountForFramework = 0
         [int]$passedCountForFramework = 0
@@ -604,7 +604,7 @@
             $reader = [System.Xml.XmlReader]::Create($testReport)
             try {
                 while ($reader.Read()) {
-                    
+
                     if ($reader.NodeType -eq [System.Xml.XmlNodeType]::Element -and $reader.Name -eq 'ResultSummary') {
                         $outcome = $reader.GetAttribute('outcome')
                         if ($outcomeForFramework -eq 'Completed') {
@@ -751,4 +751,4 @@
 function Normalize-FileSystemSlashes([string]$path) {
     $sep = [System.IO.Path]::DirectorySeparatorChar
     return $($path -replace '/',$sep -replace '\\',$sep)
-}
\ No newline at end of file
+}
diff --git a/.github/workflows/Generate-TestWorkflows.ps1 b/.github/workflows/Generate-TestWorkflows.ps1
index ef18995..3b97afa 100644
--- a/.github/workflows/Generate-TestWorkflows.ps1
+++ b/.github/workflows/Generate-TestWorkflows.ps1
@@ -38,7 +38,7 @@
 
  .PARAMETER TestFrameworks
     A string array of Dotnet target framework monikers to run the tests on. The default is
-    @('net6.0', 'net5.0','net461','net48').
+    @('net6.0', 'net5.0','net472','net48').
 
  .PARAMETER OperatingSystems
     A string array of Github Actions operating system monikers to run the tests on.
@@ -51,24 +51,24 @@
  .PARAMETER Configurations
     A string array of build configurations to run the tests on. The default is @('Release').
 
- .PARAMETER DotNet7SDKVersion
-    The SDK version of .NET 7.x to install on the build agent to be used for building and
-    testing. This SDK is always installed on the build agent. The default is 7.0.100.
+ .PARAMETER DotNet8SDKVersion
+    The SDK version of .NET 8.x to install on the build agent to be used for building and
+    testing. This SDK is always installed on the build agent. The default is 8.0.x.
 
  .PARAMETER DotNet6SDKVersion
     The SDK version of .NET 6.x to install on the build agent to be used for building and
-    testing. This SDK is always installed on the build agent. The default is 6.0.403.
+    testing. This SDK is always installed on the build agent. The default is 6.0.x.
 
  .PARAMETER DotNet5SDKVersion
     The SDK version of .NET 5.x to install on the build agent to be used for building and
-    testing. This SDK is always installed on the build agent. The default is 5.0.400.
+    testing. This SDK is always installed on the build agent. The default is 5.0.x.
 #>
 param(
     [string]$OutputDirectory =  $PSScriptRoot,
 
     [string]$RepoRoot = (Split-Path (Split-Path $PSScriptRoot)),
 
-    [string[]]$TestFrameworks = @('net7.0', 'net5.0','net461','net48'), # targets under test: net6.0, netstandard2.1, netstanard2.0, net462
+    [string[]]$TestFrameworks = @('net8.0', 'net5.0','net472','net48'), # targets under test: net6.0, netstandard2.1, netstanard2.0, net462
 
     [string[]]$OperatingSystems = @('windows-latest', 'ubuntu-latest'),
 
@@ -76,11 +76,11 @@
 
     [string[]]$Configurations = @('Release'),
 
-    [string]$DotNet7SDKVersion = '7.0.100',
+    [string]$DotNet8SDKVersion = '8.0.x',
 
-    [string]$DotNet6SDKVersion = '6.0.403',
+    [string]$DotNet6SDKVersion = '6.0.x',
 
-    [string]$DotNet5SDKVersion = '5.0.400'
+    [string]$DotNet5SDKVersion = '5.0.x'
 )
 
 
@@ -160,7 +160,7 @@
     [string[]]$TestFrameworks = @('net5.0', 'net48'),
     [string[]]$TestPlatforms = @('x64'),
     [string[]]$OperatingSystems = @('windows-latest', 'ubuntu-latest', 'macos-latest'),
-    [string]$DotNet7SDKVersion = $DotNet7SDKVersion,
+    [string]$DotNet8SDKVersion = $DotNet8SDKVersion,
     [string]$DotNet6SDKVersion = $DotNet6SDKVersion,
     [string]$DotNet5SDKVersion = $DotNet5SDKVersion) {
 
@@ -200,7 +200,7 @@
         $directoryBuildPaths += "    - '$path'" + [System.Environment]::NewLine
     }
 
-    
+
 
     $fileText = "####################################################################################
 # DO NOT EDIT: This file was automatically generated by Generate-TestWorkflows.ps1
@@ -212,9 +212,9 @@
 # to you 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
@@ -251,11 +251,11 @@
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: '$projectRelativePath'"
 
@@ -294,10 +294,10 @@
           dotnet-version: '$DotNet6SDKVersion'
         if: `${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '$DotNet7SDKVersion'
+          dotnet-version: '$DotNet8SDKVersion'
 
       - name: Setup Environment Variables
         run: |
@@ -356,13 +356,13 @@
     Pop-Location
 }
 
-#Write-TestWorkflow -OutputDirectory $OutputDirectory -ProjectPath $projectPath -RelativeRoot $repoRoot -TestFrameworks @('net5.0') -OperatingSystems $OperatingSystems -TestPlatforms $TestPlatforms -Configurations $Configurations -DotNet7SDKVersion $DotNet7SDKVersion -DotNet6SDKVersion $DotNet6SDKVersion -DotNet5SDKVersion $DotNet5SDKVersion
+#Write-TestWorkflow -OutputDirectory $OutputDirectory -ProjectPath $projectPath -RelativeRoot $repoRoot -TestFrameworks @('net5.0') -OperatingSystems $OperatingSystems -TestPlatforms $TestPlatforms -Configurations $Configurations -DotNet8SDKVersion $DotNet8SDKVersion -DotNet6SDKVersion $DotNet6SDKVersion -DotNet5SDKVersion $DotNet5SDKVersion
 
 #Write-Host $TestProjects
 
 foreach ($testProject in $TestProjects) {
     $projectName = [System.IO.Path]::GetFileNameWithoutExtension($testProject)
-    
+
      # Call the target to get the configured test frameworks for this project. We only read the first line because MSBuild adds extra output.
     $frameworksString = $(dotnet build "$testProject" --verbosity minimal --nologo --no-restore /t:PrintTargetFrameworks /p:TestProjectsOnly=true /p:TestFrameworks=true)[0].Trim()
 
@@ -383,5 +383,5 @@
     Write-Host "Frameworks To Test for ${projectName}: $($frameworks -join ';')" -ForegroundColor Cyan
 
     #Write-Host "Project: $projectName"
-    Write-TestWorkflow -OutputDirectory $OutputDirectory -ProjectPath $testProject -RelativeRoot $RepoRoot -TestFrameworks $frameworks -OperatingSystems $OperatingSystems -TestPlatforms $TestPlatforms -Configurations $Configurations -DotNet7SDKVersion $DotNet7SDKVersion -DotNet6SDKVersion $DotNet6SDKVersion -DotNet5SDKVersion $DotNet5SDKVersion
-}
\ No newline at end of file
+    Write-TestWorkflow -OutputDirectory $OutputDirectory -ProjectPath $testProject -RelativeRoot $RepoRoot -TestFrameworks $frameworks -OperatingSystems $OperatingSystems -TestPlatforms $TestPlatforms -Configurations $Configurations -DotNet8SDKVersion $DotNet8SDKVersion -DotNet6SDKVersion $DotNet6SDKVersion -DotNet5SDKVersion $DotNet5SDKVersion
+}
diff --git a/.github/workflows/Lucene-Net-Tests-AllProjects.yml b/.github/workflows/Lucene-Net-Tests-AllProjects.yml
index 600a203..63c6780 100644
--- a/.github/workflows/Lucene-Net-Tests-AllProjects.yml
+++ b/.github/workflows/Lucene-Net-Tests-AllProjects.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -72,18 +72,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.AllProjects/Lucene.Net.Tests.AllProjects.csproj'
       run_slow_tests: 'false'
@@ -103,19 +103,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Analysis-Common.yml b/.github/workflows/Lucene-Net-Tests-Analysis-Common.yml
index f3ffcbf..696e3e3 100644
--- a/.github/workflows/Lucene-Net-Tests-Analysis-Common.yml
+++ b/.github/workflows/Lucene-Net-Tests-Analysis-Common.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -56,18 +56,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Analysis.Common/Lucene.Net.Tests.Analysis.Common.csproj'
       run_slow_tests: 'false'
@@ -87,19 +87,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Analysis-Kuromoji.yml b/.github/workflows/Lucene-Net-Tests-Analysis-Kuromoji.yml
index cd17419..f496463 100644
--- a/.github/workflows/Lucene-Net-Tests-Analysis-Kuromoji.yml
+++ b/.github/workflows/Lucene-Net-Tests-Analysis-Kuromoji.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -53,18 +53,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Analysis.Kuromoji/Lucene.Net.Tests.Analysis.Kuromoji.csproj'
       run_slow_tests: 'false'
@@ -84,19 +84,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Analysis-Morfologik.yml b/.github/workflows/Lucene-Net-Tests-Analysis-Morfologik.yml
index 7100bd3..9d15552 100644
--- a/.github/workflows/Lucene-Net-Tests-Analysis-Morfologik.yml
+++ b/.github/workflows/Lucene-Net-Tests-Analysis-Morfologik.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -53,18 +53,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Analysis.Morfologik/Lucene.Net.Tests.Analysis.Morfologik.csproj'
       run_slow_tests: 'false'
@@ -84,19 +84,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Analysis-OpenNLP.yml b/.github/workflows/Lucene-Net-Tests-Analysis-OpenNLP.yml
index ca1236a..e05c686 100644
--- a/.github/workflows/Lucene-Net-Tests-Analysis-OpenNLP.yml
+++ b/.github/workflows/Lucene-Net-Tests-Analysis-OpenNLP.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -56,18 +56,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net48]
+        framework: [net8.0, net48]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Analysis.OpenNLP/Lucene.Net.Tests.Analysis.OpenNLP.csproj'
       run_slow_tests: 'false'
@@ -87,19 +87,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Analysis-Phonetic.yml b/.github/workflows/Lucene-Net-Tests-Analysis-Phonetic.yml
index 4cfe7ad..b4d206e 100644
--- a/.github/workflows/Lucene-Net-Tests-Analysis-Phonetic.yml
+++ b/.github/workflows/Lucene-Net-Tests-Analysis-Phonetic.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -50,18 +50,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Analysis.Phonetic/Lucene.Net.Tests.Analysis.Phonetic.csproj'
       run_slow_tests: 'false'
@@ -81,19 +81,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Analysis-SmartCn.yml b/.github/workflows/Lucene-Net-Tests-Analysis-SmartCn.yml
index 96025d2..91f289e 100644
--- a/.github/workflows/Lucene-Net-Tests-Analysis-SmartCn.yml
+++ b/.github/workflows/Lucene-Net-Tests-Analysis-SmartCn.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -54,18 +54,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Analysis.SmartCn/Lucene.Net.Tests.Analysis.SmartCn.csproj'
       run_slow_tests: 'false'
@@ -85,19 +85,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Analysis-Stempel.yml b/.github/workflows/Lucene-Net-Tests-Analysis-Stempel.yml
index d1bc492..3083052 100644
--- a/.github/workflows/Lucene-Net-Tests-Analysis-Stempel.yml
+++ b/.github/workflows/Lucene-Net-Tests-Analysis-Stempel.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -51,18 +51,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Analysis.Stempel/Lucene.Net.Tests.Analysis.Stempel.csproj'
       run_slow_tests: 'false'
@@ -82,19 +82,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Benchmark.yml b/.github/workflows/Lucene-Net-Tests-Benchmark.yml
index 6c06c9c..196e9dd 100644
--- a/.github/workflows/Lucene-Net-Tests-Benchmark.yml
+++ b/.github/workflows/Lucene-Net-Tests-Benchmark.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -63,18 +63,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Benchmark/Lucene.Net.Tests.Benchmark.csproj'
       run_slow_tests: 'false'
@@ -94,19 +94,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Classification.yml b/.github/workflows/Lucene-Net-Tests-Classification.yml
index b1df8b4..babf81d 100644
--- a/.github/workflows/Lucene-Net-Tests-Classification.yml
+++ b/.github/workflows/Lucene-Net-Tests-Classification.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -51,18 +51,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Classification/Lucene.Net.Tests.Classification.csproj'
       run_slow_tests: 'false'
@@ -82,19 +82,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Cli.yml b/.github/workflows/Lucene-Net-Tests-Cli.yml
index e3ad2b1..3bb4dd5 100644
--- a/.github/workflows/Lucene-Net-Tests-Cli.yml
+++ b/.github/workflows/Lucene-Net-Tests-Cli.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -70,18 +70,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0]
+        framework: [net8.0]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/dotnet/tools/Lucene.Net.Tests.Cli/Lucene.Net.Tests.Cli.csproj'
       project_under_test_path: './src/dotnet/tools/lucene-cli/lucene-cli.csproj'
@@ -102,19 +102,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-CodeAnalysis.yml b/.github/workflows/Lucene-Net-Tests-CodeAnalysis.yml
index 8ccb12c..886a49b 100644
--- a/.github/workflows/Lucene-Net-Tests-CodeAnalysis.yml
+++ b/.github/workflows/Lucene-Net-Tests-CodeAnalysis.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -56,11 +56,11 @@
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/dotnet/Lucene.Net.Tests.CodeAnalysis/Lucene.Net.Tests.CodeAnalysis.csproj'
       run_slow_tests: 'false'
@@ -80,19 +80,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Codecs.yml b/.github/workflows/Lucene-Net-Tests-Codecs.yml
index f20da85..1d00f94 100644
--- a/.github/workflows/Lucene-Net-Tests-Codecs.yml
+++ b/.github/workflows/Lucene-Net-Tests-Codecs.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -49,18 +49,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Codecs/Lucene.Net.Tests.Codecs.csproj'
       run_slow_tests: 'false'
@@ -80,19 +80,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Demo.yml b/.github/workflows/Lucene-Net-Tests-Demo.yml
index b426913..7cf76b9 100644
--- a/.github/workflows/Lucene-Net-Tests-Demo.yml
+++ b/.github/workflows/Lucene-Net-Tests-Demo.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -58,18 +58,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Demo/Lucene.Net.Tests.Demo.csproj'
       run_slow_tests: 'false'
@@ -89,19 +89,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Expressions.yml b/.github/workflows/Lucene-Net-Tests-Expressions.yml
index af2d181..b35efd4 100644
--- a/.github/workflows/Lucene-Net-Tests-Expressions.yml
+++ b/.github/workflows/Lucene-Net-Tests-Expressions.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -51,18 +51,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Expressions/Lucene.Net.Tests.Expressions.csproj'
       run_slow_tests: 'false'
@@ -82,19 +82,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Facet.yml b/.github/workflows/Lucene-Net-Tests-Facet.yml
index fd6ff5a..3fdb6b2 100644
--- a/.github/workflows/Lucene-Net-Tests-Facet.yml
+++ b/.github/workflows/Lucene-Net-Tests-Facet.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -53,18 +53,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Facet/Lucene.Net.Tests.Facet.csproj'
       run_slow_tests: 'false'
@@ -84,19 +84,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Grouping.yml b/.github/workflows/Lucene-Net-Tests-Grouping.yml
index bda59dc..02d5bfe 100644
--- a/.github/workflows/Lucene-Net-Tests-Grouping.yml
+++ b/.github/workflows/Lucene-Net-Tests-Grouping.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -51,18 +51,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Grouping/Lucene.Net.Tests.Grouping.csproj'
       run_slow_tests: 'false'
@@ -82,19 +82,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Highlighter.yml b/.github/workflows/Lucene-Net-Tests-Highlighter.yml
index 12dc69b..b28f01f 100644
--- a/.github/workflows/Lucene-Net-Tests-Highlighter.yml
+++ b/.github/workflows/Lucene-Net-Tests-Highlighter.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -53,18 +53,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Highlighter/Lucene.Net.Tests.Highlighter.csproj'
       run_slow_tests: 'false'
@@ -84,19 +84,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-ICU.yml b/.github/workflows/Lucene-Net-Tests-ICU.yml
index adbd507..81d1bff 100644
--- a/.github/workflows/Lucene-Net-Tests-ICU.yml
+++ b/.github/workflows/Lucene-Net-Tests-ICU.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -66,18 +66,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/dotnet/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj'
       run_slow_tests: 'false'
@@ -97,19 +97,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Join.yml b/.github/workflows/Lucene-Net-Tests-Join.yml
index 9d0b67c..494294b 100644
--- a/.github/workflows/Lucene-Net-Tests-Join.yml
+++ b/.github/workflows/Lucene-Net-Tests-Join.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -52,18 +52,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Join/Lucene.Net.Tests.Join.csproj'
       run_slow_tests: 'false'
@@ -83,19 +83,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Memory.yml b/.github/workflows/Lucene-Net-Tests-Memory.yml
index 019dbfc..6f8bf21 100644
--- a/.github/workflows/Lucene-Net-Tests-Memory.yml
+++ b/.github/workflows/Lucene-Net-Tests-Memory.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -54,18 +54,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Memory/Lucene.Net.Tests.Memory.csproj'
       run_slow_tests: 'false'
@@ -85,19 +85,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Misc.yml b/.github/workflows/Lucene-Net-Tests-Misc.yml
index 05488db..ba0ac97 100644
--- a/.github/workflows/Lucene-Net-Tests-Misc.yml
+++ b/.github/workflows/Lucene-Net-Tests-Misc.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -50,18 +50,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Misc/Lucene.Net.Tests.Misc.csproj'
       run_slow_tests: 'false'
@@ -81,19 +81,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Queries.yml b/.github/workflows/Lucene-Net-Tests-Queries.yml
index cb2bdf3..e0e98a1 100644
--- a/.github/workflows/Lucene-Net-Tests-Queries.yml
+++ b/.github/workflows/Lucene-Net-Tests-Queries.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -50,18 +50,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Queries/Lucene.Net.Tests.Queries.csproj'
       run_slow_tests: 'false'
@@ -81,19 +81,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-QueryParser.yml b/.github/workflows/Lucene-Net-Tests-QueryParser.yml
index 8e33eef..7e63026 100644
--- a/.github/workflows/Lucene-Net-Tests-QueryParser.yml
+++ b/.github/workflows/Lucene-Net-Tests-QueryParser.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -56,18 +56,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.QueryParser/Lucene.Net.Tests.QueryParser.csproj'
       run_slow_tests: 'false'
@@ -87,19 +87,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Replicator.yml b/.github/workflows/Lucene-Net-Tests-Replicator.yml
index 6e41a5e..849a20b 100644
--- a/.github/workflows/Lucene-Net-Tests-Replicator.yml
+++ b/.github/workflows/Lucene-Net-Tests-Replicator.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -55,18 +55,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Replicator/Lucene.Net.Tests.Replicator.csproj'
       run_slow_tests: 'false'
@@ -86,19 +86,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Sandbox.yml b/.github/workflows/Lucene-Net-Tests-Sandbox.yml
index b688b3a..434fd5c 100644
--- a/.github/workflows/Lucene-Net-Tests-Sandbox.yml
+++ b/.github/workflows/Lucene-Net-Tests-Sandbox.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -51,18 +51,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Sandbox/Lucene.Net.Tests.Sandbox.csproj'
       run_slow_tests: 'false'
@@ -82,19 +82,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Spatial.yml b/.github/workflows/Lucene-Net-Tests-Spatial.yml
index 2ef1b91..be51aac 100644
--- a/.github/workflows/Lucene-Net-Tests-Spatial.yml
+++ b/.github/workflows/Lucene-Net-Tests-Spatial.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -52,18 +52,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Spatial/Lucene.Net.Tests.Spatial.csproj'
       run_slow_tests: 'false'
@@ -83,19 +83,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-Suggest.yml b/.github/workflows/Lucene-Net-Tests-Suggest.yml
index 6040146..2483301 100644
--- a/.github/workflows/Lucene-Net-Tests-Suggest.yml
+++ b/.github/workflows/Lucene-Net-Tests-Suggest.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -53,18 +53,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.Suggest/Lucene.Net.Tests.Suggest.csproj'
       run_slow_tests: 'false'
@@ -84,19 +84,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-TestFramework-DependencyInjection.yml b/.github/workflows/Lucene-Net-Tests-TestFramework-DependencyInjection.yml
index c2ac724..eeda1ab 100644
--- a/.github/workflows/Lucene-Net-Tests-TestFramework-DependencyInjection.yml
+++ b/.github/workflows/Lucene-Net-Tests-TestFramework-DependencyInjection.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -49,18 +49,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.TestFramework.DependencyInjection/Lucene.Net.Tests.TestFramework.DependencyInjection.csproj'
       run_slow_tests: 'false'
@@ -80,19 +80,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-TestFramework.yml b/.github/workflows/Lucene-Net-Tests-TestFramework.yml
index a8b2a85..b9be141 100644
--- a/.github/workflows/Lucene-Net-Tests-TestFramework.yml
+++ b/.github/workflows/Lucene-Net-Tests-TestFramework.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -51,18 +51,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests.TestFramework/Lucene.Net.Tests.TestFramework.csproj'
       run_slow_tests: 'false'
@@ -82,19 +82,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-_A-D.yml b/.github/workflows/Lucene-Net-Tests-_A-D.yml
index a4c0878..f647a03 100644
--- a/.github/workflows/Lucene-Net-Tests-_A-D.yml
+++ b/.github/workflows/Lucene-Net-Tests-_A-D.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -60,18 +60,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests._A-D/Lucene.Net.Tests._A-D.csproj'
       run_slow_tests: 'false'
@@ -91,19 +91,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-_E-I.yml b/.github/workflows/Lucene-Net-Tests-_E-I.yml
index ee961b9..7ee39f4 100644
--- a/.github/workflows/Lucene-Net-Tests-_E-I.yml
+++ b/.github/workflows/Lucene-Net-Tests-_E-I.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -70,18 +70,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests._E-I/Lucene.Net.Tests._E-I.csproj'
       run_slow_tests: 'false'
@@ -101,19 +101,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-_I-J.yml b/.github/workflows/Lucene-Net-Tests-_I-J.yml
index 5253ca8..0e92f32 100644
--- a/.github/workflows/Lucene-Net-Tests-_I-J.yml
+++ b/.github/workflows/Lucene-Net-Tests-_I-J.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -75,18 +75,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests._I-J/Lucene.Net.Tests._I-J.csproj'
       run_slow_tests: 'false'
@@ -106,19 +106,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-_J-S.yml b/.github/workflows/Lucene-Net-Tests-_J-S.yml
index a79f1f0..d268414 100644
--- a/.github/workflows/Lucene-Net-Tests-_J-S.yml
+++ b/.github/workflows/Lucene-Net-Tests-_J-S.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -62,18 +62,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests._J-S/Lucene.Net.Tests._J-S.csproj'
       run_slow_tests: 'false'
@@ -93,19 +93,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.github/workflows/Lucene-Net-Tests-_T-Z.yml b/.github/workflows/Lucene-Net-Tests-_T-Z.yml
index aae9777..e322946 100644
--- a/.github/workflows/Lucene-Net-Tests-_T-Z.yml
+++ b/.github/workflows/Lucene-Net-Tests-_T-Z.yml
@@ -8,9 +8,9 @@
 # to you 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
@@ -57,18 +57,18 @@
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest]
-        framework: [net7.0, net5.0, net48, net461]
+        framework: [net8.0, net5.0, net48, net472]
         platform: [x64]
         configuration: [Release]
         exclude:
           - os: ubuntu-latest
             framework: net48
           - os: ubuntu-latest
-            framework: net461
+            framework: net472
           - os: macos-latest
             framework: net48
           - os: macos-latest
-            framework: net461
+            framework: net472
     env:
       project_path: './src/Lucene.Net.Tests._T-Z/Lucene.Net.Tests._T-Z.csproj'
       run_slow_tests: 'false'
@@ -88,19 +88,19 @@
       - name: Setup .NET 5 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '5.0.400'
+          dotnet-version: '5.0.x'
         if: ${{ startswith(matrix.framework, 'net5.') }}
 
       - name: Setup .NET 6 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '6.0.403'
+          dotnet-version: '6.0.x'
         if: ${{ startswith(matrix.framework, 'net6.') }}
 
-      - name: Setup .NET 7 SDK
+      - name: Setup .NET 8 SDK
         uses: actions/setup-dotnet@v3
         with:
-          dotnet-version: '7.0.100'
+          dotnet-version: '8.0.x'
 
       - name: Setup Environment Variables
         run: |
diff --git a/.idea/.idea.Lucene.Net/.idea/.gitignore b/.idea/.idea.Lucene.Net/.idea/.gitignore
index e4c6e33..77961c0 100644
--- a/.idea/.idea.Lucene.Net/.idea/.gitignore
+++ b/.idea/.idea.Lucene.Net/.idea/.gitignore
@@ -11,3 +11,5 @@
 # Datasource local storage ignored files
 /dataSources/
 /dataSources.local.xml
+# GitHub Copilot persisted chat sessions
+/copilot/chatSessions
diff --git a/Directory.Build.props b/Directory.Build.props
index 413c2aa..6e4d7ab 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -43,6 +43,9 @@
     <!-- .NET enforces AssemblyVersion as the "major" version (when strong-named),
       so AssemblyVersion should only be changed for each major version release. -->
     <AssemblyVersion>4.0.0</AssemblyVersion>
+
+    <!-- .NET 8 SDK has a breaking change where they automatically add the commit hash to InformationalVersion unless it is explicitly disabled. -->
+    <IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
   </PropertyGroup>
 
   <PropertyGroup Label="Assembly Signing">
@@ -88,4 +91,4 @@
       in Version.props, if it exists and the PrepareForBuild argument 
       passed into build.ps1 is 'false'. -->
   <Import Project="version.props" Condition="Exists('version.props')" />
-</Project>
\ No newline at end of file
+</Project>
diff --git a/Directory.Build.targets b/Directory.Build.targets
index 042d188..2e25939 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -22,24 +22,24 @@
 
   <Import Project=".build/dependencies.props" Condition="Exists('.build/dependencies.props')" />
 
-  <!-- Features in .NET 6.x and .NET 7.x only -->
-  <PropertyGroup Condition=" $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) ">
+  <!-- Features in .NET 6.x, .NET 7.x, and .NET 8.x only -->
+  <PropertyGroup Condition=" $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
 
-    <DefineConstants>$(DefineConstants);FEATURE_SPANFORMATTABLE</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_RANDOM_NEXTINT64_NEXTSINGLE</DefineConstants>
+    <DefineConstants>$(DefineConstants);FEATURE_SPANFORMATTABLE</DefineConstants>
 
   </PropertyGroup>
 
-  <!-- Features in .NET 5.x, .NET 6.x, and .NET 7.x only -->
-  <PropertyGroup Condition=" $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) ">
+  <!-- Features in .NET 5.x, .NET 6.x, .NET 7.x, and .NET 8.x only -->
+  <PropertyGroup Condition=" $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
 
     <DefineConstants>$(DefineConstants);FEATURE_ASPNETCORE_ENDPOINT_CONFIG</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_READONLYSET</DefineConstants>
 
   </PropertyGroup>
-  
-  <!-- Features in .NET Core 3.x, .NET 5.x, .NET 6.x, and .NET 7.x only -->
-  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) ">
+
+  <!-- Features in .NET Core 3.x, .NET 5.x, .NET 6.x, .NET 7.x, and .NET 8.x only -->
+  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
 
     <DefineConstants>$(DefineConstants);FEATURE_ARGITERATOR</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_DICTIONARY_REMOVE_CONTINUEENUMERATION</DefineConstants>
@@ -47,20 +47,20 @@
     <DefineConstants>$(DefineConstants);FEATURE_STRING_CONCAT_READONLYSPAN</DefineConstants>
 
   </PropertyGroup>
-  
-  <!-- Features in .NET Standard, .NET Core, .NET 5.x, and .NET 6.x only (no .NET Framework support) -->
-  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netstandard')) Or $(TargetFramework.StartsWith('netcoreapp')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) ">
-    
+
+  <!-- Features in .NET Standard, .NET Core, .NET 5.x, .NET 6.x, .NET 7.x, and .NET 8.x only (no .NET Framework support) -->
+  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netstandard')) Or $(TargetFramework.StartsWith('netcoreapp')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
+
     <DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_ARRAYEMPTY</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_CULTUREINFO_CURRENTCULTURE_SETTER</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_ENCODINGPROVIDERS</DefineConstants>
-    
+
     <DebugType>portable</DebugType>
   </PropertyGroup>
 
-  <!-- Features in .NET Standard 2.1, .NET 5.x, .NET 6.x, and .NET 7.x only -->
-  <PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' Or $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) ">
+  <!-- Features in .NET Standard 2.1, .NET 5.x, .NET 6.x, .NET 7.x, and .NET 8.x only -->
+  <PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' Or $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
 
     <DefineConstants>$(DefineConstants);FEATURE_ARRAY_FILL</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_CONDITIONALWEAKTABLE_ENUMERATOR</DefineConstants>
@@ -71,26 +71,32 @@
 
   </PropertyGroup>
 
-  <!-- Features in .NET Standard 2.x, .NET Core 2.x, .NET Core 3.x, .NET 5.x, .NET 6.x, and .NET 7.x -->
-  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netstandard2.')) Or $(TargetFramework.StartsWith('netcoreapp2.')) Or $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) ">
+  <!-- Features in .NET Standard 2.x, .NET Core 2.x, .NET Core 3.x, .NET 5.x, .NET 6.x, .NET 7.x, and .NET 8.x -->
+  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netstandard2.')) Or $(TargetFramework.StartsWith('netcoreapp2.')) Or $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
 
     <DefineConstants>$(DefineConstants);FEATURE_ICONFIGURATIONROOT_PROVIDERS</DefineConstants>
 
   </PropertyGroup>
 
-  <!-- Features in .NET Framework 4.5+, .NET Standard 2.x, .NET Core 2.x, .NET Core 3.x, .NET 5.x, .NET 6.x, and .NET 7.x  -->
-  <PropertyGroup Condition=" $(TargetFramework.StartsWith('net4')) Or $(TargetFramework.StartsWith('netstandard2.')) Or $(TargetFramework.StartsWith('netcoreapp2.')) Or $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) ">
+  <!-- Features in .NET Framework 4.5+, .NET Standard 2.x, .NET Core 2.x, .NET Core 3.x, .NET 5.x, .NET 6.x, .NET 7.x, and .NET 8.x  -->
+  <PropertyGroup Condition=" $(TargetFramework.StartsWith('net4')) Or $(TargetFramework.StartsWith('netstandard2.')) Or $(TargetFramework.StartsWith('netcoreapp2.')) Or $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
 
     <DefineConstants>$(DefineConstants);FEATURE_ASSEMBLY_GETCALLINGASSEMBLY</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_FILESTREAM_LOCK</DefineConstants>
-    <DefineConstants>$(DefineConstants);FEATURE_SERIALIZABLE</DefineConstants>
-    <DefineConstants>$(DefineConstants);FEATURE_SERIALIZABLE_EXCEPTIONS</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_TEXTWRITER_CLOSE</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_THREADPOOL_UNSAFEQUEUEWORKITEM</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_TYPE_GETMETHOD__BINDINGFLAGS_PARAMS</DefineConstants>
 
   </PropertyGroup>
 
+  <!-- Features in .NET Framework 4.5+, .NET Standard 2.x, .NET Core 2.x, .NET Core 3.x, .NET 5.x, and .NET 6.x, but deprecated or removed in .NET 7+  -->
+  <PropertyGroup Condition=" $(TargetFramework.StartsWith('net4')) Or $(TargetFramework.StartsWith('netstandard2.')) Or $(TargetFramework.StartsWith('netcoreapp2.')) Or $(TargetFramework.StartsWith('netcoreapp3.')) Or $(TargetFramework.StartsWith('net5.')) Or $(TargetFramework.StartsWith('net6.')) ">
+
+    <DefineConstants>$(DefineConstants);FEATURE_SERIALIZABLE</DefineConstants>
+    <DefineConstants>$(DefineConstants);FEATURE_SERIALIZABLE_EXCEPTIONS</DefineConstants>
+
+  </PropertyGroup>
+
   <!-- Features in .NET Framework 4.5+ and .NET Standard 2.x only (No .NET Core support) -->
   <PropertyGroup Condition=" $(TargetFramework.StartsWith('net4')) Or $(TargetFramework.StartsWith('netstandard2.')) ">
 
@@ -102,14 +108,14 @@
 
   <!-- Features in .NET Framework 4.6.1+ only -->
   <PropertyGroup Condition="'$(TargetFramework)' == 'net461' Or '$(TargetFramework)' == 'net462' Or $(TargetFramework.StartsWith('net47')) Or $(TargetFramework.StartsWith('net48'))">
-    
+
     <DefineConstants>$(DefineConstants);FEATURE_ICONFIGURATIONROOT_PROVIDERS</DefineConstants>
-    
+
   </PropertyGroup>
 
   <!-- Features in .NET Framework 4.6+ only -->
   <PropertyGroup Condition="$(TargetFramework.StartsWith('net46')) Or $(TargetFramework.StartsWith('net47')) Or $(TargetFramework.StartsWith('net48'))">
-    
+
     <DefineConstants>$(DefineConstants);FEATURE_ARRAYEMPTY</DefineConstants>
 
   </PropertyGroup>
@@ -125,21 +131,21 @@
     <DefineConstants>$(DefineConstants);FEATURE_MEMORYMAPPEDFILESECURITY</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_STACKOVERFLOWEXCEPTION__ISCATCHABLE</DefineConstants>
     <DefineConstants>$(DefineConstants);FEATURE_TEXTWRITER_CREATEOBJREF</DefineConstants>
-    
+
     <DebugType>full</DebugType>
   </PropertyGroup>
 
   <!-- Features in .NET Framework 4.5+ and .NET 6.0+ but not in .NET Standard 2.0 or .NET Standard 2.1 -->
-  <!-- net461 is used to test .NET Standard 2.0, so we treat it like it is not part of this group -->
-  <PropertyGroup Condition=" ($(TargetFramework.StartsWith('net4')) And '$(TargetFramework)' != 'net461') Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.'))">
+  <!-- net472 is used to test .NET Standard 2.0, so we treat it like it is not part of this group -->
+  <PropertyGroup Condition=" ($(TargetFramework.StartsWith('net4')) And '$(TargetFramework)' != 'net472') Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
 
     <DefineConstants>$(DefineConstants);FEATURE_OPENNLP</DefineConstants>
 
   </PropertyGroup>
-    
+
 
   <PropertyGroup>
-    <!-- NuGet.org only supports portable debug symbol format: 
+    <!-- NuGet.org only supports portable debug symbol format:
          https://docs.microsoft.com/en-us/nuget/create-packages/symbol-packages-snupkg#nugetorg-symbol-package-constraints -->
     <DebugType Condition=" '$(PortableDebugTypeOnly)' == 'true' ">portable</DebugType>
   </PropertyGroup>
@@ -183,13 +189,13 @@
 	</ItemGroup>
   </Target>
 
-	
+
   <!-- Global PackageReferences -->
   <ItemGroup>
     <!-- This is to allow the .NET Framework references to be machine-indepenedent so builds can happen without installing prerequisites -->
     <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="$(MicrosoftNETFrameworkReferenceAssembliesPackageReferenceVersion)" PrivateAssets="All" />
   </ItemGroup>
-  
+
   <!-- This is for testing only, we use SourceLink from any Azure DevOps git repo -->
   <ItemGroup Condition=" '$(BUILD_REPOSITORY_PROVIDER)' == 'TfsGit' " Label="SourceLink Packages (experimental Azure Repos)">
     <PackageReference Include="Microsoft.SourceLink.AzureRepos.Git" Version="$(MicrosoftSourceLinkAzureReposGitPackageReferenceVersion)" PrivateAssets="All"/>
@@ -201,4 +207,4 @@
 
   <Import Project=".build/release.targets" Condition="Exists('.build/release.targets')" />
 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/README.md b/README.md
index 4ebe83f..6b3e6c9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Welcome to Apache Lucene.NET 
+# Welcome to Apache Lucene.NET 
 
 [![Nuget](https://img.shields.io/nuget/dt/Lucene.Net)](https://www.nuget.org/packages/Lucene.Net)
 [![Azure DevOps builds (master)](https://img.shields.io/azure-devops/build/lucene-net/6ba240c9-9598-47e7-a793-0ed8a4ba2f8b/3/master)](https://dev.azure.com/lucene-net/Lucene.NET/_build?definitionId=3&_a=summary)
@@ -178,7 +178,7 @@
 ##### Prerequisites
 
 1. [PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell) 5.0 or higher (see [this question](http://stackoverflow.com/questions/1825585/determine-installed-powershell-version) to check your PowerShell version)
-2. [.NET 7.0 SDK or higher](https://dotnet.microsoft.com/download/visual-studio-sdks)
+2. [.NET 8.0 SDK or higher](https://dotnet.microsoft.com/download/visual-studio-sdks)
 
 ##### Execution
 
@@ -277,7 +277,7 @@
 #### Prerequisites
 
 1. Visual Studio 2022 or higher
-2. [.NET 7.0 SDK or higher](https://dotnet.microsoft.com/download/visual-studio-sdks)
+2. [.NET 8.0 SDK or higher](https://dotnet.microsoft.com/download/visual-studio-sdks)
 
 #### Execution
 
diff --git a/TestTargetFramework.props b/TestTargetFramework.props
index ad02d3b..023e64d 100644
--- a/TestTargetFramework.props
+++ b/TestTargetFramework.props
@@ -26,33 +26,33 @@
     <!-- Changing this setting will allow testing on all target frameworks within Visual Studio 2019.
     Note that the main libraries are multi-targeted, so this has no effect on how they are compiled,
     this setting only affects the test projects. -->
-    <!--<TargetFramework>net461</TargetFramework>-->
+    <!--<TargetFramework>net472</TargetFramework>-->
     <!--<TargetFramework>net48</TargetFramework>-->
     <!--<TargetFramework>net5.0</TargetFramework>-->
     <!--<TargetFramework>net6.0</TargetFramework>-->
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
 
     <!-- Allow the build script to pass in the test frameworks to build for.
-      This overrides the above TargetFramework setting. 
+      This overrides the above TargetFramework setting.
       LUCENENET TODO: Due to a parsing bug, we cannot pass a string with a ; to dotnet msbuild, so passing true as a workaround -->
 
     <!-- Test Client to DLL target works as follows:
       Test Client       | Target Under Test
-      net7.0            | net6.0
+      net8.0            | net6.0
       net6.0            | net6.0
       net5.0            | netstandard2.1
       net48             | net462
-      net461            | netstandard2.0
+      net472            | netstandard2.0
     -->
-    
-    <TargetFrameworks Condition=" '$(TestFrameworks)' == 'true' ">net7.0;net6.0;net5.0</TargetFrameworks>
-    <TargetFrameworks Condition=" '$(TestFrameworks)' == 'true' AND $([MSBuild]::IsOsPlatform('Windows')) ">$(TargetFrameworks);net48;net461</TargetFrameworks>
+
+    <TargetFrameworks Condition=" '$(TestFrameworks)' == 'true' ">net8.0;net6.0;net5.0</TargetFrameworks>
+    <TargetFrameworks Condition=" '$(TestFrameworks)' == 'true' AND $([MSBuild]::IsOsPlatform('Windows')) ">$(TargetFrameworks);net48;net472</TargetFrameworks>
     <TargetFramework Condition=" '$(TargetFrameworks)' != '' "></TargetFramework>
   </PropertyGroup>
 
   <PropertyGroup Label="Mismatched Target Framework (to override the target framework under test)">
     <SetTargetFramework></SetTargetFramework>
-    <SetTargetFramework Condition=" '$(TargetFramework)' == 'net461' ">TargetFramework=netstandard2.0</SetTargetFramework>
+    <SetTargetFramework Condition=" '$(TargetFramework)' == 'net472' ">TargetFramework=netstandard2.0</SetTargetFramework>
   </PropertyGroup>
 
   <PropertyGroup Label="Assembly Publishing">
@@ -64,9 +64,10 @@
   </PropertyGroup>
 
   <PropertyGroup Label="Warnings to be Disabled in Test Projects">
+
     <!-- We purposely test on EoL frameworks for testing netstandard2.1, but we want to keep this warning in production code. -->
-    <CheckEolTargetFramework>false</CheckEolTargetFramework>
-    
+    <CheckEolTargetFramework Condition=" '$(TargetFramework)' == 'net5.0' ">false</CheckEolTargetFramework>
+
     <NoWarn Label="Nested types should not be visible">$(NoWarn);CA1034</NoWarn>
     <NoWarn Label="Use Literals Where Appropriate">$(NoWarn);CA1802</NoWarn>
     <NoWarn Label="Do not ignore method results">$(NoWarn);CA1806</NoWarn>
@@ -90,5 +91,5 @@
     <!-- SonarCloud issues -->
     <NoWarn Label="Add at least one assertion to this test case">$(NoWarn);S2699</NoWarn>
   </PropertyGroup>
-  
+
 </Project>
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 513b30a..28ad38a 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -5,9 +5,9 @@
 # to you 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
@@ -55,7 +55,7 @@
 - name: BuildCounter
   value: $[counter(variables['VersionSuffix'],coalesce(variables['BuildCounterSeed'], 1250))]
 - name: DotNetSDKVersion
-  value: '7.0.100'
+  value: '8.0.204'
 - name: DocumentationArtifactName
   value: 'docs'
 - name: DocumentationArtifactZipFileName
@@ -63,7 +63,7 @@
 - name: WebsiteArtifactName
   value: 'website'
 - name: WebsiteArtifactZipFileName
-  value: 'website.zip'  
+  value: 'website.zip'
 - name: BinaryArtifactName
   value: 'testbinaries'
 - name: NuGetArtifactName
@@ -105,7 +105,7 @@
       PublishTempDirectory: '$(Build.ArtifactStagingDirectory)/publish'
 
     steps:
-    
+
     - checkout: self # self represents the repo where the initial Pipelines YAML file was found
       fetchDepth: '1'  # the depth of commits to ask Git to fetch
 
@@ -144,7 +144,7 @@
       displayName: 'PSake Build, Pack, and Publish'
 
     #- template: '.build/azure-templates/show-all-environment-variables.yml' # Uncomment for debugging
-        
+
     - pwsh: |
         $dir = '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)'
         if (!(Test-Path $dir)) { New-Item -ItemType Directory -Path "$dir" -Force }
@@ -195,15 +195,15 @@
           version.props
         TargetFolder: '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)'
       condition: and(succeeded(), eq(variables['IsRelease'], 'true'))
-            
+
     - task: PublishPipelineArtifact@1
       displayName: 'Publish Artifact: $(VersionArtifactName)'
       inputs:
         targetPath: '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)'
         artifact: '$(VersionArtifactName)'
         publishLocation: 'pipeline'
-    
-    # Copy the .pdb files as build artifacts, which will 
+
+    # Copy the .pdb files as build artifacts, which will
     # later be used to push to the Azure Artifacts symbol server.
     - task: CopyFiles@2
       displayName: 'Copy .pdb Files to: /$(DebugArtifactName)'
@@ -220,7 +220,7 @@
         artifact: '$(NuGetArtifactName)'
         publishLocation: 'pipeline'
       condition: and(succeeded(), ne(variables['RunPack'], 'false'))
-    
+
     - task: PublishPipelineArtifact@1
       displayName: 'Publish Artifact: $(DebugArtifactName)'
       inputs:
@@ -232,7 +232,7 @@
     - template: '.build/azure-templates/publish-test-binaries.yml'
       parameters:
         publishDirectory: $(PublishTempDirectory)
-        framework: 'net7.0'
+        framework: 'net8.0'
         binaryArtifactName: '$(BinaryArtifactName)'
         testSettingsFilePath: '$(Build.ArtifactStagingDirectory)/$(TestSettingsFileName)'
 
@@ -253,7 +253,7 @@
     - template: '.build/azure-templates/publish-test-binaries.yml'
       parameters:
         publishDirectory: $(PublishTempDirectory)
-        framework: 'net461'
+        framework: 'net472'
         binaryArtifactName: '$(BinaryArtifactName)'
         testSettingsFilePath: '$(Build.ArtifactStagingDirectory)/$(TestSettingsFileName)'
 
@@ -263,7 +263,7 @@
         framework: 'net48'
         binaryArtifactName: '$(BinaryArtifactName)'
         testSettingsFilePath: '$(Build.ArtifactStagingDirectory)/$(TestSettingsFileName)'
-        
+
   - job: Docs
     condition: and(succeeded(), eq(variables['GenerateDocs'], 'true'))
     pool:
@@ -325,7 +325,7 @@
   displayName: 'Test Stage:'
   jobs:
 
-  - job: Test_net7_0_x64
+  - job: Test_net8_0_x64
     condition: and(succeeded(), ne(variables['RunTests'], 'false'))
     strategy:
       matrix:
@@ -344,14 +344,14 @@
           imageName: 'macOS-latest'
           maximumParallelJobs: 7
           maximumAllowedFailures: 0 # Maximum allowed failures for a successful build
-    displayName: 'Test net7.0,x64 on'
+    displayName: 'Test net8.0,x64 on'
     pool:
       vmImage: $(imageName)
     steps:
     - template: '.build/azure-templates/run-tests-on-os.yml'
       parameters:
         osName: $(osName)
-        framework: 'net7.0'
+        framework: 'net8.0'
         vsTestPlatform: 'x64'
         testBinariesArtifactName: '$(TestBinariesArtifactName)'
         nugetArtifactName: '$(NuGetArtifactName)'
@@ -360,23 +360,23 @@
         maximumAllowedFailures: $(maximumAllowedFailures)
         dotNetSdkVersion: '$(DotNetSDKVersion)'
 
-  - job: Test_net7_0_x86 # Only run Nightly or if explicitly enabled with RunX86Tests
+  - job: Test_net8_0_x86 # Only run Nightly or if explicitly enabled with RunX86Tests
     condition: and(succeeded(), ne(variables['RunTests'], 'false'), or(eq(variables['IsNightly'], 'true'), eq(variables['RunX86Tests'], 'true')))
     strategy:
       matrix:
         Windows:
           osName: 'Windows'
-          imageName: 'windows-latest'
+          imageName: 'windows-2019'
           maximumParallelJobs: 8
           maximumAllowedFailures: 0 # Maximum allowed failures for a successful build
-    displayName: 'Test net7.0,x86 on'
+    displayName: 'Test net8.0,x86 on'
     pool:
       vmImage: $(imageName)
     steps:
     - template: '.build/azure-templates/run-tests-on-os.yml'
       parameters:
         osName: $(osName)
-        framework: 'net7.0'
+        framework: 'net8.0'
         vsTestPlatform: 'x86'
         testBinariesArtifactName: '$(TestBinariesArtifactName)'
         nugetArtifactName: '$(NuGetArtifactName)'
@@ -505,7 +505,7 @@
         maximumAllowedFailures: $(maximumAllowedFailures)
         dotNetSdkVersion: '$(DotNetSDKVersion)'
 
-  - job: Test_net461_x64
+  - job: Test_net472_x64
     condition: and(succeeded(), ne(variables['RunTests'], 'false'))
     strategy:
       matrix:
@@ -514,14 +514,14 @@
           imageName: 'windows-2019'
           maximumParallelJobs: 8
           maximumAllowedFailures: 0 # Maximum allowed failures for a successful build
-    displayName: 'Test net461,x64 on'
+    displayName: 'Test net472,x64 on'
     pool:
       vmImage: $(imageName)
     steps:
     - template: '.build/azure-templates/run-tests-on-os.yml'
       parameters:
         osName: $(osName)
-        framework: 'net461'
+        framework: 'net472'
         vsTestPlatform: 'x64'
         testBinariesArtifactName: '$(TestBinariesArtifactName)'
         nugetArtifactName: '$(NuGetArtifactName)'
@@ -530,7 +530,7 @@
         maximumAllowedFailures: $(maximumAllowedFailures)
         dotNetSdkVersion: '$(DotNetSDKVersion)'
 
-  - job: Test_net461_x86 # Only run Nightly or if explicitly enabled with RunX86Tests
+  - job: Test_net472_x86 # Only run Nightly or if explicitly enabled with RunX86Tests
     condition: and(succeeded(), ne(variables['RunTests'], 'false'), or(eq(variables['IsNightly'], 'true'), eq(variables['RunX86Tests'], 'true')))
     strategy:
       matrix:
@@ -539,14 +539,14 @@
           imageName: 'windows-2019'
           maximumParallelJobs: 8
           maximumAllowedFailures: 0 # Maximum allowed failures for a successful build
-    displayName: 'Test net461,x86 on'
+    displayName: 'Test net472,x86 on'
     pool:
       vmImage: $(imageName)
     steps:
     - template: '.build/azure-templates/run-tests-on-os.yml'
       parameters:
         osName: $(osName)
-        framework: 'net461'
+        framework: 'net472'
         vsTestPlatform: 'x86'
         testBinariesArtifactName: '$(TestBinariesArtifactName)'
         nugetArtifactName: '$(NuGetArtifactName)'
@@ -617,7 +617,7 @@
         targetPath: '$(System.DefaultWorkingDirectory)/$(VersionArtifactName)'
 
       # For debugging this pipeline
-    #- pwsh: | 
+    #- pwsh: |
     #    Get-ChildItem -Path $(System.DefaultWorkingDirectory)
     #    Get-ChildItem -Path '$(VersionArtifactName)'
 
@@ -665,7 +665,7 @@
       inputs:
         artifactName: '$(VersionArtifactName)'
         targetPath: '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)'
-        
+
     - template: '.build/azure-templates/show-all-files.yml' # Uncomment for debugging
 
       # NOTE: We are setting Build.BuildNumber here to the NuGet package version to work around the limitation that
@@ -744,4 +744,4 @@
       inputs:
         targetPath: '$(Build.ArtifactStagingDirectory)/$(ReleaseArtifactName)'
         artifact:  '$(ReleaseArtifactName)'
-        publishLocation: 'pipeline'
\ No newline at end of file
+        publishLocation: 'pipeline'
diff --git a/src/Lucene.Net.Analysis.OpenNLP/overview.md b/src/Lucene.Net.Analysis.OpenNLP/overview.md
index 882ddff..1667c7f 100644
--- a/src/Lucene.Net.Analysis.OpenNLP/overview.md
+++ b/src/Lucene.Net.Analysis.OpenNLP/overview.md
@@ -57,7 +57,7 @@
 ```xml
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
@@ -119,4 +119,4 @@
 > [!NOTE]
 > IKVM (and `<MavenReference>`) does not support Java SE higher than version 8. So it will not be possible to add a `<MavenReference>` to OpenNLP 2.x until support is added for it in IKVM.
 
-For a more complete example, see the [lucenenet-opennlp-mavenreference-demo](https://github.com/NightOwl888/lucenenet-opennlp-mavenreference-demo).
\ No newline at end of file
+For a more complete example, see the [lucenenet-opennlp-mavenreference-demo](https://github.com/NightOwl888/lucenenet-opennlp-mavenreference-demo).
diff --git a/src/Lucene.Net.Benchmark/ByTask/Utils/Format.cs b/src/Lucene.Net.Benchmark/ByTask/Utils/Format.cs
index e9903df..4161488 100644
--- a/src/Lucene.Net.Benchmark/ByTask/Utils/Format.cs
+++ b/src/Lucene.Net.Benchmark/ByTask/Utils/Format.cs
@@ -25,15 +25,15 @@
     public static class Formatter // LUCENENET specific - renamed from Format because of method name collision, CA1052 Static holder types should be Static or NotInheritable
     {
         private static readonly string[] numFormat = {
-            "N0",
-            "N1",
-            "N2"
+            "{0:N0}",
+            "{0:N1}",
+            "{0:N2}"
         };
 
         private const string padd = "                                                 ";
 
         /// <summary>
-        /// Padd a number from left.
+        /// Pad a number from left.
         /// </summary>
         /// <param name="numFracDigits">Number of digits in fraction part - must be 0 or 1 or 2.</param>
         /// <param name="f">Number to be formatted.</param>
diff --git a/src/Lucene.Net.Replicator/Lucene.Net.Replicator.csproj b/src/Lucene.Net.Replicator/Lucene.Net.Replicator.csproj
index d584846..9d721ac 100644
--- a/src/Lucene.Net.Replicator/Lucene.Net.Replicator.csproj
+++ b/src/Lucene.Net.Replicator/Lucene.Net.Replicator.csproj
@@ -28,7 +28,7 @@
   </PropertyGroup>
 
   <Import Project="$(SolutionDir).build/nuget.props" />
-  
+
   <PropertyGroup>
     <TargetFrameworks>net6.0;netstandard2.1;netstandard2.0;net462</TargetFrameworks>
 
@@ -38,7 +38,7 @@
     <NoWarn>$(NoWarn);1591;1573</NoWarn>
   </PropertyGroup>
 
-  
+
 
   <ItemGroup>
     <ProjectReference Include="..\Lucene.Net\Lucene.Net.csproj" />
diff --git a/src/Lucene.Net.Tests.AllProjects/Lucene.Net.Tests.AllProjects.csproj b/src/Lucene.Net.Tests.AllProjects/Lucene.Net.Tests.AllProjects.csproj
index 92056ba..8e92713 100644
--- a/src/Lucene.Net.Tests.AllProjects/Lucene.Net.Tests.AllProjects.csproj
+++ b/src/Lucene.Net.Tests.AllProjects/Lucene.Net.Tests.AllProjects.csproj
@@ -33,7 +33,7 @@
   <ItemGroup>
     <Compile Include="..\Lucene.Net.Tests\Support\ExceptionHandling\**\*.cs" LinkBase="Support\ExceptionHandling" />
   </ItemGroup>
-  
+
   <ItemGroup>
     <ProjectReference Include="..\dotnet\Lucene.Net.ICU\Lucene.Net.ICU.csproj">
       <SetTargetFramework>$(SetTargetFramework)</SetTargetFramework>
@@ -118,7 +118,7 @@
 
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net48' Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net48' Or $(TargetFramework.StartsWith('net6.')) Or $(TargetFramework.StartsWith('net7.')) Or $(TargetFramework.StartsWith('net8.')) ">
     <ProjectReference Include="..\Lucene.Net.Analysis.OpenNLP\Lucene.Net.Analysis.OpenNLP.csproj" />
   </ItemGroup>
 
diff --git a/src/Lucene.Net.Tests.Analysis.Common/Lucene.Net.Tests.Analysis.Common.csproj b/src/Lucene.Net.Tests.Analysis.Common/Lucene.Net.Tests.Analysis.Common.csproj
index 7e9dc8f..189bb7e 100644
--- a/src/Lucene.Net.Tests.Analysis.Common/Lucene.Net.Tests.Analysis.Common.csproj
+++ b/src/Lucene.Net.Tests.Analysis.Common/Lucene.Net.Tests.Analysis.Common.csproj
@@ -61,7 +61,7 @@
     <Reference Include="System.IO.Compression" />
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
     <Reference Include="System.IO.Compression" />
   </ItemGroup>
 
diff --git a/src/Lucene.Net.Tests.Analysis.Kuromoji/Lucene.Net.Tests.Analysis.Kuromoji.csproj b/src/Lucene.Net.Tests.Analysis.Kuromoji/Lucene.Net.Tests.Analysis.Kuromoji.csproj
index 671c042..77e0386 100644
--- a/src/Lucene.Net.Tests.Analysis.Kuromoji/Lucene.Net.Tests.Analysis.Kuromoji.csproj
+++ b/src/Lucene.Net.Tests.Analysis.Kuromoji/Lucene.Net.Tests.Analysis.Kuromoji.csproj
@@ -53,7 +53,7 @@
 
   <Import Project="$(SolutionDir).build/TestReferences.Common.targets" />
 
-  <ItemGroup Condition="'$(TargetFramework)' == 'net461' ">
+  <ItemGroup Condition="'$(TargetFramework)' == 'net472' ">
     <PackageReference Include="System.Text.Encoding.CodePages" Version="$(SystemTextEncodingCodePagesPackageVersion)" />
   </ItemGroup>
 
diff --git a/src/Lucene.Net.Tests.Analysis.OpenNLP/Lucene - Backup.Net.Tests.Analysis.OpenNLP.csproj b/src/Lucene.Net.Tests.Analysis.OpenNLP/Lucene - Backup.Net.Tests.Analysis.OpenNLP.csproj
deleted file mode 100644
index d880584..0000000
--- a/src/Lucene.Net.Tests.Analysis.OpenNLP/Lucene - Backup.Net.Tests.Analysis.OpenNLP.csproj
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you 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.
-
--->
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="$(SolutionDir)TestTargetFramework.props" />
-
-  <PropertyGroup>
-    <!-- Allow specific target framework to flow in from TestTargetFrameworks.props -->
-    <TargetFrameworks Condition=" '$(TargetFramework)' == '' ">net7.0;net6.0</TargetFrameworks>
-    <TargetFrameworks Condition=" '$(TargetFramework)' == '' AND $([MSBuild]::IsOsPlatform('Windows')) ">$(TargetFrameworks);net48</TargetFrameworks>
-    
-    <AssemblyTitle>Lucene.Net.Tests.Analysis.OpenNLP</AssemblyTitle>
-    <RootNamespace>Lucene.Net.Analysis.OpenNlp</RootNamespace>
-  </PropertyGroup>
-
-  <PropertyGroup Condition=" '$(TargetFramework)' == 'net461' Or $(TargetFramework.StartsWith('net5.')) ">
-    <!-- For CI, we don't publish the projects and exclude them from the test run by setting IsPublishable=false and IsTestProject=false -->
-    <IsPublishable>false</IsPublishable>
-    <IsTestProject>false</IsTestProject>
-    <!-- For the IDE, the above doesn't work. Redirect to a supported test framework instead. -->
-    <TargetFramework Condition=" $(TargetFramework.StartsWith('net5.')) ">net7.0</TargetFramework>
-    <TargetFramework Condition=" '$(TargetFramework)' == 'net461' ">net48</TargetFramework>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <EmbeddedResource Include="**/*.dict" Exclude="bin/**/*;obj/**/*" Label="Dict Test Data" />
-    <EmbeddedResource Include="**/*.bin" Exclude="bin/**/*;obj/**/*" Label="Bin Test Data" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\Lucene.Net.Analysis.Common\Lucene.Net.Analysis.Common.csproj" />
-    <ProjectReference Include="..\Lucene.Net.Analysis.OpenNLP\Lucene.Net.Analysis.OpenNLP.csproj" />
-    <ProjectReference Include="..\Lucene.Net.Codecs\Lucene.Net.Codecs.csproj" />
-    <ProjectReference Include="..\Lucene.Net.TestFramework\Lucene.Net.TestFramework.csproj" />
-  </ItemGroup>
-
-  <Import Project="$(SolutionDir).build/TestReferences.Common.targets" />
-
-</Project>
diff --git a/src/Lucene.Net.Tests.Analysis.OpenNLP/Lucene.Net.Tests.Analysis.OpenNLP.csproj b/src/Lucene.Net.Tests.Analysis.OpenNLP/Lucene.Net.Tests.Analysis.OpenNLP.csproj
index d880584..1ebe908 100644
--- a/src/Lucene.Net.Tests.Analysis.OpenNLP/Lucene.Net.Tests.Analysis.OpenNLP.csproj
+++ b/src/Lucene.Net.Tests.Analysis.OpenNLP/Lucene.Net.Tests.Analysis.OpenNLP.csproj
@@ -25,20 +25,21 @@
 
   <PropertyGroup>
     <!-- Allow specific target framework to flow in from TestTargetFrameworks.props -->
-    <TargetFrameworks Condition=" '$(TargetFramework)' == '' ">net7.0;net6.0</TargetFrameworks>
+    <TargetFrameworks Condition=" '$(TargetFramework)' == '' ">net8.0;net6.0</TargetFrameworks>
     <TargetFrameworks Condition=" '$(TargetFramework)' == '' AND $([MSBuild]::IsOsPlatform('Windows')) ">$(TargetFrameworks);net48</TargetFrameworks>
-    
+
     <AssemblyTitle>Lucene.Net.Tests.Analysis.OpenNLP</AssemblyTitle>
     <RootNamespace>Lucene.Net.Analysis.OpenNlp</RootNamespace>
   </PropertyGroup>
 
-  <PropertyGroup Condition=" '$(TargetFramework)' == 'net461' Or $(TargetFramework.StartsWith('net5.')) ">
+  <!-- NOTE: Technically, we can test on net472, but we don't want to publish net472 assemblies when we are testing netstandard2.0. -->
+  <PropertyGroup Condition=" '$(TargetFramework)' == 'net472' Or $(TargetFramework.StartsWith('net5.')) ">
     <!-- For CI, we don't publish the projects and exclude them from the test run by setting IsPublishable=false and IsTestProject=false -->
     <IsPublishable>false</IsPublishable>
     <IsTestProject>false</IsTestProject>
     <!-- For the IDE, the above doesn't work. Redirect to a supported test framework instead. -->
-    <TargetFramework Condition=" $(TargetFramework.StartsWith('net5.')) ">net7.0</TargetFramework>
-    <TargetFramework Condition=" '$(TargetFramework)' == 'net461' ">net48</TargetFramework>
+    <TargetFramework Condition=" $(TargetFramework.StartsWith('net5.')) ">net8.0</TargetFramework>
+    <TargetFramework Condition=" '$(TargetFramework)' == 'net472' ">net48</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/Lucene.Net.Tests.Analysis.SmartCn/Lucene.Net.Tests.Analysis.SmartCn.csproj b/src/Lucene.Net.Tests.Analysis.SmartCn/Lucene.Net.Tests.Analysis.SmartCn.csproj
index 0a45552..79d6f9a 100644
--- a/src/Lucene.Net.Tests.Analysis.SmartCn/Lucene.Net.Tests.Analysis.SmartCn.csproj
+++ b/src/Lucene.Net.Tests.Analysis.SmartCn/Lucene.Net.Tests.Analysis.SmartCn.csproj
@@ -63,7 +63,7 @@
     <PackageReference Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsOptionsPackageVersion)"/>
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
     <PackageReference Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsOptionsPackageVersion)"/>
     <PackageReference Include="System.Text.Encoding.CodePages" Version="$(SystemTextEncodingCodePagesPackageVersion)" />
   </ItemGroup>
diff --git a/src/Lucene.Net.Tests.Benchmark/Lucene.Net.Tests.Benchmark.csproj b/src/Lucene.Net.Tests.Benchmark/Lucene.Net.Tests.Benchmark.csproj
index 3763508..afca29a 100644
--- a/src/Lucene.Net.Tests.Benchmark/Lucene.Net.Tests.Benchmark.csproj
+++ b/src/Lucene.Net.Tests.Benchmark/Lucene.Net.Tests.Benchmark.csproj
@@ -91,7 +91,7 @@
     <PackageReference Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsOptionsPackageVersion)"/>
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
     <PackageReference Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsOptionsPackageVersion)"/>
   </ItemGroup>
 
diff --git a/src/Lucene.Net.Tests._J-S/Lucene.Net.Tests._J-S.csproj b/src/Lucene.Net.Tests._J-S/Lucene.Net.Tests._J-S.csproj
index 5811185..22b6666 100644
--- a/src/Lucene.Net.Tests._J-S/Lucene.Net.Tests._J-S.csproj
+++ b/src/Lucene.Net.Tests._J-S/Lucene.Net.Tests._J-S.csproj
@@ -77,7 +77,7 @@
     <PackageReference Include="System.Runtime.InteropServices.RuntimeInformation" Version="$(SystemRuntimeInteropServicesRuntimeInformationPackageVersion)" />
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
     <PackageReference Include="System.Runtime.InteropServices.RuntimeInformation" Version="$(SystemRuntimeInteropServicesRuntimeInformationPackageVersion)" />
   </ItemGroup>
   
diff --git a/src/Lucene.Net.Tests._T-Z/Lucene.Net.Tests._T-Z.csproj b/src/Lucene.Net.Tests._T-Z/Lucene.Net.Tests._T-Z.csproj
index b52b2e0..8075f02 100644
--- a/src/Lucene.Net.Tests._T-Z/Lucene.Net.Tests._T-Z.csproj
+++ b/src/Lucene.Net.Tests._T-Z/Lucene.Net.Tests._T-Z.csproj
@@ -77,7 +77,7 @@
     <PackageReference Include="System.Runtime.InteropServices.RuntimeInformation" Version="$(SystemRuntimeInteropServicesRuntimeInformationPackageVersion)" />
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
     <PackageReference Include="System.Runtime.InteropServices.RuntimeInformation" Version="$(SystemRuntimeInteropServicesRuntimeInformationPackageVersion)" />
   </ItemGroup>
   
diff --git a/src/dotnet/Lucene.Net.Replicator.AspNetCore/Lucene.Net.Replicator.AspNetCore.csproj b/src/dotnet/Lucene.Net.Replicator.AspNetCore/Lucene.Net.Replicator.AspNetCore.csproj
index 17fd672..946defd 100644
--- a/src/dotnet/Lucene.Net.Replicator.AspNetCore/Lucene.Net.Replicator.AspNetCore.csproj
+++ b/src/dotnet/Lucene.Net.Replicator.AspNetCore/Lucene.Net.Replicator.AspNetCore.csproj
@@ -25,7 +25,7 @@
   <!--<Import Project="$(SolutionDir).build/nuget.props" />-->
   
   <PropertyGroup>
-    <TargetFrameworks>net6.0;netstandard2.1;netstandard2.0;net461</TargetFrameworks>
+    <TargetFrameworks>net6.0;netstandard2.1;netstandard2.0;net462</TargetFrameworks>
 
     <AssemblyTitle>Lucene.Net.Replicator.AspNetCore</AssemblyTitle>
     <Description>AspNetCore integration of Lucene.Net.Replicator for the Lucene.Net full-text search engine library from The Apache Software Foundation.</Description>
diff --git a/src/dotnet/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj b/src/dotnet/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj
index 14d951c..94873e7 100644
--- a/src/dotnet/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj
+++ b/src/dotnet/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj
@@ -88,7 +88,7 @@
     <PackageReference Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsOptionsPackageVersion)" />
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
     <PackageReference Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsOptionsPackageVersion)" />
   </ItemGroup>
 
diff --git a/src/dotnet/tools/Lucene.Net.Tests.Cli/Lucene.Net.Tests.Cli.csproj b/src/dotnet/tools/Lucene.Net.Tests.Cli/Lucene.Net.Tests.Cli.csproj
index 9e9a010..012c832 100644
--- a/src/dotnet/tools/Lucene.Net.Tests.Cli/Lucene.Net.Tests.Cli.csproj
+++ b/src/dotnet/tools/Lucene.Net.Tests.Cli/Lucene.Net.Tests.Cli.csproj
@@ -18,14 +18,14 @@
  specific language governing permissions and limitations
  under the License.
 
--->  
+-->
 <Project Sdk="Microsoft.NET.Sdk">
 
   <Import Project="$(SolutionDir)TestTargetFramework.props" />
 
   <PropertyGroup>
     <!-- Allow specific target framework to flow in from TestTargetFrameworks.props -->
-    <TargetFrameworks Condition=" '$(TargetFramework)' == '' ">net7.0;net6.0</TargetFrameworks>
+    <TargetFrameworks Condition=" '$(TargetFramework)' == '' ">net8.0;net6.0</TargetFrameworks>
     <AssemblyTitle>Lucene.Net.Tests.Cli</AssemblyTitle>
   </PropertyGroup>
 
@@ -34,7 +34,7 @@
     <IsPublishable>false</IsPublishable>
     <IsTestProject>false</IsTestProject>
     <!-- For the IDE, the above doesn't work. Redirect to a supported test framework instead. -->
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/dotnet/tools/lucene-cli/.gitignore b/src/dotnet/tools/lucene-cli/.gitignore
new file mode 100644
index 0000000..49fa423
--- /dev/null
+++ b/src/dotnet/tools/lucene-cli/.gitignore
@@ -0,0 +1,2 @@
+work/
+
diff --git a/src/dotnet/tools/lucene-cli/docs/index.md b/src/dotnet/tools/lucene-cli/docs/index.md
index 7f9703a..8cf65c0 100644
--- a/src/dotnet/tools/lucene-cli/docs/index.md
+++ b/src/dotnet/tools/lucene-cli/docs/index.md
@@ -4,7 +4,7 @@
 
 ## Prerequisites
 
-- [.NET 6.0 Runtime or Higher](https://dotnet.microsoft.com/en-us/download/dotnet)
+- [.NET 6.0 Runtime or Higher](https://dotnet.microsoft.com/en-us/download/dotnet) (.NET 8.0 recommended)
 
 ## Installation
 
@@ -19,6 +19,14 @@
 
 You may then use the lucene-cli tool to analyze and update Lucene.NET indexes and use its demos.
 
+The CLI is configured to [roll-forward](https://learn.microsoft.com/en-us/dotnet/core/versions/selection#control-roll-forward-behavior)
+to the next available major version of .NET installed on your machine, if only a newer one than .NET 8 is found.
+You can control this behavior by setting the `DOTNET_ROLL_FORWARD` environment variable or `--roll-forward`
+command-line argument to `Disable` to prevent rolling forward, or `LatestMajor` to always use the latest
+available major version, before running the CLI tool.
+
+
+
 ## CLI Commands
 
 The following commands are installed:
diff --git a/src/dotnet/tools/lucene-cli/lucene-cli.csproj b/src/dotnet/tools/lucene-cli/lucene-cli.csproj
index a648450..21b398d 100644
--- a/src/dotnet/tools/lucene-cli/lucene-cli.csproj
+++ b/src/dotnet/tools/lucene-cli/lucene-cli.csproj
@@ -24,14 +24,14 @@
   <Import Project="$(SolutionDir).build/nuget.props" />
 
   <PropertyGroup>
-    <TargetFrameworks>net7.0;net6.0</TargetFrameworks>
-    <RollForward Condition=" $(TargetFramework.StartsWith('net7.')) ">Major</RollForward>
+    <TargetFrameworks>net8.0;net6.0</TargetFrameworks>
+    <RollForward Condition=" $(TargetFramework.StartsWith('net8.')) ">Major</RollForward>
 
     <IsPublishable>true</IsPublishable>
     <IsPublishable Condition="$(TargetFramework.StartsWith('net4'))">false</IsPublishable>
     <PackAsTool>true</PackAsTool>
     <ToolCommandName>lucene</ToolCommandName>
-    
+
     <AssemblyName>lucene-cli</AssemblyName>
     <OutputType>Exe</OutputType>
     <PackageId>lucene-cli</PackageId>
@@ -39,7 +39,7 @@
     <PackageTags>$(PackageTags);maintenance;utility</PackageTags>
     <PackageReadmeFile>readme.md</PackageReadmeFile>
     <DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
-    
+
     <NoWarn>$(NoWarn);1591;1573</NoWarn>
     <NoWarn Label="Nested types should not be visible">$(NoWarn);CA1034</NoWarn>
     <NoWarn Label="Remove unused parameter">$(NoWarn);IDE0060</NoWarn>