diff --git a/.git/HEAD b/.git/HEAD
deleted file mode 100644
--- a/.git/HEAD
+++ /dev/null
@@ -1,1 +0,0 @@
-ref: refs/heads/master
diff --git a/.git/config b/.git/config
deleted file mode 100644
--- a/.git/config
+++ /dev/null
@@ -1,11 +0,0 @@
-[core]
-	repositoryformatversion = 0
-	filemode = true
-	bare = false
-	logallrefupdates = true
-[remote "origin"]
-	url = http://github.com/deech/fltkhs
-	fetch = +refs/heads/*:refs/remotes/origin/*
-[branch "master"]
-	remote = origin
-	merge = refs/heads/master
diff --git a/.git/description b/.git/description
deleted file mode 100644
--- a/.git/description
+++ /dev/null
@@ -1,1 +0,0 @@
-Unnamed repository; edit this file 'description' to name the repository.
diff --git a/.git/hooks/applypatch-msg.sample b/.git/hooks/applypatch-msg.sample
deleted file mode 100644
--- a/.git/hooks/applypatch-msg.sample
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-#
-# An example hook script to check the commit log message taken by
-# applypatch from an e-mail message.
-#
-# The hook should exit with non-zero status after issuing an
-# appropriate message if it wants to stop the commit.  The hook is
-# allowed to edit the commit message file.
-#
-# To enable this hook, rename this file to "applypatch-msg".
-
-. git-sh-setup
-test -x "$GIT_DIR/hooks/commit-msg" &&
-	exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}
-:
diff --git a/.git/hooks/commit-msg.sample b/.git/hooks/commit-msg.sample
deleted file mode 100644
--- a/.git/hooks/commit-msg.sample
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-#
-# An example hook script to check the commit log message.
-# Called by "git commit" with one argument, the name of the file
-# that has the commit message.  The hook should exit with non-zero
-# status after issuing an appropriate message if it wants to stop the
-# commit.  The hook is allowed to edit the commit message file.
-#
-# To enable this hook, rename this file to "commit-msg".
-
-# Uncomment the below to add a Signed-off-by line to the message.
-# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
-# hook is more suited to it.
-#
-# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
-# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
-
-# This example catches duplicate Signed-off-by lines.
-
-test "" = "$(grep '^Signed-off-by: ' "$1" |
-	 sort | uniq -c | sed -e '/^[ 	]*1[ 	]/d')" || {
-	echo >&2 Duplicate Signed-off-by lines.
-	exit 1
-}
diff --git a/.git/hooks/post-update.sample b/.git/hooks/post-update.sample
deleted file mode 100644
--- a/.git/hooks/post-update.sample
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-#
-# An example hook script to prepare a packed repository for use over
-# dumb transports.
-#
-# To enable this hook, rename this file to "post-update".
-
-exec git update-server-info
diff --git a/.git/hooks/pre-applypatch.sample b/.git/hooks/pre-applypatch.sample
deleted file mode 100644
--- a/.git/hooks/pre-applypatch.sample
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-#
-# An example hook script to verify what is about to be committed
-# by applypatch from an e-mail message.
-#
-# The hook should exit with non-zero status after issuing an
-# appropriate message if it wants to stop the commit.
-#
-# To enable this hook, rename this file to "pre-applypatch".
-
-. git-sh-setup
-test -x "$GIT_DIR/hooks/pre-commit" &&
-	exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}
-:
diff --git a/.git/hooks/pre-commit.sample b/.git/hooks/pre-commit.sample
deleted file mode 100644
--- a/.git/hooks/pre-commit.sample
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/bin/sh
-#
-# An example hook script to verify what is about to be committed.
-# Called by "git commit" with no arguments.  The hook should
-# exit with non-zero status after issuing an appropriate message if
-# it wants to stop the commit.
-#
-# To enable this hook, rename this file to "pre-commit".
-
-if git rev-parse --verify HEAD >/dev/null 2>&1
-then
-	against=HEAD
-else
-	# Initial commit: diff against an empty tree object
-	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
-fi
-
-# If you want to allow non-ascii filenames set this variable to true.
-allownonascii=$(git config hooks.allownonascii)
-
-# Redirect output to stderr.
-exec 1>&2
-
-# Cross platform projects tend to avoid non-ascii filenames; prevent
-# them from being added to the repository. We exploit the fact that the
-# printable range starts at the space character and ends with tilde.
-if [ "$allownonascii" != "true" ] &&
-	# Note that the use of brackets around a tr range is ok here, (it's
-	# even required, for portability to Solaris 10's /usr/bin/tr), since
-	# the square bracket bytes happen to fall in the designated range.
-	test $(git diff --cached --name-only --diff-filter=A -z $against |
-	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
-then
-	echo "Error: Attempt to add a non-ascii file name."
-	echo
-	echo "This can cause problems if you want to work"
-	echo "with people on other platforms."
-	echo
-	echo "To be portable it is advisable to rename the file ..."
-	echo
-	echo "If you know what you are doing you can disable this"
-	echo "check using:"
-	echo
-	echo "  git config hooks.allownonascii true"
-	echo
-	exit 1
-fi
-
-# If there are whitespace errors, print the offending file names and fail.
-exec git diff-index --check --cached $against --
diff --git a/.git/hooks/pre-push.sample b/.git/hooks/pre-push.sample
deleted file mode 100644
--- a/.git/hooks/pre-push.sample
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/sh
-
-# An example hook script to verify what is about to be pushed.  Called by "git
-# push" after it has checked the remote status, but before anything has been
-# pushed.  If this script exits with a non-zero status nothing will be pushed.
-#
-# This hook is called with the following parameters:
-#
-# $1 -- Name of the remote to which the push is being done
-# $2 -- URL to which the push is being done
-#
-# If pushing without using a named remote those arguments will be equal.
-#
-# Information about the commits which are being pushed is supplied as lines to
-# the standard input in the form:
-#
-#   <local ref> <local sha1> <remote ref> <remote sha1>
-#
-# This sample shows how to prevent push of commits where the log message starts
-# with "WIP" (work in progress).
-
-remote="$1"
-url="$2"
-
-z40=0000000000000000000000000000000000000000
-
-IFS=' '
-while read local_ref local_sha remote_ref remote_sha
-do
-	if [ "$local_sha" = $z40 ]
-	then
-		# Handle delete
-	else
-		if [ "$remote_sha" = $z40 ]
-		then
-			# New branch, examine all commits
-			range="$local_sha"
-		else
-			# Update to existing branch, examine new commits
-			range="$remote_sha..$local_sha"
-		fi
-
-		# Check for WIP commit
-		commit=`git rev-list -n 1 --grep '^WIP' "$range"`
-		if [ -n "$commit" ]
-		then
-			echo "Found WIP commit in $local_ref, not pushing"
-			exit 1
-		fi
-	fi
-done
-
-exit 0
diff --git a/.git/hooks/pre-rebase.sample b/.git/hooks/pre-rebase.sample
deleted file mode 100644
--- a/.git/hooks/pre-rebase.sample
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2006, 2008 Junio C Hamano
-#
-# The "pre-rebase" hook is run just before "git rebase" starts doing
-# its job, and can prevent the command from running by exiting with
-# non-zero status.
-#
-# The hook is called with the following parameters:
-#
-# $1 -- the upstream the series was forked from.
-# $2 -- the branch being rebased (or empty when rebasing the current branch).
-#
-# This sample shows how to prevent topic branches that are already
-# merged to 'next' branch from getting rebased, because allowing it
-# would result in rebasing already published history.
-
-publish=next
-basebranch="$1"
-if test "$#" = 2
-then
-	topic="refs/heads/$2"
-else
-	topic=`git symbolic-ref HEAD` ||
-	exit 0 ;# we do not interrupt rebasing detached HEAD
-fi
-
-case "$topic" in
-refs/heads/??/*)
-	;;
-*)
-	exit 0 ;# we do not interrupt others.
-	;;
-esac
-
-# Now we are dealing with a topic branch being rebased
-# on top of master.  Is it OK to rebase it?
-
-# Does the topic really exist?
-git show-ref -q "$topic" || {
-	echo >&2 "No such branch $topic"
-	exit 1
-}
-
-# Is topic fully merged to master?
-not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
-if test -z "$not_in_master"
-then
-	echo >&2 "$topic is fully merged to master; better remove it."
-	exit 1 ;# we could allow it, but there is no point.
-fi
-
-# Is topic ever merged to next?  If so you should not be rebasing it.
-only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
-only_next_2=`git rev-list ^master           ${publish} | sort`
-if test "$only_next_1" = "$only_next_2"
-then
-	not_in_topic=`git rev-list "^$topic" master`
-	if test -z "$not_in_topic"
-	then
-		echo >&2 "$topic is already up-to-date with master"
-		exit 1 ;# we could allow it, but there is no point.
-	else
-		exit 0
-	fi
-else
-	not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
-	/usr/bin/perl -e '
-		my $topic = $ARGV[0];
-		my $msg = "* $topic has commits already merged to public branch:\n";
-		my (%not_in_next) = map {
-			/^([0-9a-f]+) /;
-			($1 => 1);
-		} split(/\n/, $ARGV[1]);
-		for my $elem (map {
-				/^([0-9a-f]+) (.*)$/;
-				[$1 => $2];
-			} split(/\n/, $ARGV[2])) {
-			if (!exists $not_in_next{$elem->[0]}) {
-				if ($msg) {
-					print STDERR $msg;
-					undef $msg;
-				}
-				print STDERR " $elem->[1]\n";
-			}
-		}
-	' "$topic" "$not_in_next" "$not_in_master"
-	exit 1
-fi
-
-<<\DOC_END
-
-This sample hook safeguards topic branches that have been
-published from being rewound.
-
-The workflow assumed here is:
-
- * Once a topic branch forks from "master", "master" is never
-   merged into it again (either directly or indirectly).
-
- * Once a topic branch is fully cooked and merged into "master",
-   it is deleted.  If you need to build on top of it to correct
-   earlier mistakes, a new topic branch is created by forking at
-   the tip of the "master".  This is not strictly necessary, but
-   it makes it easier to keep your history simple.
-
- * Whenever you need to test or publish your changes to topic
-   branches, merge them into "next" branch.
-
-The script, being an example, hardcodes the publish branch name
-to be "next", but it is trivial to make it configurable via
-$GIT_DIR/config mechanism.
-
-With this workflow, you would want to know:
-
-(1) ... if a topic branch has ever been merged to "next".  Young
-    topic branches can have stupid mistakes you would rather
-    clean up before publishing, and things that have not been
-    merged into other branches can be easily rebased without
-    affecting other people.  But once it is published, you would
-    not want to rewind it.
-
-(2) ... if a topic branch has been fully merged to "master".
-    Then you can delete it.  More importantly, you should not
-    build on top of it -- other people may already want to
-    change things related to the topic as patches against your
-    "master", so if you need further changes, it is better to
-    fork the topic (perhaps with the same name) afresh from the
-    tip of "master".
-
-Let's look at this example:
-
-		   o---o---o---o---o---o---o---o---o---o "next"
-		  /       /           /           /
-		 /   a---a---b A     /           /
-		/   /               /           /
-	       /   /   c---c---c---c B         /
-	      /   /   /             \         /
-	     /   /   /   b---b C     \       /
-	    /   /   /   /             \     /
-    ---o---o---o---o---o---o---o---o---o---o---o "master"
-
-
-A, B and C are topic branches.
-
- * A has one fix since it was merged up to "next".
-
- * B has finished.  It has been fully merged up to "master" and "next",
-   and is ready to be deleted.
-
- * C has not merged to "next" at all.
-
-We would want to allow C to be rebased, refuse A, and encourage
-B to be deleted.
-
-To compute (1):
-
-	git rev-list ^master ^topic next
-	git rev-list ^master        next
-
-	if these match, topic has not merged in next at all.
-
-To compute (2):
-
-	git rev-list master..topic
-
-	if this is empty, it is fully merged to "master".
-
-DOC_END
diff --git a/.git/hooks/prepare-commit-msg.sample b/.git/hooks/prepare-commit-msg.sample
deleted file mode 100644
--- a/.git/hooks/prepare-commit-msg.sample
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-#
-# An example hook script to prepare the commit log message.
-# Called by "git commit" with the name of the file that has the
-# commit message, followed by the description of the commit
-# message's source.  The hook's purpose is to edit the commit
-# message file.  If the hook fails with a non-zero status,
-# the commit is aborted.
-#
-# To enable this hook, rename this file to "prepare-commit-msg".
-
-# This hook includes three examples.  The first comments out the
-# "Conflicts:" part of a merge commit.
-#
-# The second includes the output of "git diff --name-status -r"
-# into the message, just before the "git status" output.  It is
-# commented because it doesn't cope with --amend or with squashed
-# commits.
-#
-# The third example adds a Signed-off-by line to the message, that can
-# still be edited.  This is rarely a good idea.
-
-case "$2,$3" in
-  merge,)
-    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
-
-# ,|template,)
-#   /usr/bin/perl -i.bak -pe '
-#      print "\n" . `git diff --cached --name-status -r`
-#	 if /^#/ && $first++ == 0' "$1" ;;
-
-  *) ;;
-esac
-
-# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
-# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
diff --git a/.git/hooks/update.sample b/.git/hooks/update.sample
deleted file mode 100644
--- a/.git/hooks/update.sample
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/bin/sh
-#
-# An example hook script to blocks unannotated tags from entering.
-# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
-#
-# To enable this hook, rename this file to "update".
-#
-# Config
-# ------
-# hooks.allowunannotated
-#   This boolean sets whether unannotated tags will be allowed into the
-#   repository.  By default they won't be.
-# hooks.allowdeletetag
-#   This boolean sets whether deleting tags will be allowed in the
-#   repository.  By default they won't be.
-# hooks.allowmodifytag
-#   This boolean sets whether a tag may be modified after creation. By default
-#   it won't be.
-# hooks.allowdeletebranch
-#   This boolean sets whether deleting branches will be allowed in the
-#   repository.  By default they won't be.
-# hooks.denycreatebranch
-#   This boolean sets whether remotely creating branches will be denied
-#   in the repository.  By default this is allowed.
-#
-
-# --- Command line
-refname="$1"
-oldrev="$2"
-newrev="$3"
-
-# --- Safety check
-if [ -z "$GIT_DIR" ]; then
-	echo "Don't run this script from the command line." >&2
-	echo " (if you want, you could supply GIT_DIR then run" >&2
-	echo "  $0 <ref> <oldrev> <newrev>)" >&2
-	exit 1
-fi
-
-if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
-	echo "usage: $0 <ref> <oldrev> <newrev>" >&2
-	exit 1
-fi
-
-# --- Config
-allowunannotated=$(git config --bool hooks.allowunannotated)
-allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
-denycreatebranch=$(git config --bool hooks.denycreatebranch)
-allowdeletetag=$(git config --bool hooks.allowdeletetag)
-allowmodifytag=$(git config --bool hooks.allowmodifytag)
-
-# check for no description
-projectdesc=$(sed -e '1q' "$GIT_DIR/description")
-case "$projectdesc" in
-"Unnamed repository"* | "")
-	echo "*** Project description file hasn't been set" >&2
-	exit 1
-	;;
-esac
-
-# --- Check types
-# if $newrev is 0000...0000, it's a commit to delete a ref.
-zero="0000000000000000000000000000000000000000"
-if [ "$newrev" = "$zero" ]; then
-	newrev_type=delete
-else
-	newrev_type=$(git cat-file -t $newrev)
-fi
-
-case "$refname","$newrev_type" in
-	refs/tags/*,commit)
-		# un-annotated tag
-		short_refname=${refname##refs/tags/}
-		if [ "$allowunannotated" != "true" ]; then
-			echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
-			echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
-			exit 1
-		fi
-		;;
-	refs/tags/*,delete)
-		# delete tag
-		if [ "$allowdeletetag" != "true" ]; then
-			echo "*** Deleting a tag is not allowed in this repository" >&2
-			exit 1
-		fi
-		;;
-	refs/tags/*,tag)
-		# annotated tag
-		if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
-		then
-			echo "*** Tag '$refname' already exists." >&2
-			echo "*** Modifying a tag is not allowed in this repository." >&2
-			exit 1
-		fi
-		;;
-	refs/heads/*,commit)
-		# branch
-		if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
-			echo "*** Creating a branch is not allowed in this repository" >&2
-			exit 1
-		fi
-		;;
-	refs/heads/*,delete)
-		# delete branch
-		if [ "$allowdeletebranch" != "true" ]; then
-			echo "*** Deleting a branch is not allowed in this repository" >&2
-			exit 1
-		fi
-		;;
-	refs/remotes/*,commit)
-		# tracking branch
-		;;
-	refs/remotes/*,delete)
-		# delete tracking branch
-		if [ "$allowdeletebranch" != "true" ]; then
-			echo "*** Deleting a tracking branch is not allowed in this repository" >&2
-			exit 1
-		fi
-		;;
-	*)
-		# Anything else (is there anything else?)
-		echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
-		exit 1
-		;;
-esac
-
-# --- Finished
-exit 0
diff --git a/.git/index b/.git/index
deleted file mode 100644
Binary files a/.git/index and /dev/null differ
diff --git a/.git/info/exclude b/.git/info/exclude
deleted file mode 100644
--- a/.git/info/exclude
+++ /dev/null
@@ -1,6 +0,0 @@
-# git ls-files --others --exclude-from=.git/info/exclude
-# Lines that start with '#' are comments.
-# For a project mostly in C, the following would be a good set of
-# exclude patterns (uncomment them if you want to use them):
-# *.[oa]
-# *~
diff --git a/.git/logs/HEAD b/.git/logs/HEAD
deleted file mode 100644
--- a/.git/logs/HEAD
+++ /dev/null
@@ -1,1 +0,0 @@
-0000000000000000000000000000000000000000 8fae34c12b758b8247b79cc29df29238ddd17e21 deech <aditya.siram@gmail.com> 1424905185 -0600	clone: from http://github.com/deech/fltkhs
diff --git a/.git/logs/refs/heads/master b/.git/logs/refs/heads/master
deleted file mode 100644
--- a/.git/logs/refs/heads/master
+++ /dev/null
@@ -1,1 +0,0 @@
-0000000000000000000000000000000000000000 8fae34c12b758b8247b79cc29df29238ddd17e21 deech <aditya.siram@gmail.com> 1424905185 -0600	clone: from http://github.com/deech/fltkhs
diff --git a/.git/logs/refs/remotes/origin/HEAD b/.git/logs/refs/remotes/origin/HEAD
deleted file mode 100644
--- a/.git/logs/refs/remotes/origin/HEAD
+++ /dev/null
@@ -1,1 +0,0 @@
-0000000000000000000000000000000000000000 8fae34c12b758b8247b79cc29df29238ddd17e21 deech <aditya.siram@gmail.com> 1424905185 -0600	clone: from http://github.com/deech/fltkhs
diff --git a/.git/objects/pack/pack-df1277a71712eb9f9144a96c7fa9d332a97d5426.idx b/.git/objects/pack/pack-df1277a71712eb9f9144a96c7fa9d332a97d5426.idx
deleted file mode 100644
Binary files a/.git/objects/pack/pack-df1277a71712eb9f9144a96c7fa9d332a97d5426.idx and /dev/null differ
diff --git a/.git/objects/pack/pack-df1277a71712eb9f9144a96c7fa9d332a97d5426.pack b/.git/objects/pack/pack-df1277a71712eb9f9144a96c7fa9d332a97d5426.pack
deleted file mode 100644
# file too large to diff: .git/objects/pack/pack-df1277a71712eb9f9144a96c7fa9d332a97d5426.pack
diff --git a/.git/packed-refs b/.git/packed-refs
deleted file mode 100644
--- a/.git/packed-refs
+++ /dev/null
@@ -1,3 +0,0 @@
-# pack-refs with: peeled fully-peeled 
-8943336c272ff8dab557abb3ee781cb1d209bd32 refs/remotes/origin/ABI
-8fae34c12b758b8247b79cc29df29238ddd17e21 refs/remotes/origin/master
diff --git a/.git/refs/heads/master b/.git/refs/heads/master
deleted file mode 100644
--- a/.git/refs/heads/master
+++ /dev/null
@@ -1,1 +0,0 @@
-8fae34c12b758b8247b79cc29df29238ddd17e21
diff --git a/.git/refs/remotes/origin/HEAD b/.git/refs/remotes/origin/HEAD
deleted file mode 100644
--- a/.git/refs/remotes/origin/HEAD
+++ /dev/null
@@ -1,1 +0,0 @@
-ref: refs/remotes/origin/master
diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,14 @@
 c-examples/Makefile
 c-src/Makefile
 dist/*
+/CMakeCache.txt
+/CMakeFiles/
+/c-lib/
+/c-src/CMakeFiles/
+/c-src/cmake_install.cmake
+/CMakeFiles/
+/CMakeCache.txt
+/c-src/CMakeFiles/
+/c-src/cmake_install.cmake
+/c-src/libfltkdyn.so
+/cmake_install.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,14 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+PROJECT(fltkc)
+
+SET(FLTKCONFIGCOMMAND "${FLTK_HOME}/lib/libfltk.a ${FLTK_HOME}/lib/libfltk_gl.a ${FLTK_HOME}/lib/libfltk_images.a ${FLTK_HOME}/lib/libfltk_jpeg.a ${FLTK_HOME}/lib/libfltk_png.a ${FLTK_HOME}/lib/libfltk_z.a ${FLTK_HOME}/lib/libfltk_forms.a")
+SET(FLTKCONFIGCOMMAND "${FLTKCONFIGCOMMAND} -mwindows -lglu32 -lopengl32 -lole32 -luuid -lcomctl32")
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/fltkhs.buildinfo.in
+               ${CMAKE_CURRENT_SOURCE_DIR}/fltkhs.buildinfo)
+FIND_PACKAGE(OpenGL REQUIRED)
+set_directory_properties(PROPERTIES
+                         ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_SOURCE_DIR}/cmake_install.cmake;
+                                                      ${CMAKE_CURRENT_SOURCE_DIR}/CMakeCache.txt;
+                                                      ${CMAKE_CURRENT_SOURCE_DIR}/CMakeFiles")
+ADD_SUBDIRECTORY(c-src)
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,8 +1,6 @@
 import Data.Maybe(fromJust)
 import Data.List(partition, isPrefixOf)
 import Distribution.Simple.Compiler
-import Distribution.Simple.Build
-import Distribution.Simple.Configure
 import Distribution.Simple.LocalBuildInfo
 import Distribution.PackageDescription
 import Distribution.Simple
@@ -10,41 +8,71 @@
 import Distribution.Simple.Setup
 import Distribution.Simple.Utils
 import Distribution.Verbosity
-import Distribution.Simple.Program(requireProgram, arProgram)
+import Control.Monad
+import Data.List
+import Distribution.Simple.Program
+  ( Program(..), ConfiguredProgram(..), programPath
+   , requireProgram, requireProgramVersion
+   , rawSystemProgramConf, rawSystemProgram
+   , greencardProgram, cpphsProgram, hsc2hsProgram, c2hsProgram
+   , happyProgram, alexProgram, ghcProgram, gccProgram, requireProgram, arProgram)
+import Distribution.Simple.Program.Db
 import Distribution.Simple.PreProcess
 import System.IO.Unsafe (unsafePerformIO)
 import qualified Distribution.Simple.Program.Ar    as Ar
 import qualified Distribution.ModuleName as ModuleName
 import Distribution.Simple.BuildPaths
-import System.Directory(getCurrentDirectory, getDirectoryContents, copyFile, doesDirectoryExist)
-import System.FilePath ( (</>), (<.>), takeExtension,
-                         takeDirectory, replaceExtension, splitExtension, combine, takeBaseName)
-import System.IO
-import Debug.Trace
-import Data.Graph
+import System.Directory(getCurrentDirectory, getDirectoryContents, doesDirectoryExist)
+import System.FilePath ( (</>), (<.>), takeExtension, combine, takeBaseName)
 import qualified Distribution.Simple.GHC  as GHC
 import qualified Distribution.Simple.JHC  as JHC
 import qualified Distribution.Simple.LHC  as LHC
 import qualified Distribution.Simple.UHC  as UHC
+import qualified Distribution.Simple.PackageIndex as PackageIndex
+import Distribution.PackageDescription as PD
+import qualified Distribution.InstalledPackageInfo as Installed
+import System.Environment (getEnv)
 
-main = defaultMainWithHooks autoconfUserHooks {
-         preConf = myPreConf,
-         buildHook = myBuildHook,
-         cleanHook = myCleanHook,
-         copyHook = copyCBindings
-       }
+main :: IO ()
+main = defaultMainWithHooks defaultUserHooks {
+  preConf = case buildOS of
+              Windows -> myCMakePreConf
+              _ -> myPreConf,
+  buildHook = myBuildHook,
+  cleanHook = myCleanHook,
+  copyHook = copyCBindings
+  }
 
+myPreConf :: Args -> ConfigFlags -> IO HookedBuildInfo
 myPreConf args flags = do
-   putStrLn "Running autoheader ..."
-   rawSystemExit normal "autoheader" []
    putStrLn "Running autoconf ..."
    rawSystemExit normal "autoconf" []
-   preConf autoconfUserHooks args flags
+   preConf defaultUserHooks args flags
 
+myCMakePreConf :: Args -> ConfigFlags -> IO HookedBuildInfo
+myCMakePreConf args flags =
+  do
+    let runCMake = do
+	fltkHome <- getEnv "FLTK_HOME"
+	putStrLn "Running cmake ..."
+	rawSystemExit verbose "cmake" [".", "-G", "MSYS Makefiles", "-DFLTK_HOME=" ++ fltkHome]
+    clibExists <- doesDirectoryExist fltkcdir
+    if (not clibExists)
+     then runCMake
+     else do
+       libs <- getDirectoryContents fltkcdir
+       if (null $ filter ((==) "libfltkc.a") libs)
+        then runCMake
+        else return ()
+       return ()
+    preConf defaultUserHooks args flags
+
 fltkcdir = unsafePerformIO getCurrentDirectory ++ "/c-lib"
 fltkclib = "fltkc"
 headerdir = unsafePerformIO getCurrentDirectory ++ "/c-src"
+currentdir :: FilePath
 currentdir = unsafePerformIO getCurrentDirectory
+getHeaders :: [FilePath]
 getHeaders = unsafePerformIO $ do
   contents <- getDirectoryContents headerdir
   let headerFiles = filter (\f -> takeExtension f == ".h" -- keep the headers
@@ -120,12 +148,16 @@
     _    -> die "Building is not supported with this compiler."
 
 myBuildHook pkg_descr local_bld_info user_hooks bld_flags =
-  do fltkcBuilt <- doesDirectoryExist fltkcdir
-     if not fltkcBuilt then
-       do putStrLn "==Compiling C bindings=="
-          rawSystemExit normal "make" ["src"]
-       else return ()
-     -- (buildHook autoconfUserHooks) pkg_descr local_bld_info user_hooks bld_flags
+  do let compileC = do
+             putStrLn "==Compiling C bindings=="
+             rawSystemExit normal "make" []
+     cdirexists <- doesDirectoryExist fltkcdir
+     if cdirexists
+       then
+       do
+        clibraries <- getDirectoryContents fltkcdir
+        when (null $ filter (Data.List.isInfixOf "fltkc") clibraries) compileC
+       else compileC
      let new_pkg_descr
            = removeExecutables . addHeaders . addIncludeDirs . withFltkc (++) $ pkg_descr
          new_local_bld_info = local_bld_info{localPkgDescr = new_pkg_descr}
@@ -137,7 +169,7 @@
                       _ -> False)
                (componentsConfigs new_local_bld_info)
          lib_lbi = new_local_bld_info{componentsConfigs = libs}
-     buildHook autoconfUserHooks new_pkg_descr lib_lbi user_hooks bld_flags
+     buildHook defaultUserHooks new_pkg_descr lib_lbi user_hooks bld_flags
      let distPref = fromFlag (buildDistPref bld_flags)
          dbFile = distPref </> "package.conf.inplace"
          verbosity = fromFlag (buildVerbosity bld_flags)
@@ -151,7 +183,9 @@
              (CLib lib) -> do cobjs <- getObjectFileDirContents >>=
                                          return .
                                            map (combine objectFileDir) .
-                                             filter (\ f -> takeExtension f == ".o")
+                                             filter (\ f -> case buildOS of
+                                                             Windows -> takeExtension f == ".obj"
+                                                             _ -> takeExtension f == ".o")
                               hobjs <- getHaskellObjects lib with_in_place pref objExtension True
                               let staticObjectFiles = hobjs ++ cobjs
                               (arProg, _ ) <- requireProgram verbosity arProgram
@@ -173,7 +207,7 @@
 
 copyCBindings :: PackageDescription -> LocalBuildInfo -> UserHooks -> CopyFlags -> IO ()
 copyCBindings pkg_descr lbi uhs flags = do
-    (copyHook autoconfUserHooks) pkg_descr lbi uhs flags
+    (copyHook defaultUserHooks) pkg_descr lbi uhs flags
     let libPref = libdir . absoluteInstallDirs pkg_descr lbi
                 . fromFlag . copyDest
                 $ flags
@@ -181,9 +215,9 @@
         ["c-lib/libfltkc.a", libPref]
     case buildOS of
      Linux -> rawSystemExit (fromFlag $ copyVerbosity flags) "cp"
-              ["c-lib/libfltkc.so", libPref]
+              ["c-lib/libfltkcdyn.so", libPref]
      _ -> return ()
 
 myCleanHook pd x uh cf = do
   rawSystemExit normal "make" ["clean"]
-  cleanHook autoconfUserHooks pd x uh cf
+  cleanHook defaultUserHooks pd x uh cf
diff --git a/c-examples/CMakeLists.txt b/c-examples/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/c-examples/CMakeLists.txt
@@ -0,0 +1,5 @@
+ADD_EXECUTABLE(foo foo.cxx)
+ADD_DEPENDENCIES(foo fltkc)
+TARGET_LINK_LIBRARIES(foo Ui)
+TARGET_LINK_LIBRARIES(foo ${FLTK_LIBRARIES})
+TARGET_LINK_LIBRARIES(foo ${OPENGL_LIBRARIES})
diff --git a/c-src/CMakeCopyObjectFiles.txt b/c-src/CMakeCopyObjectFiles.txt
new file mode 100644
--- /dev/null
+++ b/c-src/CMakeCopyObjectFiles.txt
@@ -0,0 +1,5 @@
+function(copyObjectFiles)
+  file(GLOB_RECURSE ObjectFiles ${CMAKE_CURRENT_SOURCE_DIR} *.obj)
+  file(COPY ${ObjectFiles} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../static_object_files)
+endfunction(copyObjectFiles)
+copyObjectFiles()
diff --git a/c-src/CMakeLists.txt b/c-src/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/c-src/CMakeLists.txt
@@ -0,0 +1,114 @@
+SET(SourceFiles
+  Fl_Menu_ButtonC.cpp
+  Fl_PositionerC.cpp
+	Fl_TimerC.cpp
+	Fl_Value_OutputC.cpp
+	Fl_Value_SliderC.cpp
+	Fl_ScrollbarC.cpp
+	Fl_RollerC.cpp
+	Fl_DialC.cpp
+	Fl_CounterC.cpp
+	Utils.cpp
+	xC.cpp
+	fl_utf8C.cpp
+	glC.cpp
+	glutC.cpp
+	DerivedText_Editor.cpp
+	DerivedShared_Image.cpp
+	filenameC.cpp
+	Fl_AskC.cpp
+	Fl_BitmapC.cpp
+	Fl_BoxC.cpp
+	Fl_BrowserC.cpp
+	Fl_ButtonC.cpp
+	Fl_CallbackC.cpp
+	Fl_C.cpp
+	Fl_Check_ButtonC.cpp
+	Fl_ChoiceC.cpp
+	Fl_ClockC.cpp
+	Fl_Color_ChooserC.cpp
+	Fl_Copy_SurfaceC.cpp
+	Fl_Double_WindowC.cpp
+	Fl_DrawC.cpp
+	Fl_DeviceC.cpp
+	Fl_EnumerationsC.cpp
+	Fl_File_BrowserC.cpp
+	Fl_File_IconC.cpp
+	Fl_File_InputC.cpp
+	Fl_File_ChooserC.cpp
+	Fl_Float_InputC.cpp
+	Fl_Gl_WindowC.cpp
+	Fl_GroupC.cpp
+	Fl_Hold_BrowserC.cpp
+	Fl_Image_SurfaceC.cpp
+	Fl_ImageC.cpp
+	Fl_Input_C.cpp
+	Fl_InputC.cpp
+	Fl_Int_InputC.cpp
+	Fl_Light_ButtonC.cpp
+	Fl_Menu_C.cpp
+	Fl_Menu_ItemC.cpp
+	Fl_Multi_BrowserC.cpp
+	Fl_Multiline_InputC.cpp
+	Fl_Multiline_OutputC.cpp
+	Fl_Native_File_ChooserC.cpp
+	Fl_OutputC.cpp
+	Fl_Overlay_WindowC.cpp
+	Fl_Paged_DeviceC.cpp
+	Fl_PixmapC.cpp
+	Fl_PNM_ImageC.cpp
+	Fl_PreferencesC.cpp
+	Fl_PrinterC.cpp
+	Fl_ProgressC.cpp
+	Fl_Radio_ButtonC.cpp
+	Fl_Radio_Light_ButtonC.cpp
+	Fl_Repeat_ButtonC.cpp
+	Fl_Return_ButtonC.cpp
+	Fl_RGB_ImageC.cpp
+	Fl_Round_ButtonC.cpp
+	Fl_Round_ClockC.cpp
+	Fl_Secret_InputC.cpp
+	Fl_Select_BrowserC.cpp
+  Fl_Shared_ImageC.cpp
+	fl_show_colormapC.cpp
+	Fl_Single_WindowC.cpp
+	Fl_SliderC.cpp
+	Fl_Sys_Menu_BarC.cpp
+	Fl_TableC.cpp
+	Fl_Table_RowC.cpp
+	Fl_TabsC.cpp
+	Fl_Text_BufferC.cpp
+	Fl_Text_DisplayC.cpp
+	Fl_Text_EditorC.cpp
+	Fl_Text_SelectionC.cpp
+	Fl_TileC.cpp
+	Fl_Toggle_ButtonC.cpp
+	Fl_TooltipC.cpp
+	Fl_TreeC.cpp
+	Fl_Tree_ItemC.cpp
+	Fl_Tree_PrefsC.cpp
+	Fl_ValuatorC.cpp
+	Fl_AdjusterC.cpp
+	Fl_Value_InputC.cpp
+	Fl_Value_SliderC.cpp
+	Fl_WidgetC.cpp
+	Fl_WindowC.cpp
+	Fl_WizardC.cpp
+  )
+
+ADD_DEFINITIONS("${CXX_FLAGS} -mwindows -DWIN32 -DUSE_OPENGL32 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -Wall -DINTERNAL_LINKAGE -g -Icpp -I\"${FLTK_HOME}\"")
+
+MESSAGE(STATUS ${CXX_FLAGS})
+ADD_LIBRARY(fltkc ${SourceFiles})
+
+set_target_properties(fltkc PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../c-lib)
+
+add_custom_command(TARGET fltkc PRE_LINK
+                   COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/CMakeCopyObjectFiles.txt
+                   )
+set_directory_properties(PROPERTIES
+                         ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_SOURCE_DIR}/../c-lib;
+                                                      ${CMAKE_CURRENT_SOURCE_DIR}/../static_object_files;
+                                                      ${CMAKE_CURRENT_SOURCE_DIR}/cmake_install.cmake;
+                                                      ${CMAKE_CURRENT_SOURCE_DIR}/CMakeCache.txt;
+                                                      ${CMAKE_CURRENT_SOURCE_DIR}/CMakeFiles;")
diff --git a/c-src/Fl_ExportMacros.h b/c-src/Fl_ExportMacros.h
--- a/c-src/Fl_ExportMacros.h
+++ b/c-src/Fl_ExportMacros.h
@@ -12,8 +12,6 @@
 #else
   #ifdef _WIN32
     #define FL_EXPORT_C(TYPE,FUNC_NAME) extern __declspec(dllexport) TYPE __cdecl FUNC_NAME
-    #undef EXPORT
-    #define EXPORT extern "C" __declspec(dllexport) 
   #else
     #define FL_EXPORT_C(TYPE,FUNC_NAME) extern TYPE FUNC_NAME
   #endif
diff --git a/c-src/Fl_Types.h b/c-src/Fl_Types.h
--- a/c-src/Fl_Types.h
+++ b/c-src/Fl_Types.h
@@ -43,7 +43,7 @@
 
 #define FL_NORMAL_TIMER 0
 #define FL_VALUE_TIMER  1
-#define FL_HIDDEN_TIMER 2  
+#define FL_HIDDEN_TIMER 2
 
 #define FL_SORT_ASCENDING	0	/**< sort browser items in ascending alphabetic order. */
 #define FL_SORT_DESCENDING	1	/**< sort in descending order */
