build signed assemblies
diff --git a/csharp/buildall.sh b/csharp/buildall.sh
index d903c1c..45af705 100755
--- a/csharp/buildall.sh
+++ b/csharp/buildall.sh
@@ -6,7 +6,6 @@
 
 # The rest you can leave intact
 CONFIG=Release
-KEYFILE=../keys/Google.Protobuf.snk  # TODO(jtattermusch): signing!
 SRC=$(dirname $0)/src
 
 set -ex
diff --git a/csharp/keys/Google.Protobuf.public.snk b/csharp/keys/Google.Protobuf.public.snk
new file mode 100644
index 0000000..59cd369
--- /dev/null
+++ b/csharp/keys/Google.Protobuf.public.snk
Binary files differ
diff --git a/csharp/keys/Google.Protobuf.snk b/csharp/keys/Google.Protobuf.snk
deleted file mode 100644
index 6bbfc90..0000000
--- a/csharp/keys/Google.Protobuf.snk
+++ /dev/null
Binary files differ
diff --git a/csharp/keys/README.md b/csharp/keys/README.md
new file mode 100644
index 0000000..1a01419
--- /dev/null
+++ b/csharp/keys/README.md
@@ -0,0 +1,5 @@
+Contents
+--------
+
+- Google.Protobuf.public.snk:
+  Public key to verify strong name of Google.Protobuf assemblies.
\ No newline at end of file
diff --git a/csharp/keys/generate_new_key.bat b/csharp/keys/generate_new_key.bat
deleted file mode 100644
index 6af599a..0000000
--- a/csharp/keys/generate_new_key.bat
+++ /dev/null
@@ -1,13 +0,0 @@
-@ECHO OFF

-IF EXIST "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe" GOTO FOUND

-goto USEPATH

-

-:FOUND

-"C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe" -k %~dp0\Google.Protobuf.snk 

-GOTO EXIT

-

-:USEPATH

-sn.exe -k %~dp0\Google.Protobuf.snk 

-GOTO EXIT

-

-:EXIT
\ No newline at end of file
diff --git a/csharp/src/AddressBook/AddressBook.csproj b/csharp/src/AddressBook/AddressBook.csproj
index 8f8ca7e..39df2bd 100644
--- a/csharp/src/AddressBook/AddressBook.csproj
+++ b/csharp/src/AddressBook/AddressBook.csproj
@@ -41,6 +41,20 @@
     <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

     <Prefer32Bit>false</Prefer32Bit>

   </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSigned|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\ReleaseSigned</OutputPath>

+    <IntermediateOutputPath>obj\ReleaseSigned\</IntermediateOutputPath>

+    <DefineConstants>TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+    <SignAssembly>True</SignAssembly>

+    <AssemblyOriginatorKeyFile>C:\keys\Google.Protobuf.snk</AssemblyOriginatorKeyFile>

+  </PropertyGroup>

   <ItemGroup>

     <Reference Include="mscorlib" />

     <Reference Include="System" />

diff --git a/csharp/src/AddressBook/Properties/AssemblyInfo.cs b/csharp/src/AddressBook/Properties/AssemblyInfo.cs
index e9c40dc..65e2f9c 100644
--- a/csharp/src/AddressBook/Properties/AssemblyInfo.cs
+++ b/csharp/src/AddressBook/Properties/AssemblyInfo.cs
@@ -10,7 +10,7 @@
 [assembly: AssemblyConfiguration("")]

 [assembly: AssemblyCompany("")]

 [assembly: AssemblyProduct("AddressBook")]

-[assembly: AssemblyCopyright("Copyright ©  2008")]

+[assembly: AssemblyCopyright("Copyright ©  2015")]

 [assembly: AssemblyTrademark("")]

 [assembly: AssemblyCulture("")]

 

@@ -25,5 +25,5 @@
 // by using the '*' as shown below:

 // [assembly: AssemblyVersion("2.4.1.555")]

 

