diff --git a/tools/run_tests/build_package_csharp_coreclr.sh b/src/csharp/build_packages_dotnetcli.sh
similarity index 68%
rename from tools/run_tests/build_package_csharp_coreclr.sh
rename to src/csharp/build_packages_dotnetcli.sh
index e1c363da50bfc1221589b936ec1ab665789c57f6..2807278de6d7bc3f6d879f6b5707208b7c33527b 100755
--- a/tools/run_tests/build_package_csharp_coreclr.sh
+++ b/src/csharp/build_packages_dotnetcli.sh
@@ -30,11 +30,9 @@
 
 set -ex
 
-cd $(dirname $0)/../..
+cd $(dirname $0)
 
-mkdir -p artifacts/
-
-cd src/csharp
+mkdir -p ../../artifacts/
 
 # IMPORTANT: NuGet packages generated by dotnet CLI are considered experimental.
 # The official nugets are generated by src/csharp/build_packages.bat
@@ -43,6 +41,11 @@ mkdir -p nativelibs/windows_x86 nativelibs/windows_x64 \
     nativelibs/linux_x86 nativelibs/linux_x64 \
     nativelibs/macosx_x86 nativelibs/macosx_x64
 
+mkdir -p protoc_plugins/windows_x86 protoc_plugins/windows_x64 \
+    protoc_plugins/linux_x86 protoc_plugins/linux_x64 \
+    protoc_plugins/macosx_x86 protoc_plugins/macosx_x64
+
+# Collect the artifacts built by the previous build step if running on Jenkins
 cp $EXTERNAL_GIT_ROOT/architecture=x86,language=csharp,platform=windows/artifacts/* nativelibs/windows_x86 || true
 cp $EXTERNAL_GIT_ROOT/architecture=x64,language=csharp,platform=windows/artifacts/* nativelibs/windows_x64 || true
 cp $EXTERNAL_GIT_ROOT/architecture=x86,language=csharp,platform=linux/artifacts/* nativelibs/linux_x86 || true
@@ -50,10 +53,21 @@ cp $EXTERNAL_GIT_ROOT/architecture=x64,language=csharp,platform=linux/artifacts/
 cp $EXTERNAL_GIT_ROOT/architecture=x86,language=csharp,platform=macos/artifacts/* nativelibs/macosx_x86 || true
 cp $EXTERNAL_GIT_ROOT/architecture=x64,language=csharp,platform=macos/artifacts/* nativelibs/macosx_x64 || true
 
+# Collect protoc artifacts built by the previous build step
+cp $EXTERNAL_GIT_ROOT/architecture=x86,language=protoc,platform=windows/artifacts/* protoc_plugins/windows_x86 || true
+cp $EXTERNAL_GIT_ROOT/architecture=x64,language=protoc,platform=windows/artifacts/* protoc_plugins/windows_x64 || true
+cp $EXTERNAL_GIT_ROOT/architecture=x86,language=protoc,platform=linux/artifacts/* protoc_plugins/linux_x86 || true
+cp $EXTERNAL_GIT_ROOT/architecture=x64,language=protoc,platform=linux/artifacts/* protoc_plugins/linux_x64 || true
+cp $EXTERNAL_GIT_ROOT/architecture=x86,language=protoc,platform=macos/artifacts/* protoc_plugins/macosx_x86 || true
+cp $EXTERNAL_GIT_ROOT/architecture=x64,language=protoc,platform=macos/artifacts/* protoc_plugins/macosx_x64 || true
+
 dotnet restore .
 
 dotnet pack --configuration Release Grpc.Core/project.json --output ../../artifacts
 dotnet pack --configuration Release Grpc.Auth/project.json --output ../../artifacts
 dotnet pack --configuration Release Grpc.HealthCheck/project.json --output ../../artifacts
 
-tar -czf ../../artifacts/csharp_nugets_experimental.tar.gz ../../artifacts/*.nupkg
+nuget pack Grpc.nuspec -Version "1.1.0-dev" -OutputDirectory ../../artifacts
+nuget pack Grpc.Tools.nuspec -Version "1.1.0-dev" -OutputDirectory ../../artifacts
+
+(cd ../../artifacts && zip csharp_nugets_dotnetcli.zip *.nupkg)
diff --git a/templates/src/csharp/build_packages_dotnetcli.sh.template b/templates/src/csharp/build_packages_dotnetcli.sh.template
new file mode 100755
index 0000000000000000000000000000000000000000..b8e40a090be748af9b380d3fe12ab59dfe787d31
--- /dev/null
+++ b/templates/src/csharp/build_packages_dotnetcli.sh.template
@@ -0,0 +1,75 @@
+%YAML 1.2
+--- |
+  #!/bin/bash
+  # Copyright 2016, Google Inc.
+  # All rights reserved.
+  #
+  # Redistribution and use in source and binary forms, with or without
+  # modification, are permitted provided that the following conditions are
+  # met:
+  #
+  #     * Redistributions of source code must retain the above copyright
+  # notice, this list of conditions and the following disclaimer.
+  #     * Redistributions in binary form must reproduce the above
+  # copyright notice, this list of conditions and the following disclaimer
+  # in the documentation and/or other materials provided with the
+  # distribution.
+  #     * Neither the name of Google Inc. nor the names of its
+  # contributors may be used to endorse or promote products derived from
+  # this software without specific prior written permission.
+  #
+  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  
+  set -ex
+  
+  cd $(dirname $0)
+  
+  mkdir -p ../../artifacts/
+  
+  # IMPORTANT: NuGet packages generated by dotnet CLI are considered experimental.
+  # The official nugets are generated by src/csharp/build_packages.bat
+  
+  mkdir -p nativelibs/windows_x86 nativelibs/windows_x64 ${"\\"}
+      nativelibs/linux_x86 nativelibs/linux_x64 ${"\\"}
+      nativelibs/macosx_x86 nativelibs/macosx_x64
+  
+  mkdir -p protoc_plugins/windows_x86 protoc_plugins/windows_x64 ${"\\"}
+      protoc_plugins/linux_x86 protoc_plugins/linux_x64 ${"\\"}
+      protoc_plugins/macosx_x86 protoc_plugins/macosx_x64
+  
+  # Collect the artifacts built by the previous build step if running on Jenkins
+  cp $EXTERNAL_GIT_ROOT/architecture=x86,language=csharp,platform=windows/artifacts/* nativelibs/windows_x86 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x64,language=csharp,platform=windows/artifacts/* nativelibs/windows_x64 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x86,language=csharp,platform=linux/artifacts/* nativelibs/linux_x86 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x64,language=csharp,platform=linux/artifacts/* nativelibs/linux_x64 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x86,language=csharp,platform=macos/artifacts/* nativelibs/macosx_x86 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x64,language=csharp,platform=macos/artifacts/* nativelibs/macosx_x64 || true
+  
+  # Collect protoc artifacts built by the previous build step
+  cp $EXTERNAL_GIT_ROOT/architecture=x86,language=protoc,platform=windows/artifacts/* protoc_plugins/windows_x86 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x64,language=protoc,platform=windows/artifacts/* protoc_plugins/windows_x64 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x86,language=protoc,platform=linux/artifacts/* protoc_plugins/linux_x86 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x64,language=protoc,platform=linux/artifacts/* protoc_plugins/linux_x64 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x86,language=protoc,platform=macos/artifacts/* protoc_plugins/macosx_x86 || true
+  cp $EXTERNAL_GIT_ROOT/architecture=x64,language=protoc,platform=macos/artifacts/* protoc_plugins/macosx_x64 || true
+  
+  dotnet restore .
+  
+  dotnet pack --configuration Release Grpc.Core/project.json --output ../../artifacts
+  dotnet pack --configuration Release Grpc.Auth/project.json --output ../../artifacts
+  dotnet pack --configuration Release Grpc.HealthCheck/project.json --output ../../artifacts
+  
+  nuget pack Grpc.nuspec -Version "${settings.csharp_version}" -OutputDirectory ../../artifacts
+  nuget pack Grpc.Tools.nuspec -Version "${settings.csharp_version}" -OutputDirectory ../../artifacts
+  
+  (cd ../../artifacts && zip csharp_nugets_dotnetcli.zip *.nupkg)
diff --git a/tools/run_tests/package_targets.py b/tools/run_tests/package_targets.py
index 8217d7698af5062f8cde89c527ee39870841e041..14d30cf06d61b903caee745d648081444e2d524a 100644
--- a/tools/run_tests/package_targets.py
+++ b/tools/run_tests/package_targets.py
@@ -71,11 +71,11 @@ def create_jobspec(name, cmdline, environ=None, cwd=None, shell=False,
 class CSharpPackage:
   """Builds C# nuget packages."""
 
-  def __init__(self, use_coreclr=False):
-    self.use_coreclr = use_coreclr
-    self.name = 'csharp_package_coreclr' if use_coreclr else 'csharp_package'
+  def __init__(self, use_dotnet_cli=False):
+    self.use_dotnet_cli = use_dotnet_cli
+    self.name = 'csharp_package_dotnetcli' if use_dotnet_cli else 'csharp_package'
     self.labels = ['package', 'csharp']
-    if use_coreclr:
+    if use_dotnet_cli:
       self.labels += ['linux']
     else:
       self.labels += ['windows']
@@ -91,11 +91,11 @@ class CSharpPackage:
       return []
 
   def build_jobspec(self):
-    if self.use_coreclr:
+    if self.use_dotnet_cli:
       return create_docker_jobspec(
           self.name,
           'tools/dockerfile/test/csharp_coreclr_x64',
-          'tools/run_tests/build_package_csharp_coreclr.sh')
+          'src/csharp/build_packages_dotnetcli.sh')
     else:
       return create_jobspec(self.name,
                             ['build_packages.bat'],
@@ -177,7 +177,7 @@ class PHPPackage:
 def targets():
   """Gets list of supported targets"""
   return [CSharpPackage(),
-          CSharpPackage(use_coreclr=True),
+          CSharpPackage(use_dotnet_cli=True),
           NodePackage(),
           RubyPackage(),
           PythonPackage(),