diff --git a/ClassicalSharp.csproj b/ClassicalSharp.csproj
new file mode 100644
index 000000000..0c126b434
--- /dev/null
+++ b/ClassicalSharp.csproj
@@ -0,0 +1,253 @@
+
+
+
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}
+ Debug
+ AnyCPU
+ Exe
+ ClassicalSharp
+ ClassicalSharp
+ v2.0
+ Properties
+ True
+ False
+ 4
+ False
+
+
+
+
+
+ 3.5
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+ False
+ False
+ obj\$(Configuration)\
+
+
+ x86
+ False
+ Auto
+ 4194304
+ 4096
+
+
+ output\debug\
+ true
+ Full
+ False
+ False
+ DEBUG;TRACE
+ Project
+ wwwf 127.0.0.1 25565
+ obj\
+
+
+ output\release\
+ false
+ None
+ True
+ False
+ TRACE
+
+
+
+
+ Ionic.Zip.Reduced.dll
+
+
+ OpenTK.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+ Microsoft .NET Framework 4 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+ False
+ Windows Installer 3.1
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Launcher2/Launcher2.csproj b/Launcher2/Launcher2.csproj
index 88d79d296..59cd6c864 100644
--- a/Launcher2/Launcher2.csproj
+++ b/Launcher2/Launcher2.csproj
@@ -75,6 +75,7 @@
+
diff --git a/Launcher2/Utils/JSON.cs b/Launcher2/Utils/JSON.cs
new file mode 100644
index 000000000..f65e70fe9
--- /dev/null
+++ b/Launcher2/Utils/JSON.cs
@@ -0,0 +1,229 @@
+//-----------------------------------------------------------------------
+//
+// Copyright ( c ) 2011, The Outercurve Foundation.
+//
+// Licensed under the MIT License ( 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.opensource.org/licenses/mit-license.php
+//
+// 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.
+//
+// Nathan Totten ( ntotten.com ), Jim Zimmerman ( jimzimmerman.com ) and Prabir Shrestha ( prabir.me )
+// https://github.com/facebook-csharp-sdk/simple-json
+//-----------------------------------------------------------------------
+// original json parsing code from http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Text;
+
+namespace SimpleJson {
+
+ public static class SimpleJson {
+ const int TOKEN_NONE = 0, TOKEN_CURLY_OPEN = 1, TOKEN_CURLY_CLOSE = 2;
+ const int TOKEN_SQUARED_OPEN = 3, TOKEN_SQUARED_CLOSE = 4, TOKEN_COLON = 5;
+ const int TOKEN_COMMA = 6, TOKEN_STRING = 7, TOKEN_NUMBER = 8;
+ const int TOKEN_TRUE = 9, TOKEN_FALSE = 10, TOKEN_NULL = 11;
+
+ static Dictionary ParseObject( char[] json, ref int index, ref bool success ) {
+ Dictionary table = new Dictionary();
+ NextToken( json, ref index ); // skip {
+
+ while( true ) {
+ int token = LookAhead( json, index );
+ if( token == TOKEN_NONE ) {
+ success = false; return null;
+ } else if( token == TOKEN_COMMA ) {
+ NextToken( json, ref index );
+ } else if( token == TOKEN_CURLY_CLOSE ) {
+ NextToken( json, ref index );
+ return table;
+ } else {
+ string name = ParseString( json, ref index, ref success );
+ if( !success ) {
+ success = false; return null;
+ }
+ token = NextToken( json, ref index );
+ if( token != TOKEN_COLON ) {
+ success = false; return null;
+ }
+ object value = ParseValue( json, ref index, ref success );
+ if( !success ) {
+ success = false; return null;
+ }
+ table[name] = value;
+ }
+ }
+ }
+
+ static List