diff --git a/build/build.ps1 b/build/build.ps1
index bd6fcf2..95612d2 100644
--- a/build/build.ps1
+++ b/build/build.ps1
@@ -184,8 +184,8 @@
 }
 
 # Loops through each framework in the TestTargetFrameworks variable and
-# publishes the project in the artifact staging directory with the framework
-# and project name as part of the folder structure.
+# publishes the solution in the artifact staging directory with the framework
+# as part of the folder structure.
 task Publish -depends Compile -description "This task uses dotnet publish to package the binaries with all of their dependencies so they can be run xplat" {
     Write-Host "##teamcity[progressMessage 'Publishing']"
     Write-Host "##vso[task.setprogress]'Publishing'"
@@ -200,58 +200,43 @@
         }
         
         foreach ($framework in $frameworksToTest) {
-            $testProjects = Get-ChildItem -Path "$source_directory/**/*.csproj" -Recurse | ? { $_.Directory.Name.Contains(".Tests") } | Select -ExpandProperty FullName
-            foreach ($testProject in $testProjects) {
-                # Pause if we have queued too many parallel jobs
-                $running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
-                if ($running.Count -ge $maximumParalellJobs) {
-                    $running | Wait-Job -Any | Out-Null
-                }
 
-                $projectName = [System.IO.Path]::GetFileNameWithoutExtension($testProject)
+            # Pause if we have queued too many parallel jobs
+            #$running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
+            #if ($running.Count -ge $maximumParalellJobs) {
+            #    $running | Wait-Job -Any | Out-Null
+            #}
 
-                # Special case - our CLI tool only supports .NET Core 3.1
-                if ($projectName.Contains("Tests.Cli") -and (!$framework.StartsWith("netcoreapp3.1"))) {
-                    continue
-                }
+            $logPath = "$outDirectory/$framework"
+            $outputPath = "$logPath"
 
-                # Special case - OpenNLP.NET only supports .NET Framework
-                if ($projectName.Contains("Tests.Analysis.OpenNLP") -and (!$framework.StartsWith("net4"))) {
-                    continue
-                }
+            # Do this first so there is no conflict
+            Ensure-Directory-Exists $outputPath
+            
+            Write-Host "Configuration: $configuration"
+            
+            dotnet publish "$solutionFile" --output "$outputPath" --framework "$framework" --configuration "$configuration" --no-build --no-restore --verbosity Normal /p:TestFrameworks=true /p:Platform="$platform"
 
-                # Special case - Morfologik doesn't support .NET Standard 1.x
-                if ($projectName.Contains("Tests.Analysis.Morfologik") -and ($framework.StartsWith("netcoreapp1."))) {
-                    continue
-                }
+            #$scriptBlock = {
+            #    param([string]$solutionFile, [string]$outputPath, [string]$logPath, [string]$framework, [string]$configuration)
+            #    Write-Host "Publishing '$solutionFile' on '$framework' to '$outputPath'..."
+            #    # Note: Cannot use Psake Exec in background
+            #    dotnet publish "$solutionFile" --output "$outputPath" --framework "$framework" --configuration "$configuration" --no-build --no-restore --verbosity Normal /p:TestFrameworks=true /p:Platform="$platform" > "$logPath/dotnet-publish.log" 2> "$logPath/dotnet-publish-error.log"
+            #}
 
-                $logPath = "$outDirectory/$framework"
-                $outputPath = "$logPath/$projectName"
-
-                # Do this first so there is no conflict
-                Ensure-Directory-Exists $outputPath
-
-                $scriptBlock = {
-                    param([string]$testProject, [string]$outputPath, [string]$logPath, [string]$framework, [string]$configuration, [string]$projectName)
-                    Write-Host "Publishing '$testProject' on '$framework' to '$outputPath'..."
-                    # Note: Cannot use Psake Exec in background
-                    dotnet publish "$testProject" --output "$outputPath" --framework "$framework" --configuration "$configuration" --no-build --no-restore --verbosity Detailed /p:TestFrameworks=true /p:Platform="$platform" > "$logPath/$projectName-dotnet-publish.log" 2> "$logPath/$projectName-dotnet-publish-error.log"
-                }
-
-                # Execute the jobs in parallel
-                Start-Job $scriptBlock -ArgumentList $testProject,$outputPath,$logPath,$framework,$configuration,$projectName
-            }
+            # Execute the jobs in parallel
+            #Start-Job $scriptBlock -ArgumentList $solutionFile,$outputPath,$logPath,$framework,$configuration
         }
 
         # Wait for it all to complete
-        do {
-            $running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
-            if ($running.Count -gt 0) {
-                Write-Host ""
-                Write-Host "  Almost finished, only $($running.Count) projects left to publish..." -ForegroundColor Cyan
-                $running | Wait-Job -Any | Out-Null
-            }
-        } until ($running.Count -eq 0)
+        #do {
+        #    $running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
+        #    if ($running.Count -gt 0) {
+        #        Write-Host ""
+        #        Write-Host "  Almost finished, only $($running.Count) projects left to publish..." -ForegroundColor Cyan
+        #        $running | Wait-Job -Any | Out-Null
+        #    }
+        #} until ($running.Count -eq 0)
 
         # Getting the information back from the jobs (time consuming)
         #Get-Job | Receive-Job