@@ -179,7 +179,6 @@
     int height;
     const char *name;
   } page_format;
-#include <config.h>
 #  ifdef __APPLE__
 #    include <OpenGL/gl.h>
 #  else
diff --git a/c-src/Makefile.in b/c-src/Makefile.in
--- a/c-src/Makefile.in
+++ b/c-src/Makefile.in
@@ -112,25 +112,25 @@
 	SONAME_FLAGS= -shared -Wl,-soname
 endif
 .SILENT:
-all: libfltkc.a libfltkc.$(SHARED_EXT)
+all: libfltkc.a libfltkcdyn.$(SHARED_EXT)
 .SUFFIXES: .cpp .o
 .cpp.o:
 	test -d $(STATIC_OBJECT_FILES) || mkdir $(STATIC_OBJECT_FILES)
 	test -d $(SHARED_OBJECT_FILES) || mkdir $(SHARED_OBJECT_FILES)
 	@echo "*** Compiling $<..."
-	$(CXXSTATIC) -c $^ -o $(STATIC_OBJECT_FILES)/$@
+	$(CXXSTATIC) -c -fPIC $^ -o $(STATIC_OBJECT_FILES)/$@
 	$(CXXSHARED) -c -fPIC $^ -o $(SHARED_OBJECT_FILES)/$@
 libfltkc.a : $(OBJECTS)
 	test -d $(LIBDIR) || mkdir $(LIBDIR)
 	@echo "*** Linking $@..."
 	(cd $(STATIC_OBJECT_FILES); \
 	ar rcs $(LIBDIR)/$@ $^;)