-[assembly: AssemblyVersion("2.4.1.555")]

-[assembly: AssemblyFileVersion("2.4.1.555")]
\ No newline at end of file
+[assembly: AssemblyVersion("3.0.0.1")]

+[assembly: AssemblyFileVersion("3.0.0.1")]
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj b/csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj
index ede1f77..233bd0a 100644
--- a/csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj
+++ b/csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj
@@ -40,6 +40,20 @@
     <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

     <Prefer32Bit>false</Prefer32Bit>

   </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSigned|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\ReleaseSigned</OutputPath>

+    <IntermediateOutputPath>obj\ReleaseSigned\</IntermediateOutputPath>

+    <DefineConstants>TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+    <SignAssembly>True</SignAssembly>

+    <AssemblyOriginatorKeyFile>C:\keys\Google.Protobuf.snk</AssemblyOriginatorKeyFile>

+  </PropertyGroup>

   <ItemGroup>

     <Reference Include="mscorlib" />

     <Reference Include="System" />

diff --git a/csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs
index a8ce8ea..126db6b 100644
--- a/csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs
+++ b/csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs
@@ -11,7 +11,7 @@
 [assembly: AssemblyConfiguration("")]

 [assembly: AssemblyCompany("")]

 [assembly: AssemblyProduct("ProtoDump")]

-[assembly: AssemblyCopyright("Copyright ©  2009")]

+[assembly: AssemblyCopyright("Copyright ©  2015")]

 [assembly: AssemblyTrademark("")]

 [assembly: AssemblyCulture("")]

 

@@ -26,5 +26,5 @@
 // by using the '*' as shown below:

 // [assembly: AssemblyVersion("2.4.1.555")]

 

-[assembly: AssemblyVersion("2.4.1.555")]

-[assembly: AssemblyFileVersion("2.4.1.555")]
\ No newline at end of file
+[assembly: AssemblyVersion("3.0.0.1")]

+[assembly: AssemblyFileVersion("3.0.0.1")]
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj b/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
index eb6d396..5805f49 100644
--- a/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
+++ b/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
@@ -45,6 +45,20 @@
     <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

     <Prefer32Bit>false</Prefer32Bit>

   </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSigned|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\ReleaseSigned</OutputPath>

+    <IntermediateOutputPath>obj\ReleaseSigned\</IntermediateOutputPath>

+    <DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+    <SignAssembly>True</SignAssembly>

+    <AssemblyOriginatorKeyFile>C:\keys\Google.Protobuf.snk</AssemblyOriginatorKeyFile>

+  </PropertyGroup>

   <ItemGroup>

     <Reference Include="mscorlib" />

     <Reference Include="nunit.core, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">

diff --git a/csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs
index b551388..197ea80 100644
--- a/csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs
+++ b/csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs
@@ -12,7 +12,7 @@
 [assembly: AssemblyConfiguration("")]

 [assembly: AssemblyCompany("")]

 [assembly: AssemblyProduct("Google.Protobuf.Test")]

-[assembly: AssemblyCopyright("Copyright �  2008")]

+[assembly: AssemblyCopyright("Copyright ©  2015")]

 [assembly: AssemblyTrademark("")]

 [assembly: AssemblyCulture("")]

 

@@ -27,4 +27,4 @@
 // by using the '*' as shown below:

 // [assembly: AssemblyVersion("2.4.1.555")]

 

-[assembly: AssemblyVersion("2.4.1.555")]

+[assembly: AssemblyVersion("3.0.0.1")]

diff --git a/csharp/src/Google.Protobuf.sln b/csharp/src/Google.Protobuf.sln
index a290ae8..85f2bd4 100644
--- a/csharp/src/Google.Protobuf.sln
+++ b/csharp/src/Google.Protobuf.sln
@@ -1,6 +1,6 @@
 Microsoft Visual Studio Solution File, Format Version 12.00

