diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 00000000..f212233b
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,251 @@
+#
+# FIXME: This CMakeLists.txt is only for Win32 platforms for now
+#
+
+cmake_minimum_required(VERSION 2.8.7)
+project(chibi-scheme)
+
+include(CheckIncludeFile)
+
+if(APPLE)
+    message(FATAL_ERROR 
+        "DYLD platforms are not supported with this CMakeLists.txt. Use Makefile instead.")
+endif()
+
+if(UNIX)
+    message(FATAL_ERROR 
+        "UNIX platforms are not supported with this CMakeLists.txt. Use Makefile instead.")
+endif()
+
+#
+# Features
+#
+
+check_include_file(poll.h HAVE_POLL_H)
+check_include_file(stdint.h HAVE_STDINT_H)
+# option(CHIBI_SCHEME_USE_DL "Use dynamic loading" ON)
+set(CHIBI_SCHEME_USE_DL OFF)
+
+if(CHIBI_SCHEME_USE_DL)
+    add_definitions(-DSEXP_USE_DL=1)
+else()
+    add_definitions(-DSEXP_USE_DL=0)
+endif()
+
+if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+    if(MSVC)
+        # On MSVC, SEXP_64_BIT is not supported for now (#438)
+        add_definitions(-DSEXP_64_BIT=0)
+    else()
+        add_definitions(-DSEXP_64_BIT=1)
+    endif()
+elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+    add_definitions(-DSEXP_64_BIT=0)
+endif()
+
+if(HAVE_STDINT_H)
+    add_definitions(-DSEXP_USE_INTTYPES=1)
+endif()
+
+if(NOT HAVE_POLL_H)
+    # Disable green threads: It depends on non-blocking I/O
+    add_definitions(-DSEXP_USE_GREEN_THREADS=0)
+endif()
+
+set(chibi-scheme-exclude-modules)
+if(WIN32)
+    add_definitions(-DBUILDING_DLL)
+    set(chibi-scheme-exclude-modules
+        # Following modules are not compatible with Win32
+        lib/chibi/net.sld
+        lib/chibi/process.sld
+        lib/chibi/stty.sld
+        lib/chibi/system.sld
+        lib/chibi/time.sld)
+endif()
+
+#
+# Sources
+#
+
+set(chibi-scheme-srcs
+    # SEXP
+    gc.c
+    sexp.c
+    bignum.c
+    gc_heap.c
+
+    # Eval
+    opcodes.c
+    vm.c
+    eval.c
+    simplify.c)
+
+include_directories(
+    include
+    ${CMAKE_CURRENT_BINARY_DIR}/include)
+
+#
+# Bootstrap
+#
+
+add_executable(chibi-scheme-bootstrap
+    ${chibi-scheme-srcs}
+    main.c)
+
+if(WIN32)
+    target_link_libraries(chibi-scheme-bootstrap ws2_32)
+endif()
+
+if(CYGWIN OR WIN32)
+    set(soext ".dll")
+else()
+    set(soext ".so")
+endif()
+
+#
+# Generate modules
+#
+
+# FIXME: Currently, it depends on GLOB thus we have to re-run CMake
+#        when we've gotten additional/removed library 
+
+file(GLOB_RECURSE stubs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/lib 
+    ${CMAKE_CURRENT_SOURCE_DIR}/lib/*.stub)
+file(GLOB_RECURSE slds RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} 
+    ${CMAKE_CURRENT_SOURCE_DIR}/lib/*.sld)
+list(REMOVE_ITEM slds ${chibi-scheme-exclude-modules})
+
+set(chibi-ffi ${CMAKE_CURRENT_SOURCE_DIR}/tools/chibi-ffi)
+set(chibi-genstatic ${CMAKE_CURRENT_SOURCE_DIR}/tools/chibi-genstatic)
+
+set(stuboutdir ${CMAKE_CURRENT_BINARY_DIR}/stubs/lib)
+foreach(e ${stubs})
+    get_filename_component(stubdir ${e} PATH)
+    get_filename_component(basename ${e} NAME_WE)
+    set(stubfile ${CMAKE_CURRENT_SOURCE_DIR}/lib/${e})
+    set(stubdir ${stuboutdir}/${stubdir})
+    set(stubout ${stubdir}/${basename}.c)
+    file(MAKE_DIRECTORY ${stubdir})
+    add_custom_command(OUTPUT ${stubout}
+        COMMAND chibi-scheme-bootstrap
+        ${chibi-ffi} ${stubfile} ${stubout}
+        DEPENDS ${stubfile} ${chibi-ffi}
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+    list(APPEND stubouts ${stubout})
+endforeach()
+add_custom_target(chibi-scheme-stubs DEPENDS ${stubouts})
+
+#
+# Generate clib.c for SEXP_USE_STATIC_LIBS
+#
+
+string(REPLACE ";" "\n" genstatic-input "${slds}")
+set(clibin ${CMAKE_CURRENT_BINARY_DIR}/clib-in.txt)
+set(clibout ${CMAKE_CURRENT_BINARY_DIR}/clib.c)
+set(genstatic-helper 
+    ${CMAKE_CURRENT_LIST_DIR}/contrib/chibi-genstatic-helper.cmake)
+file(WRITE ${clibin} "${genstatic-input}")
+
+add_custom_command(OUTPUT ${clibout}
+    COMMAND 
+    ${CMAKE_COMMAND} 
+    -DEXEC=$<TARGET_FILE:chibi-scheme-bootstrap>
+    -DGENSTATIC=${chibi-genstatic}
+    -DSTUBS=${clibin}
+    -DOUT=${clibout}
+    -P ${genstatic-helper}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+    DEPENDS 
+    chibi-scheme-bootstrap
+    ${chibi-genstatic}
+    ${genstatic-helper}
+    ${slds})
+
+#
+# Interpreter
+#
+
+include_directories(
+    .
+    ${stuboutdir}/..)
+add_executable(chibi-scheme
+    ${chibi-scheme-srcs}
+    ${clibout}
+    main.c)
+
+set_target_properties(chibi-scheme
+    PROPERTIES COMPILE_DEFINITIONS "SEXP_USE_STATIC_LIBS=1")
+
+add_dependencies(chibi-scheme chibi-scheme-stubs)
+
+if(WIN32)
+    target_link_libraries(chibi-scheme ws2_32)
+endif()
+
+#
+# Generate "chibi/install.h" 
+#
+
+if(CYGWIN OR WIN32)
+    set(thePrefix "bin")
+else()
+    set(thePrefix "lib")
+endif()
+
+if(WIN32)
+    set(pathsep "\\;")
+else()
+    set(pathsep ":")
+endif()
+
+if(WIN32)
+    set(platform "windows")
+else()
+    set(platform "unknown")
+endif()
+
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/RELEASE release)
+string(STRIP ${release} release)
+
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/VERSION version)
+string(STRIP ${version} version)
+set(version "${version}-cmake")
+
+set(default_module_path
+    ""
+    #"${CMAKE_INSTALL_PREFIX}/${thePrefix}${pathsep}${CMAKE_INSTALL_PREFIX}/bin"
+    )
+
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/chibi)
+
+file(WRITE
+    ${CMAKE_CURRENT_BINARY_DIR}/include/chibi/install.h
+    "#define sexp_so_extension \"${soext}\"
+#define sexp_default_module_path \"${default_module_path}\"
+#define sexp_platform \"${platform}\"
+#define sexp_version \"\"
+#define sexp_release_name \"${release}\"")
+
+# 
+# Testing
+#
+
+enable_testing()
+
+set(chibi-scheme-tests
+    r7rs-tests
+    ## Not connected
+    #division-tests
+    #r5rs-tests
+    #syntax-tests
+    #unicode-tests
+    ## Require threads
+    # lib-tests
+    )
+
+foreach(e ${chibi-scheme-tests})
+    add_test(NAME "${e}"
+        COMMAND chibi-scheme tests/${e}.scm
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endforeach()
diff --git a/appveyor.yml b/appveyor.yml
index b61803b1..854f0f83 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,19 +1,46 @@
+image: Visual Studio 2017
+
 environment:
     matrix:
         - ARCH: x64
+          TOOLCHAIN: MinGW
+          BUILDSYSTEM: MSYS2
+        - ARCH: x64
+          TOOLCHAIN: MSYS
+          BUILDSYSTEM: MSYS2
         - ARCH: x86
-        - ARCH: msys
+          TOOLCHAIN: MinGW
+          BUILDSYSTEM: MSYS2
+        - ARCH: x86
+          TOOLCHAIN: MinGW
+          BUILDSYSTEM: CMAKE
+        - ARCH: x86
+          TOOLCHAIN: MSVC
+          BUILDSYSTEM: CMAKE
+
+install:
+    - if %BUILDSYSTEM%.==CMAKE. cinst ninja
+    - if %BUILDSYSTEM%.==CMAKE. set PATH=c:/tools/ninja;%PATH%
+    - if %TOOLCHAIN%.==MSVC. call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
+
+before_build:
+    - set BUILDTYPE= %ARCH%%TOOLCHAIN%
+    - if %BUILDTYPE%.==x64MinGW. set PATH=c:\msys64\usr\bin;c:\msys64\mingw64\bin;%PATH%
+    - if %BUILDTYPE%.==x86MinGW. set PATH=c:\msys64\usr\bin;c:\msys64\mingw32\bin;%PATH%
+    - if %BUILDTYPE%.==x64MSYS. set PATH=c:\msys64\usr\bin;%PATH%
+    - if %BUILDTYPE%.==x64MinGW. set CC=c:/msys64/mingw64/bin/gcc
+    - if %BUILDTYPE%.==x86MinGW. set CC=c:/msys64/mingw32/bin/gcc
+    - if %BUILDTYPE%.==x64MSYS. set CC=gcc
+    - if %TOOLCHAIN%.==MSVC. set CC=cl.exe
+    - if %TOOLCHAIN%%BUILDSYSTEM%.==MinGWMSYS2. set EXARG=EXCLUDE_POSIX_LIBS=1
+    - if %TOOLCHAIN%%BUILDSYSTEM%.==MSYSMSYS2. set EXARG=PLATFORM=msys
+    - if %BUILDSYSTEM%.==CMAKE. cmake -G Ninja .
 
 build_script:
-    - if %ARCH%.==x64. set PATH=c:\msys64\usr\bin;c:\msys64\mingw64\bin;%PATH%
-    - if %ARCH%.==x86. set PATH=c:\msys64\usr\bin;c:\msys64\mingw32\bin;%PATH%
-    - if %ARCH%.==msys. set PATH=c:\msys64\usr\bin;%PATH%
-    - if %ARCH%.==x64. set CC=c:/msys64/mingw64/bin/gcc
-    - if %ARCH%.==x86. set CC=c:/msys64/mingw32/bin/gcc
-    - if %ARCH%.==msys. set CC=gcc
-    - if %ARCH%.==x64. set EXARG=EXCLUDE_POSIX_LIBS=1
-    - if %ARCH%.==x86. set EXARG=EXCLUDE_POSIX_LIBS=1
-    - if %ARCH%.==msys. set EXARG=PLATFORM=msys
-    - make CC=%CC% %EXARG% 
-    - make CC=%CC% %EXARG% test
+    - if %BUILDSYSTEM%.==MSYS2. make CC=%CC% %EXARG% 
+    - if %BUILDSYSTEM%.==CMAKE. ninja
+
+test_script:
+    - if %BUILDSYSTEM%.==MSYS2. make CC=%CC% %EXARG% test
+    - if %BUILDSYSTEM%.==CMAKE. ctest --verbose .
 
diff --git a/chibi-scheme.vcproj b/chibi-scheme.vcproj
deleted file mode 100644
index 86bd69e9..00000000
--- a/chibi-scheme.vcproj
+++ /dev/null
@@ -1,206 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="chibi-scheme"
-	ProjectGUID="{38DC39DA-5328-4FFE-84E2-E16FF1864945}"
-	RootNamespace="chibi-scheme"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="0"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug"
-			IntermediateDirectory="Debug"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="include"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;CHIBISCHEME_EXPORTS"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				LinkIncremental="2"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release"
-			IntermediateDirectory="Release"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;CHIBISCHEME_EXPORTS;"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				LinkIncremental="2"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\eval.c"
-				>
-			</File>
-			<File
-				RelativePath=".\main.c"
-				>
-			</File>
-			<File
-				RelativePath=".\sexp.c"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						PreprocessorDefinitions="-DPLATFORM=mingw;-DSEXP_USE_STRING_STREAMS=0;-DSEXP_USE_DEBUG=0;-DSEXP_USE_DL=0;-DBUILDING_DLL"
-					/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/contrib/chibi-genstatic-helper.cmake b/contrib/chibi-genstatic-helper.cmake
new file mode 100644
index 00000000..abddb9d3
--- /dev/null
+++ b/contrib/chibi-genstatic-helper.cmake
@@ -0,0 +1,27 @@
+#
+# chibi-genstatic-helper.cmake
+#
+#  INPUT:
+#   ROOT=<DIR>
+#   EXEC=<EXECUTABLE>
+#   GENSTATIC=<FILE>
+#   STUBS=<FILE>
+#   OUT=<FILE>
+if(NOT EXEC)
+    message(FATAL_ERROR "huh?")
+endif()
+
+if(NOT OUT)
+    message(FATAL_ERROR "huh?")
+endif()
+
+execute_process(
+    COMMAND ${EXEC} ${GENSTATIC} --no-inline
+    INPUT_FILE ${STUBS}
+    OUTPUT_FILE ${OUT}
+    RESULT_VARIABLE rr
+    )
+
+if(rr)
+    message(FATAL_ERROR "Error: ${rr}")
+endif()
diff --git a/include/chibi/features.h b/include/chibi/features.h
index 7c685609..994c7eca 100644
--- a/include/chibi/features.h
+++ b/include/chibi/features.h
@@ -773,16 +773,12 @@
 #define SHUT_RD 0 /* SD_RECEIVE */
 #define SHUT_WR 1 /* SD_SEND */
 #define SHUT_RDWR 2 /* SD_BOTH */
-#if !defined(__MINGW32__) && !defined(__MINGW64__)
-#define strcasecmp lstrcmpi
-#define strncasecmp(s1, s2, n) lstrcmpi(s1, s2)
-#endif
-#include <shlwapi.h>
-#define strcasestr StrStrI
 #ifdef _MSC_VER
 #define _CRT_SECURE_NO_WARNINGS 1
 #define _CRT_NONSTDC_NO_DEPRECATE 1
 #define _USE_MATH_DEFINES /* For M_LN10 */
+#define strcasecmp _stricmp
+#define strncasecmp _strnicmp
 #pragma warning(disable:4146) /* unary minus operator to unsigned type */
 #if _MSC_VER < 1900
 #define snprintf(buf, len, fmt, val) sprintf(buf, fmt, val)
diff --git a/sexp.c b/sexp.c
index 12de4a3a..e6fdc3d7 100644
--- a/sexp.c
+++ b/sexp.c
@@ -3226,7 +3226,7 @@ sexp sexp_read_raw (sexp ctx, sexp in, sexp *shares) {
         else if (strcasecmp(str+1, "nan.0") == 0)
           res = sexp_make_flonum(ctx, sexp_nan);
 #if SEXP_USE_COMPLEX
-        else if (strcasestr(str+1, "inf.0") == str+1) {
+        else if (strncasecmp(str+1, "inf.0", 5) == 0) {
           tmp = sexp_make_flonum(ctx, c1 == '+' ? sexp_pos_infinity : sexp_neg_infinity);
           if (str[6] == 0) {
             res = tmp;