diff --git a/docker/mingw/Dockerfile b/docker/mingw/Dockerfile
new file mode 100644
index 00000000..050fb847
--- /dev/null
+++ b/docker/mingw/Dockerfile
@@ -0,0 +1,42 @@
+#
+# Dockerfile for building MinGW port
+#
+# This file is part of the shadowsocks-libev.
+#
+# shadowsocks-libev is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# shadowsocks-libev is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with shadowsocks-libev; see the file COPYING. If not, see
+# .
+#
+
+FROM debian:testing
+
+ARG REPO=shadowsocks
+ARG REV=master
+
+ADD prepare.sh /
+
+RUN \
+ /bin/bash -c "source /prepare.sh && dk_prepare" && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /build
+
+RUN /bin/bash -c "source /prepare.sh && dk_download"
+
+ADD deps.sh /
+RUN /bin/bash -c "source /deps.sh && dk_deps"
+
+ADD build.sh /
+
+ARG REBUILD=0
+
+RUN /bin/bash -c "source /build.sh && dk_build && dk_package"
diff --git a/docker/mingw/Makefile b/docker/mingw/Makefile
new file mode 100644
index 00000000..92c0122a
--- /dev/null
+++ b/docker/mingw/Makefile
@@ -0,0 +1,38 @@
+#
+# Makefile for building MinGW port
+#
+# This file is part of the shadowsocks-libev.
+#
+# shadowsocks-libev is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# shadowsocks-libev is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with shadowsocks-libev; see the file COPYING. If not, see
+# .
+#
+
+REPO=shadowsocks
+REV=master
+IMAGE=ss-build-mingw
+DIST=ss-libev-win-dist.tar.gz
+
+all: build
+
+build:
+ docker build --force-rm -t $(IMAGE) \
+ --build-arg REV=$(REV) --build-arg REPO=$(REPO) \
+ --build-arg REBUILD="$$(date +%Y-%m-%d-%H-%M-%S)" .
+ docker run --rm --entrypoint cat $(IMAGE) /bin.tgz > $(DIST)
+
+clean:
+ rm -f $(DIST)
+ docker rmi $(IMAGE) || true
+
+.PHONY: all clean build
diff --git a/docker/mingw/build.sh b/docker/mingw/build.sh
new file mode 100644
index 00000000..da89871b
--- /dev/null
+++ b/docker/mingw/build.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+#
+# Functions for building MinGW port in Docker
+#
+# This file is part of the shadowsocks-libev.
+#
+# shadowsocks-libev is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# shadowsocks-libev is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with shadowsocks-libev; see the file COPYING. If not, see
+# .
+#
+
+# Exit on error
+set -e
+
+. /prepare.sh
+
+build_proj() {
+ arch=$1
+ host=$arch-w64-mingw32
+ prefix=${DIST}/$arch
+ dep=${PREFIX}/$arch
+
+ cd "$SRC"
+ git clone ${PROJ_URL} proj
+ cd proj
+ git checkout ${PROJ_REV}
+ git submodule update --init
+ ./autogen.sh
+ ./configure --host=${host} --prefix=${prefix} \
+ --disable-documentation \
+ --with-ev="$dep" \
+ --with-mbedtls="$dep" \
+ --with-sodium="$dep" \
+ --with-pcre="$dep" \
+ --with-cares="$dep" \
+ CFLAGS="-DCARES_STATICLIB -DPCRE_STATIC"
+ make clean
+ make LDFLAGS="-all-static -L${dep}/lib"
+ make install-strip
+}
+
+dk_build() {
+ for arch in i686 x86_64; do
+ build_proj $arch
+ done
+}
+
+dk_package() {
+ rm -rf "$BASE/pack"
+ mkdir -p "$BASE/pack"
+ cd "$BASE/pack"
+ mkdir -p ss-libev-${PROJ_REV}
+ cd ss-libev-${PROJ_REV}
+ for bin in local server tunnel; do
+ cp ${DIST}/i686/bin/ss-${bin}.exe ss-${bin}-x86.exe
+ cp ${DIST}/x86_64/bin/ss-${bin}.exe ss-${bin}-x64.exe
+ done
+ pushd "$SRC/proj"
+ GIT_REV="$(git rev-parse --short HEAD)"
+ popd
+ echo "SHA1 checksum for build $(date +"%y%m%d")-${GIT_REV}" > checksum
+ for f in *.exe; do
+ echo " $f:" >> checksum
+ echo " $(sha1sum $f | cut -d ' ' -f 1)" >> checksum
+ done
+ sed -e 's/$/\r/' checksum > checksum.txt
+ rm -f checksum
+ cd ..
+ tar zcf /bin.tgz ss-libev-${PROJ_REV}
+}
diff --git a/docker/mingw/deps.sh b/docker/mingw/deps.sh
new file mode 100644
index 00000000..0ee99454
--- /dev/null
+++ b/docker/mingw/deps.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+#
+# Functions for building MinGW port in Docker
+#
+# This file is part of the shadowsocks-libev.
+#
+# shadowsocks-libev is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# shadowsocks-libev is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with shadowsocks-libev; see the file COPYING. If not, see
+# .
+#
+
+# Exit on error
+set -e
+
+. /prepare.sh
+
+build_deps() {
+ arch=$1
+ host=$arch-w64-mingw32
+ prefix=${PREFIX}/$arch
+ args="--host=${host} --prefix=${prefix} --disable-shared --enable-static"
+
+ # libev
+ cd "$SRC/$LIBEV_SRC"
+ ./configure $args
+ make clean
+ make install
+
+ # mbedtls
+ cd "$SRC/$MBEDTLS_SRC"
+ make clean
+ make lib WINDOWS=1 CC="${host}-gcc" AR="${host}-ar"
+ make install DESTDIR="${prefix}"
+
+ # sodium
+ cd "$SRC/$SODIUM_SRC"
+ ./configure $args
+ make clean
+ make install
+
+ # pcre
+ cd "$SRC/$PCRE_SRC"
+ ./configure $args \
+ --enable-jit --disable-cpp \
+ --enable-unicode-properties \
+ --enable-pcre16 --enable-pcre32
+ make clean
+ make install
+
+ # c-ares
+ cd "$SRC/$CARES_SRC"
+ ./configure $args
+ make clean
+ make install
+}
+
+dk_deps() {
+ for arch in i686 x86_64; do
+ build_deps $arch
+ done
+}
diff --git a/docker/mingw/prepare.sh b/docker/mingw/prepare.sh
new file mode 100644
index 00000000..d6b9b143
--- /dev/null
+++ b/docker/mingw/prepare.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+#
+# Functions for building MinGW port in Docker
+#
+# This file is part of the shadowsocks-libev.
+#
+# shadowsocks-libev is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# shadowsocks-libev is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with shadowsocks-libev; see the file COPYING. If not, see
+# .
+#
+
+# Exit on error
+set -e
+
+# Build options
+BASE="/build"
+PREFIX="$BASE/stage"
+SRC="$BASE/src"
+DIST="$BASE/dist"
+
+# Project URL
+PROJ_SITE=$REPO # Change REPO in Makefile
+PROJ_REV=$REV # Change REV in Makefile
+PROJ_URL=https://github.com/${PROJ_SITE}/shadowsocks-libev.git
+
+# Libraries from project
+
+## libev for MinGW
+LIBEV_VER=mingw
+LIBEV_SRC=libev-${LIBEV_VER}
+LIBEV_URL=https://github.com/${PROJ_SITE}/libev/archive/${LIBEV_VER}.tar.gz
+
+## mbedTLS for MinGW
+MBEDTLS_VER=mingw
+MBEDTLS_SRC=mbedtls-${MBEDTLS_VER}
+MBEDTLS_URL=https://github.com/${PROJ_SITE}/mbedtls/archive/${MBEDTLS_VER}.tar.gz
+
+# Public libraries
+
+## Sodium
+SODIUM_VER=1.0.16
+SODIUM_SRC=libsodium-${SODIUM_VER}
+SODIUM_URL=https://download.libsodium.org/libsodium/releases/${SODIUM_SRC}.tar.gz
+
+## PCRE
+PCRE_VER=8.41
+PCRE_SRC=pcre-${PCRE_VER}
+PCRE_URL=https://ftp.pcre.org/pub/pcre/${PCRE_SRC}.tar.gz
+
+## c-ares
+CARES_VER=1.14.0
+CARES_SRC=c-ares-${CARES_VER}
+CARES_URL=https://c-ares.haxx.se/download/${CARES_SRC}.tar.gz
+
+# Build steps
+
+dk_prepare() {
+ apt-get update -y
+ apt-get install --no-install-recommends -y \
+ mingw-w64 aria2 git make automake autoconf libtool ca-certificates
+}
+
+dk_download() {
+ mkdir -p "${SRC}"
+ cd "${SRC}"
+ DOWN="aria2c --file-allocation=trunc -s10 -x10 -j10 -c"
+ for pkg in LIBEV SODIUM MBEDTLS PCRE CARES; do
+ src=${pkg}_SRC
+ url=${pkg}_URL
+ out="${!src}".tar.gz
+ $DOWN ${!url} -o "${out}"
+ echo "Unpacking ${out}..."
+ tar zxf ${out}
+ done
+}