-# Visual Studio 14

-VisualStudioVersion = 14.0.22823.1

+# Visual Studio 2013

+VisualStudioVersion = 12.0.31101.0

 MinimumVisualStudioVersion = 10.0.40219.1

 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf", "Google.Protobuf\Google.Protobuf.csproj", "{6908BDCE-D925-43F3-94AC-A531E6DF2591}"

 EndProject

@@ -14,24 +14,33 @@
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

 		Debug|Any CPU = Debug|Any CPU

 		Release|Any CPU = Release|Any CPU

+		ReleaseSigned|Any CPU = ReleaseSigned|Any CPU

 	EndGlobalSection

 	GlobalSection(ProjectConfigurationPlatforms) = postSolution

 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.Build.0 = Debug|Any CPU

 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.ActiveCfg = Release|Any CPU

 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.Build.0 = Release|Any CPU

+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.ReleaseSigned|Any CPU.ActiveCfg = ReleaseSigned|Any CPU

+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.ReleaseSigned|Any CPU.Build.0 = ReleaseSigned|Any CPU

 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU

 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU

 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU

+		{DD01ED24-3750-4567-9A23-1DB676A15610}.ReleaseSigned|Any CPU.ActiveCfg = ReleaseSigned|Any CPU

+		{DD01ED24-3750-4567-9A23-1DB676A15610}.ReleaseSigned|Any CPU.Build.0 = ReleaseSigned|Any CPU

 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.Build.0 = Debug|Any CPU

 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.ActiveCfg = Release|Any CPU

 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.Build.0 = Release|Any CPU

+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.ReleaseSigned|Any CPU.ActiveCfg = ReleaseSigned|Any CPU

+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.ReleaseSigned|Any CPU.Build.0 = ReleaseSigned|Any CPU

 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.Build.0 = Debug|Any CPU

 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.ActiveCfg = Release|Any CPU

 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.Build.0 = Release|Any CPU

+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.ReleaseSigned|Any CPU.ActiveCfg = ReleaseSigned|Any CPU

+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.ReleaseSigned|Any CPU.Build.0 = ReleaseSigned|Any CPU

 	EndGlobalSection

 	GlobalSection(SolutionProperties) = preSolution

 		HideSolutionNode = FALSE

diff --git a/csharp/src/Google.Protobuf/Google.Protobuf.csproj b/csharp/src/Google.Protobuf/Google.Protobuf.csproj
index c7038eb..2784d9b 100644
--- a/csharp/src/Google.Protobuf/Google.Protobuf.csproj
+++ b/csharp/src/Google.Protobuf/Google.Protobuf.csproj
@@ -46,6 +46,21 @@
     <NoStdLib>true</NoStdLib>

     <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

   </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSigned|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\ReleaseSigned</OutputPath>

+    <IntermediateOutputPath>obj\ReleaseSigned\</IntermediateOutputPath>

+    <DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>

+    <NoWarn>1591, 1570, 1571, 1572, 1573, 1574</NoWarn>

+    <DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate);SIGNED</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <SignAssembly>True</SignAssembly>

+    <AssemblyOriginatorKeyFile>C:\keys\Google.Protobuf.snk</AssemblyOriginatorKeyFile>

+  </PropertyGroup>

   <ItemGroup>

     <Reference Include="mscorlib" />

     <Reference Include="System" />

diff --git a/csharp/src/Google.Protobuf/Google.Protobuf.nuspec b/csharp/src/Google.Protobuf/Google.Protobuf.nuspec
index 09ec5cf..fcfe410 100644
--- a/csharp/src/Google.Protobuf/Google.Protobuf.nuspec
+++ b/csharp/src/Google.Protobuf/Google.Protobuf.nuspec
@@ -5,20 +5,20 @@
     <title>Google Protocol Buffers C#</title>
     <summary>C# runtime library for Protocol Buffers - Google's data interchange format.</summary>
     <description>See project site for more info.</description>