-libfltkc.so : $(OBJECTS)
+libfltkcdyn.so : $(OBJECTS)
 	test -d $(LIBDIR) || mkdir $(LIBDIR)
 	@echo "*** Linking $@..."
 	(cd $(SHARED_OBJECT_FILES); \
 	$(CXX) $(SONAME_FLAGS),$(LIBDIR)/$@ -o $(LIBDIR)/$@ $^);
-libfltkc.dylib: $(OBJECTS)
+libfltkcdyn.dylib: $(OBJECTS)
 	@echo "*** Not linking $@ because of bugs in ./c-src/Makefile.in, help appreciated."
 clean:
 	test -d $(LIBDIR) && rm -rf $(LIBDIR)
diff --git a/c-src/xC.h b/c-src/xC.h
--- a/c-src/xC.h
+++ b/c-src/xC.h
@@ -4,9 +4,12 @@
 // always include the FL/*.H headers before local headers
 // X is included transitively and needed for
 // the callback mechanism included below to work.
+#ifdef _WIN32
+ #define FL_LIBRARY 1
+#endif
 #include "FL/Fl.H"
-#include "FL/x.H"
 #include "Fl_CallbackC.h"
+#include "FL/x.H"
 EXPORT {
 #endif
 #if !defined(WIN32) && !defined(__APPLE__)
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,6 @@
 AC_PREREQ([2.60])
 AC_INIT([fltkc], [0.1], [aditya dawt siram ayt gmail dawt com])
 AC_CONFIG_SRCDIR([c-src/Fl_C.h])
-AC_CONFIG_HEADERS([config.h])
 
 # Checks for programs.
 AC_PROG_CXX
diff --git a/fltkhs.buildinfo.in b/fltkhs.buildinfo.in
--- a/fltkhs.buildinfo.in
+++ b/fltkhs.buildinfo.in
@@ -1,1 +1,2 @@
 ld-options: @FLTKCONFIGCOMMAND@ -lstdc++
+include-dirs: @FLTK_HOME@
diff --git a/fltkhs.cabal b/fltkhs.cabal
--- a/fltkhs.cabal
+++ b/fltkhs.cabal
@@ -1,5 +1,5 @@
 name: fltkhs
-version: 0.1.0.1
+version: 0.1.0.2
 synopsis: FLTK bindings
 description:
     Low level bindings for the FLTK GUI toolkit.
@@ -111,10 +111,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-table-as-container
   Main-Is: table-as-container.hs
@@ -124,10 +122,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-texteditor-simple
   Main-Is: texteditor-simple.hs
@@ -137,10 +133,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-textdisplay-with-colors
   Main-Is: textdisplay-with-colors.hs
@@ -150,10 +144,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-hello-world
   Main-Is: hello-world.hs
@@ -163,10 +155,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-doublebuffer
   Main-Is: doublebuffer.hs
@@ -176,10 +166,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-make-tree
   Main-Is: make-tree.hs
@@ -189,10 +177,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-tree-simple
   Main-Is: tree-simple.hs
@@ -202,10 +188,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-table-spreadsheet-with-keyboard-nav
   Main-Is: table-spreadsheet-with-keyboard-nav.hs
@@ -215,10 +199,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-test_call
   Main-Is: TestCall.hs
@@ -228,10 +210,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-buttons
   Main-Is: Buttons.hs
@@ -241,10 +221,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-table-simple
   Main-Is: table-simple.hs
@@ -254,10 +232,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-table-sort
   Main-Is: table-sort.hs
@@ -268,10 +244,8 @@
     process
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-arc
   Main-Is: arc.hs
@@ -281,10 +255,8 @@
     fltkhs
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-bitmap
   Main-Is: bitmap.hs
@@ -294,10 +266,8 @@
      fltkhs,bytestring
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-boxtype
   Main-Is: boxtype.hs
@@ -307,10 +277,8 @@
      fltkhs,bytestring
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-browser
   Main-Is: browser.hs
@@ -321,10 +289,8 @@
      bytestring
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
 
 Executable fltkhs-clock
   Main-Is: clock.hs
@@ -335,7 +301,5 @@
      bytestring
   default-language: Haskell2010
   ghc-Options: -Wall -threaded -fcontext-stack=220
-  if os(linux)
-     ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
-  else
-     ghc-Options:
+  if !os(darwin)
+    ghc-Options: -pgml g++ "-optl-Wl,--whole-archive" "-optl-Wl,-Bstatic" "-optl-Wl,-lfltkc" "-optl-Wl,-Bdynamic" "-optl-Wl,--no-whole-archive"
diff --git a/src/Graphics/UI/FLTK/LowLevel/FLTKHS.hs b/src/Graphics/UI/FLTK/LowLevel/FLTKHS.hs
--- a/src/Graphics/UI/FLTK/LowLevel/FLTKHS.hs
+++ b/src/Graphics/UI/FLTK/LowLevel/FLTKHS.hs
@@ -8,10 +8,14 @@
          --
          -- $Goals
 
-         -- * Installation
+         -- * Installation (Linux & Mac)
          --
-         -- $Installation
+         -- $InstallationLinux
 
+         -- * Installation (Windows 64-bit)
+         --
+         -- $InstallationWindows
+
          -- * Demos
          --
          -- $Demos
@@ -213,8 +217,7 @@
 -- (7) includes a lot of complete working demos so that the user can get up and running faster
 --
 
--- $Installation
--- Unfortunately this package does not currently install in Windows. The instructions below are only for OSX and Linux.
+-- $InstallationLinux
 --
 -- - Make sure you have OpenGL installed
 -- - Download and install <http://www.fltk.org/software.php?VERSION=1.3.3&FILE=fltk/1.3.3/fltk-1.3.3-source.tar.gz FLTK 1.3.3>.
@@ -249,6 +252,114 @@
 --
 --     > > fltkhs-hello-world
 --
+
+-- $InstallationWindows
+--
+-- Note: Currently this package only works on 64-bit Windows.
+--
+-- This install guide has been tested on Windows 7 64-bit with 8GB of RAM.
+--
+--
+-- The general steps involved are:
+--
+--  - Install <https://github.com/fpco/minghc MinGHC> and upgrade cabal-install
+--  - Install <http://www.cmake.org/files/v3.2/cmake-3.2.1-win32-x86.exe CMake>
+--  - Download & compile <http://www.fltk.org/software.php?VERSION=1.3.3&FILE=fltk/1.3.3/fltk-1.3.3-source.tar.gz FLTK 1.3.3>
+--  - Install this package
+--
+-- == Install MinGHC
+-- MinGHC installers are available <https://github.com/fpco/minghc here>. This package has been tested with GHC 7.8.4 64-bit and may work with newer versions.
+--
+-- Once MinGHC is downloaded and installed per the instructions in the link above, install the newest version of cabal-install. This is an important step because the `Setup.hs` that ships with this package uses some of the newer features of the Cabal 1.2.x API.
+--
+-- @
+-- > cabal update
+-- > cabal install cabal-install
+-- @
+--
+-- == Install CMake
+-- Simply click through the <http://www.cmake.org/files/v3.2/cmake-3.2.1-win32-x86.exe CMake> with the default options. Once this process is complete the `cmake` executable should be available at the CMD prompt:
+--
+-- @
+-- > cmake --version
+-- cmake version 2.8.11.2
+-- @
+--
+-- Your version will likely be `cmake version 3.2.x` but so long as it is above `cmake version 2.6.x` the install should proceed smoothly.
+--
+-- == Download & compile FLTK-1.3.3
+-- Please make sure to only download version <http://www.fltk.org/software.php?VERSION=1.3.3&FILE=fltk/1.3.3/fltk-1.3.3-source.tar.gz FLTK 1.3.3>.
+--
+-- Once this is downloaded, since the `tar` and `gunzip` utilities ship with MinGHC, you should be able to unpack it at the command prompt:
+--
+-- @
+-- > tar -zxvf fltk-1.3.3-source.tar.gz
+-- @
+--
+-- Then descend into the source directory:
+--
+-- @
+-- > cd fltkh-1.3.3-source
+-- @
+--
+-- Make a build directory to hold the generated CMake files:
+--
+-- @
+-- > mkdir build
+-- @
+--
+-- Descend into the `build` directory:
+--
+-- @
+-- > cd build
+-- @
+--
+-- And run `cmake` telling it to work with the `make` utility that ships with MSYS:
+--
+-- @
+-- > cmake .. -G "MSYS Makefiles"
+-- @
+--
+-- Please note the `..` after `cmake` in the command. This is important because it tells CMake to build using the CMake specification found in the parent directory.
+--
+-- Once these steps have been completed you should be able to compile the source:
+--
+-- @
+-- > make
+-- @
+--
+--
+-- Each compile step may spit out a scary looking warning about a pointer to int cast, but this can be safely ignored. It seems to be an issue with the MinGW g++/gcc compiler.
+--
+-- Also, the final demo `windowFocus` may fail to compile and complain about a symbol being redefined. This is again an issue with MinGW and can be safely ignored.
+--
+-- Now it is necessary to define the `FLTK_HOME` environment variable so this package knows where to look for header and library files:
+--
+-- @
+-- > set FLTK_HOME=\<path-to-the-FLTK-root-directory\>
+-- @
+--
+-- == Install this package
+--
+-- At this point it is highly likely that running `cabal --version` at the command line still invokes the old version even though `cabal` was updated. This is because the location of the newly installed `cabal` has not been added to the PATH variable. You can do so with this command:
+--
+-- @
+-- > set PATH=C:\\Users\\\<your-username\>\\AppData\\Roaming\\cabal\\bin;%PATH%
+-- @
+--
+-- Now you can finally install this package:
+--
+-- @
+-- > > cabal install fltkhs
+-- @
+--
+-- Please note that compared to the Linux and Mac installs the compilation process takes a very long time. The reason for this is the MinGW gcc/g++ compilers are much slower.
+--
+-- Once this has completed, you can test it by:
+--
+-- @
+-- > fltkhs-hello-world
+-- @
 
 -- $Demos
 --
