diff --git a/contrib/vs/config.bat b/contrib/vs/config.bat
new file mode 100644
index 0000000..f71d875
--- /dev/null
+++ b/contrib/vs/config.bat
@@ -0,0 +1,107 @@
+@echo off
+setlocal enabledelayedexpansion
+
+set PACKAGE_NAME="tl-parser"
+set PACKAGE_TARNAME="tl-parser"
+set PACKAGE_VERSION="1.0"
+set PACKAGE_STRING="tl-parser %PACKAGE_VERSION:~1%"
+set PACKAGE_BUGREPORT=""
+set PACKAGE_URL=""
+
+set CONFIG_HEADER_IN=..\..\config.h.in
+set CONFIG_HEADER=config.h
+set DEFAULT_OUT_FOLDER=build
+set OUT_PATH=""
+set SOURCE_LIST=()
+
+:rem Parse Args
+for %%a in (%*) do (
+ if defined arg (
+ if /I "-o"=="!arg!" set OUT_PATH=%%a
+ set set arg=
+ )
+ if /I "%%a" geq "-" (
+ set arg=%%a
+ ) else (
+ set set arg=
+ )
+)
+if %OUT_PATH%=="" (
+ set OUT_PATH=%DEFAULT_OUT_FOLDER%
+)
+
+:rem Make output folder if not exists
+if not exist !OUT_PATH! mkdir !OUT_PATH!
+
+:rem Copy source files to the output folder
+for %%i in %SOURCE_LIST% do (
+ if not exist %OUT_PATH%\%%i (
+ echo |set /p=Copying file: %%i
+ copy %%i "%OUT_PATH%\%%i" 1>NUL && (
+ echo Done
+ ) || (
+ echo Failed
+ )
+ )
+)
+
+set OUT_PATH="%OUT_PATH%\%CONFIG_HEADER%"
+if exist %OUT_PATH% exit /B 0
+
+:rem Copy config.h.in to the output folder
+echo |set /p=Copying file: %CONFIG_HEADER%
+copy %CONFIG_HEADER_IN% %OUT_PATH% 1>NUL && (
+ echo Done
+) || (
+ echo Failed
+ exit /B %ERRORLEVEL%
+)
+
+:rem Configure config.h
+echo |set /p=Configurating file: config.h
+call :find_and_replace "#undef PACKAGE_BUGREPORT" "#define PACKAGE_BUGREPORT %PACKAGE_BUGREPORT%"
+call :find_and_replace "#undef PACKAGE_NAME" "#define PACKAGE_NAME %PACKAGE_NAME%"
+call :find_and_replace "#undef PACKAGE_STRING" "#define PACKAGE_STRING %PACKAGE_STRING%"
+call :find_and_replace "#undef PACKAGE_TARNAME" "#define PACKAGE_TARNAME %PACKAGE_TARNAME%"
+call :find_and_replace "#undef PACKAGE_URL" "#define PACKAGE_URL %PACKAGE_URL%"
+call :find_and_replace "#undef PACKAGE_VERSION" "#define PACKAGE_VERSION %PACKAGE_VERSION%"
+
+call :find_and_replace "#undef HAVE_FCNTL_H" "#define HAVE_FCNTL_H 1"
+call :find_and_replace "#undef HAVE_INTTYPES_H" "#define HAVE_INTTYPES_H 1"
+call :find_and_replace "#undef HAVE_LIBZ" "#define HAVE_LIBZ 1"
+call :find_and_replace "#undef HAVE_MALLOC" "#define HAVE_MALLOC 1"
+call :find_and_replace "#undef HAVE_MEMORY_H" "#define HAVE_MEMORY_H 1"
+call :find_and_replace "#undef HAVE_MEMSET" "#define HAVE_MEMSET 1"
+call :find_and_replace "#undef HAVE_REALLOC" "#define HAVE_REALLOC 1"
+call :find_and_replace "#undef HAVE_STDINT_H" "#define HAVE_STDINT_H 1"
+call :find_and_replace "#undef HAVE_STDLIB_H" "#define HAVE_STDLIB_H 1"
+call :find_and_replace "#undef HAVE_STRDUP" "#define HAVE_STRDUP 1"
+call :find_and_replace "#undef HAVE_STRING_H" "#define HAVE_STRING_H 1"
+call :find_and_replace "#undef HAVE_SYS_STAT_H" "#define HAVE_SYS_STAT_H 1"
+call :find_and_replace "#undef HAVE_SYS_TYPES_H" "#define HAVE_SYS_TYPES_H 1"
+call :find_and_replace "#undef STDC_HEADERS" "#define STDC_HEADERS 1"
+call :find_and_replace "#undef inline" "#define inline __inline"
+call :find_and_replace "#undef" "// #undef"
+
+if %ERRORLEVEL% == 0 echo Done
+if not %ERRORLEVEL% == 0 (
+ echo Failed
+ if exist %OUT_PATH% del /q /f %OUT_PATH%
+)
+exit /B %ERRORLEVEL%
+
+:find_and_replace
+set FIND_STR=%1
+set "FIND_STR=!FIND_STR:~1,-1!"
+set REPLACE_STR=%2 %3
+set "REPLACE_STR=!REPLACE_STR:~1,-2!"
+
+for /f "delims=" %%i in ('type "%OUT_PATH%" ^| find /n /v "" ^& break ^> "%OUT_PATH%" ') do (
+ set "line=%%i"
+ setlocal enableDelayedExpansion
+ set "line=!line:*]%FIND_STR%=%REPLACE_STR%!"
+ set "line=!line:*]=!"
+ >>"%OUT_PATH%" echo(!line!
+ endlocal
+)
+exit /B %ERRORLEVEL%
diff --git a/contrib/vs/tl-parser.sln b/contrib/vs/tl-parser.sln
new file mode 100644
index 0000000..8365b79
--- /dev/null
+++ b/contrib/vs/tl-parser.sln
@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.23107.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tl-parser", "tl-parser.vcxproj", "{14022761-9F27-4A2D-B7EA-F41FB9B3274C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}.Debug|x64.ActiveCfg = Debug|x64
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}.Debug|x64.Build.0 = Debug|x64
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}.Debug|x86.ActiveCfg = Debug|Win32
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}.Debug|x86.Build.0 = Debug|Win32
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}.Release|x64.ActiveCfg = Release|x64
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}.Release|x64.Build.0 = Release|x64
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}.Release|x86.ActiveCfg = Release|Win32
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/contrib/vs/tl-parser.vcxproj b/contrib/vs/tl-parser.vcxproj
new file mode 100644
index 0000000..75ef601
--- /dev/null
+++ b/contrib/vs/tl-parser.vcxproj
@@ -0,0 +1,208 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {14022761-9F27-4A2D-B7EA-F41FB9B3274C}
+ Win32Proj
+ tlparser
+ 8.1
+
+
+
+ Application
+ true
+ v140
+ Unicode
+
+
+ Application
+ false
+ v140
+ true
+ Unicode
+
+
+ Application
+ true
+ v140
+ Unicode
+
+
+ Application
+ false
+ v140
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ build\$(Configuration)\
+ build\$(Configuration)\build\
+ $(VC_IncludePath);$(WindowsSDK_IncludePath);$(IntDir);$(ProjectDir);
+ *.h;$(ExtensionsToDeleteOnClean)
+
+
+ true
+ build\$(Platform)\$(Configuration)\
+ build\$(Platform)\$(Configuration)\build\
+ $(VC_IncludePath);$(WindowsSDK_IncludePath);$(IntDir);$(ProjectDir);
+ *.h;$(ExtensionsToDeleteOnClean)
+
+
+ false
+ build\$(Configuration)\
+ build\$(Configuration)\build\
+ $(VC_IncludePath);$(WindowsSDK_IncludePath);$(IntDir);$(ProjectDir);
+ *.h;$(ExtensionsToDeleteOnClean)
+
+
+ false
+ build\$(Platform)\$(Configuration)\
+ build\$(Platform)\$(Configuration)\build\
+ $(VC_IncludePath);$(WindowsSDK_IncludePath);$(IntDir);$(ProjectDir);
+ *.h;$(ExtensionsToDeleteOnClean)
+
+
+
+
+
+ Level3
+ Disabled
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ false
+ CompileAsC
+
+
+ Console
+ true
+
+
+ %(AdditionalDependencies)
+
+
+ config.bat -o $(IntDir)
+
+
+
+
+
+
+
+
+ Level3
+ Disabled
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+
+
+ config.bat -o $(IntDir)
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+
+
+ Console
+ true
+ true
+ true
+
+
+ %(AdditionalDependencies)
+
+
+ config.bat -o $(IntDir)
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+
+
+ Console
+ true
+ true
+ true
+
+
+ config.bat -o $(IntDir)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/contrib/vs/tl-parser.vcxproj.filters b/contrib/vs/tl-parser.vcxproj.filters
new file mode 100644
index 0000000..2ba314f
--- /dev/null
+++ b/contrib/vs/tl-parser.vcxproj.filters
@@ -0,0 +1,48 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
\ No newline at end of file