-    <version>3.0.0-beta*</version>
+    <version>3.0.0-alpha4</version>
     <authors>Google Inc.</authors>
     <owners>protobuf-packages</owners>
     <licenseUrl>https://github.com/google/protobuf/blob/master/LICENSE</licenseUrl>
     <projectUrl>https://github.com/google/protobuf</projectUrl>
     <requireLicenseAcceptance>false</requireLicenseAcceptance>
-    <releaseNotes>Experimental version of C# Protocol Buffers</releaseNotes>
+    <releaseNotes>C# Protocol Buffers</releaseNotes>
     <copyright>Copyright 2015, Google Inc.</copyright>
     <tags>Protocol Buffers Binary Serialization Format Google proto proto3</tags>
   </metadata>
   <files>
-    <file src="bin/Release/Google.Protobuf.dll" target="lib/portable-net45+netcore45+wpa81+wp8" />
-	<file src="bin/Release/Google.Protobuf.pdb" target="lib/portable-net45+netcore45+wpa81+wp8" />
-	<file src="bin/Release/Google.Protobuf.xml" target="lib/portable-net45+netcore45+wpa81+wp8" />
+    <file src="bin/ReleaseSigned/Google.Protobuf.dll" target="lib/portable-net45+netcore45+wpa81+wp8" />
+	<file src="bin/ReleaseSigned/Google.Protobuf.pdb" target="lib/portable-net45+netcore45+wpa81+wp8" />
+	<file src="bin/ReleaseSigned/Google.Protobuf.xml" target="lib/portable-net45+netcore45+wpa81+wp8" />
 	<file src="**\*.cs" target="src" />
   </files>
 </package>
diff --git a/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
index a957e8b..c1bca8d 100644
--- a/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
+++ b/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
@@ -42,7 +42,7 @@
 [assembly: AssemblyConfiguration("")]

 [assembly: AssemblyCompany("")]

 [assembly: AssemblyProduct("Google.Protobuf")]

-[assembly: AssemblyCopyright("Copyright ©  2008")]

+[assembly: AssemblyCopyright("Copyright ©  2015")]

 [assembly: AssemblyTrademark("")]

 [assembly: AssemblyCulture("")]

 

@@ -59,14 +59,18 @@
 

 [assembly: AssemblyVersion("2.4.1.555")]

 

+#if SIGNED

 [assembly: InternalsVisibleTo("Google.Protobuf.Test, PublicKey=" +

-    "00240000048000009400000006020000002400005253413100040000110000003b4611704c5379" +

-    "39c3e0fbe9447dd6fa5462507f9dd4fd9fbf0712457e415b037da6d2c4eb5d2c7d29c86380af68" +

-    "7cf400401bb183f2a70bd3b631c1fcb7db8aa66c766694a9fb53fa765df6303104da8c978f3b6d" +

-    "53909cd30685b8bc9922c726cd82b5995e9e2cfca6df7a2d189d851492e49f4b76f269ce6dfd08" +

-    "c34a7d98")]

+    "002400000480000094000000060200000024000052534131000400000100010025800fbcfc63a1" +

+    "7c66b303aae80b03a6beaa176bb6bef883be436f2a1579edd80ce23edf151a1f4ced97af83abcd" +

+    "981207041fd5b2da3b498346fcfcd94910d52f25537c4a43ce3fbe17dc7d43e6cbdb4d8f1242dc" +

+    "b6bd9b5906be74da8daa7d7280f97130f318a16c07baf118839b156299a48522f9fae2371c9665" +

+    "c5ae9cb6")]

+#else

+[assembly: InternalsVisibleTo("Google.Protobuf.Test")]

+#endif

 

 #if !NOFILEVERSION

-[assembly: AssemblyFileVersion("2.4.1.555")]

+[assembly: AssemblyFileVersion("3.0.0.1")]

 #endif