diff --git a/Makefile b/Makefile
index af71c17b7634222e4e90a87f98eee3a60e8705a6..46f5f3b9658d50fd535745bc97e2ffb16a811905 100644
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,7 @@ CFLAGS      = -std=c99 -O2 -W -Wall -pedantic -pthread $(COPT)
 # To build with Lua, download and unzip Lua 5.2.1 source code into the
 # mongoose directory, and then add $(LUA_SOURCES) to CFLAGS
 LUA         = lua-5.2.1/src
+LUA_FLAGS   = -I$(LUA) -DLUA_COMPAT_ALL
 LUA_SOURCES = $(LUA)/lapi.c $(LUA)/lcode.c $(LUA)/lctype.c \
               $(LUA)/ldebug.c $(LUA)/ldo.c $(LUA)/ldump.c \
               $(LUA)/lfunc.c $(LUA)/lgc.c $(LUA)/llex.c \
@@ -34,17 +35,6 @@ LUA_SOURCES = $(LUA)/lapi.c $(LUA)/lcode.c $(LUA)/lctype.c \
               $(LUA)/loslib.c $(LUA)/lstrlib.c $(LUA)/ltablib.c \
               $(LUA)/loadlib.c $(LUA)/linit.c
 
-# Using Visual Studio 6.0. To build Mongoose:
-#  Set MSVC variable below to where VS 6.0 is installed on your system
-#  Run "PATH_TO_VC6\bin\nmake windows"
-MSVC        = ../vc6
-#DBG         = /Zi /Od
-DBG         = /DNDEBUG /O1
-CL          = $(MSVC)/bin/cl /MD /TC /nologo $(DBG) /Gz /W3 \
-              /I$(MSVC)/include /I$(LUA) /I. /I$(YASSL) /I$(YASSL)/cyassl /GA
-MSLIB       = /link /incremental:no /libpath:$(MSVC)/lib /machine:IX86 \
-              user32.lib shell32.lib comdlg32.lib ws2_32.lib advapi32.lib
-
 # Stock windows binary builds with Lua and YASSL library.
 YASSL       = ../cyassl-2.4.6
 YASSL_FLAGS = -I $(YASSL) -I $(YASSL)/cyassl \
@@ -70,9 +60,32 @@ YASSL_SOURCES = \
   $(YASSL)/ctaocrypt/src/ecc.c $(YASSL)/src/ocsp.c $(YASSL)/src/crl.c \
   $(YASSL)/ctaocrypt/src/hc128.c $(YASSL)/ctaocrypt/src/memory.c
 
+ALL_SOURCES = main.c mongoose.c build/sqlite3.c build/lsqlite3.c \
+              $(LUA_SOURCES) $(YASSL_SOURCES)
+ALL_OBJECTS = $(ALL_SOURCES:%.c=%.o)
+ALL_WINOBJS = $(ALL_SOURCES:%.c=%.obj)
+
+FLAGS = -DNO_SSL_DL -DUSE_LUA -DUSE_LUA_SQLITE3 $(YASSL_FLAGS) $(LUA_FLAGS)
+
+# Using Visual Studio 6.0. To build Mongoose:
+#  Set MSVC variable below to where VS 6.0 is installed on your system
+#  Run "PATH_TO_VC6\bin\nmake windows"
+MSVC = ../vc6
+#DBG = /Zi /Od
+DBG  = /DNDEBUG /O1
+CL   = $(MSVC)/bin/cl /MD /TC /nologo $(DBG) /Gz /W3 /GA /I$(MSVC)/include
+LINK = $(MSVC)/bin/link /incremental:no /libpath:$(MSVC)/lib /machine:IX86 \
+       user32.lib shell32.lib comdlg32.lib ws2_32.lib advapi32.lib
+
 all:
 	@echo "make (linux|bsd|solaris|mac|windows|mingw|cygwin)"
 
+%.obj: %.c
+	$(CL) /c $(FLAGS) /Fo$@ $<
+
+%.o: %.c
+	$(CC) -o $@ $< -c $(FLAGS) $(CFLAGS)
+
 # To build with lua, make sure you have Lua unpacked into lua-5.2.1 directory
 linux_lua:
 	$(CC) mongoose.c main.c build/lsqlite3.c build/sqlite3.c $(LUA_SOURCES) -DUSE_LUA -DUSE_LUA_SQLITE3 -DLUA_COMPAT_ALL -I$(LUA) -o $(PROG) -ldl $(CFLAGS)
@@ -88,11 +101,8 @@ mac: bsd
 bsd:
 	$(CC) mongoose.c main.c -o $(PROG) $(CFLAGS)
 
-bsd_yassl:
-	$(CC) mongoose.c main.c build/lsqlite3.c build/sqlite3.c -o $(PROG) \
-          $(CFLAGS) -I$(LUA) -Ibuild \
-          $(YASSL_SOURCES) $(YASSL_FLAGS) -DNO_SSL_DL \
-          $(LUA_SOURCES) -DUSE_LUA -DUSE_LUA_SQLITE3 -DLUA_COMPAT_ALL
+bsd_lua: $(ALL_OBJECTS)
+	$(CC) $(ALL_OBJECTS) -o $@
 
 solaris:
 	$(CC) mongoose.c main.c -lnsl -lsocket -o $(PROG) $(CFLAGS)
@@ -121,12 +131,9 @@ w:
           $(MSLIB) /out:unit_test.exe
 	./unit_test.exe
 
-windows:
-	$(MSVC)/bin/rc build\res.rc
-	$(CL) main.c mongoose.c build/lsqlite3.c build/sqlite3.c \
-          $(YASSL_SOURCES) $(YASSL_FLAGS) /DNO_SSL_DL \
-          $(LUA_SOURCES) /DUSE_LUA /DUSE_LUA_SQLITE3 /DLUA_COMPAT_ALL \
-          $(MSLIB) build\res.res /out:$(PROG).exe /subsystem:windows
+windows: $(ALL_WINOBJS)
+	$(MSVC)/bin/rc build/res.rc
+	$(LINK) /nologo $(ALL_WINOBJS) build/res.res /out:$(PROG).exe
 
 # Build for Windows under MinGW
 #MINGWDBG= -DDEBUG -O0 -ggdb
@@ -164,5 +171,5 @@ clean:
 	cd examples && $(MAKE) clean
 	rm -rf *.o *.core $(PROG) *.obj *.so $(PROG).txt *.dSYM *.tgz \
 	$(PROG).exe *.dll *.lib build/res.o build/res.RES *.dSYM *.zip *.pdb \
-	*.exe *.dmg $(LUA_SOURCES:%.c=%.obj) $(YASSL_SOURCES:%.c=%.obj)
+	*.exe *.dmg $(ALL_OBJECTS) $(ALL_WINOBJS)