diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,6 @@
-Copyright (c) <2009>, <Maurício C. Antunes>
+Copyright (c) 2009-2011 Maurício C. Antunes <mauricio.antunes@gmail.com>
+Copyright (c) 2011      Bas van Dijk <v.dijk.bas@gmail.com>
+
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/README.markdown b/README.markdown
new file mode 100644
--- /dev/null
+++ b/README.markdown
@@ -0,0 +1,31 @@
+Low level bindings to
+[libusb-1.*](http://libusb.sourceforge.net/api-1.0/)
+
+This package uses
+[bindings-DSL](http://hackage.haskell.org/package/bindings-DSL) and
+conforms to its naming convention.
+
+For a higher-level and more Haskell friendly binding (which uses this
+package) see the [usb](http://hackage.haskell.org/package/usb)
+package.
+
+# Installing
+
+Make sure the `libusb` C library is installed:
+
+* *Ubuntu Linux*: `sudo apt-get install libusb-1.0-0-dev`
+* *Gentoo Linux*: `sudo emerge libusb`
+* *MS Windows*:
+    [Download `libusb` for MS Windows](http://www.libusb.org/wiki/windows_backend#LatestBinarySnapshots)
+     and extract it somewhere e.g. `C:\Program Files\libusb\libusb1`.
+
+    Important build-time files: `libusb-1.0\include\libusb.h` and
+    `MinGW32\dll\libusb-1.0.dll.a`
+
+    Important run-time files: `MinGW32\dll\libusb-1.0.dll`
+
+    Make sure to use the following cabal options:
+
+        --extra-include-dirs="C:\Program Files\libusb\libusb1\include\libusb-1.0"
+
+        --extra-lib-dirs="C:\Program Files\libusb\libusb1\MinGW32\dll"
diff --git a/bindings-libusb.cabal b/bindings-libusb.cabal
--- a/bindings-libusb.cabal
+++ b/bindings-libusb.cabal
@@ -1,23 +1,38 @@
-cabal-version: >= 1.2.3
-name: bindings-libusb
-homepage: http://bitbucket.org/mauricio/bindings-libusb
-synopsis:
-  Low level bindings to libusb.
-version: 1.4.2
-license: BSD3
-license-file: LICENSE
-maintainer: Maurício C. Antunes <mauricio.antunes@gmail.com>
-author: Maurício C. Antunes
-build-type: Simple
-category: FFI
-bug-reports: http://bitbucket.org/mauricio/bindings-libusb/issues
+name:          bindings-libusb
+version:       1.4.4
+cabal-version: >= 1.6
+license:       BSD3
+license-file:  LICENSE
+author:        Maurício C. Antunes <mauricio.antunes@gmail.com>
+maintainer:    Bas van Dijk <v.dijk.bas@gmail.com>
+build-type:    Simple
+category:      FFI
+homepage:      https://github.com/basvandijk/bindings-libusb/
+bug-reports:   https://github.com/basvandijk/bindings-libusb/issues
+synopsis:      Low level bindings to libusb.
+description:   Low level bindings to @libusb-1.*@:
+               .
+               <http://libusb.sourceforge.net/api-1.0/>
+               .
+               This package uses @bindings-DSL@
+               and conforms to its naming convention.
+               .
+               For a higher-level and more Haskell friendly binding
+               (which uses this package) see the @usb@ package:
+               .
+               <http://hackage.haskell.org/package/usb>
+
+extra-source-files: README.markdown
+
+source-repository head
+  Type:     git
+  Location: git://github.com/basvandijk/bindings-libusb.git
+
 library
   hs-source-dirs: src
-  extensions:
-    ForeignFunctionInterface
   build-depends:
     base >= 3 && < 5,
-    bindings-DSL >= 1.0 && < 1.1
+    bindings-DSL >= 1.0.14 && < 1.1
   exposed-modules:
     Bindings.Libusb
     Bindings.Libusb.Asynchronous
@@ -29,5 +44,10 @@
     Bindings.Libusb.Synchronous
   c-sources:
     src/inlines.c
-    src/core.c
-  pkgconfig-depends: libusb-1.0 >= 1.0
+
+  if os(windows)
+    includes: libusb.h
+    extra-libraries: libusb-1.0
+    cc-options: -DBINDINGS_STDCALLCONV
+  else
+    pkgconfig-depends: libusb-1.0 >= 1.0.5
diff --git a/src/Bindings/Libusb.hs b/src/Bindings/Libusb.hs
--- a/src/Bindings/Libusb.hs
+++ b/src/Bindings/Libusb.hs
@@ -1,1 +1,17 @@
-module Bindings.Libusb (module Bindings.Libusb.Asynchronous,module Bindings.Libusb.Descriptors,module Bindings.Libusb.HandlingAndEnumeration,module Bindings.Libusb.InitializationDeinitialization,module Bindings.Libusb.Miscellaneous,module Bindings.Libusb.PollingAndTiming,module Bindings.Libusb.Synchronous) where {import Bindings.Libusb.Asynchronous;import Bindings.Libusb.Descriptors;import Bindings.Libusb.HandlingAndEnumeration;import Bindings.Libusb.InitializationDeinitialization;import Bindings.Libusb.Miscellaneous;import Bindings.Libusb.PollingAndTiming;import Bindings.Libusb.Synchronous}
+module Bindings.Libusb
+    ( module Bindings.Libusb.Asynchronous
+    , module Bindings.Libusb.Descriptors
+    , module Bindings.Libusb.HandlingAndEnumeration
+    , module Bindings.Libusb.InitializationDeinitialization
+    , module Bindings.Libusb.Miscellaneous
+    , module Bindings.Libusb.PollingAndTiming
+    , module Bindings.Libusb.Synchronous
+    ) where
+
+import Bindings.Libusb.Asynchronous
+import Bindings.Libusb.Descriptors
+import Bindings.Libusb.HandlingAndEnumeration
+import Bindings.Libusb.InitializationDeinitialization
+import Bindings.Libusb.Miscellaneous
+import Bindings.Libusb.PollingAndTiming
+import Bindings.Libusb.Synchronous
diff --git a/src/Bindings/Libusb/Asynchronous.hsc b/src/Bindings/Libusb/Asynchronous.hsc
--- a/src/Bindings/Libusb/Asynchronous.hsc
+++ b/src/Bindings/Libusb/Asynchronous.hsc
@@ -1,3 +1,5 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
 #include <bindings.dsl.h>
 #include <libusb.h>
 
diff --git a/src/Bindings/Libusb/Descriptors.hsc b/src/Bindings/Libusb/Descriptors.hsc
--- a/src/Bindings/Libusb/Descriptors.hsc
+++ b/src/Bindings/Libusb/Descriptors.hsc
@@ -1,3 +1,5 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
 #include <bindings.dsl.h>
 #include <libusb.h>
 
diff --git a/src/Bindings/Libusb/HandlingAndEnumeration.hsc b/src/Bindings/Libusb/HandlingAndEnumeration.hsc
--- a/src/Bindings/Libusb/HandlingAndEnumeration.hsc
+++ b/src/Bindings/Libusb/HandlingAndEnumeration.hsc
@@ -1,3 +1,5 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
 #include <bindings.dsl.h>
 #include <libusb.h>
 
diff --git a/src/Bindings/Libusb/InitializationDeinitialization.hsc b/src/Bindings/Libusb/InitializationDeinitialization.hsc
--- a/src/Bindings/Libusb/InitializationDeinitialization.hsc
+++ b/src/Bindings/Libusb/InitializationDeinitialization.hsc
@@ -1,3 +1,5 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
 #include <bindings.dsl.h>
 #include <libusb.h>
 
diff --git a/src/Bindings/Libusb/Miscellaneous.hsc b/src/Bindings/Libusb/Miscellaneous.hsc
--- a/src/Bindings/Libusb/Miscellaneous.hsc
+++ b/src/Bindings/Libusb/Miscellaneous.hsc
@@ -1,3 +1,5 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
 #include <bindings.dsl.h>
 #include <libusb.h>
 
diff --git a/src/Bindings/Libusb/PollingAndTiming.hsc b/src/Bindings/Libusb/PollingAndTiming.hsc
--- a/src/Bindings/Libusb/PollingAndTiming.hsc
+++ b/src/Bindings/Libusb/PollingAndTiming.hsc
@@ -1,3 +1,5 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
 #include <bindings.dsl.h>
 #include <libusb.h>
 
@@ -31,6 +33,7 @@
 #ccall libusb_handle_events , Ptr <libusb_context> -> IO CInt
 #ccall libusb_handle_events_locked , Ptr <libusb_context> ->  \
   Ptr <timeval> -> IO CInt
+#ccall libusb_pollfds_handle_timeouts , Ptr <libusb_context> -> IO CInt
 #ccall libusb_get_next_timeout , Ptr <libusb_context> ->  \
   Ptr <timeval> -> IO CInt
 #ccall libusb_set_pollfd_notifiers , Ptr <libusb_context> ->  \
diff --git a/src/Bindings/Libusb/Synchronous.hsc b/src/Bindings/Libusb/Synchronous.hsc
--- a/src/Bindings/Libusb/Synchronous.hsc
+++ b/src/Bindings/Libusb/Synchronous.hsc
@@ -1,3 +1,5 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
 #include <bindings.dsl.h>
 #include <libusb.h>
 
diff --git a/src/core.c b/src/core.c
deleted file mode 100644
--- a/src/core.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * All code from this file comes from libusb-1.0.5. It is here
- * to provide 'libusb_get_max_iso_packet_size' for those using
- * libusb-1.0.1, and will be removed when at least libusb-1.0.3
- * becomes standard in most popular Linux distributions.
- *
- * This is LGPL code, and should not be mixed with the rest of
- * the source. For details on file authors and history check
- * libusb-1.0.* source package, available on its website.
- */
-
-#include <errno.h>
-#include <poll.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "libusb.h"
-
-struct libusb_device {
- pthread_mutex_t a; int b;
- struct libusb_context *ctx;
-};
-
-enum usbi_log_level {
- LOG_LEVEL_DEBUG,
- LOG_LEVEL_INFO,
- LOG_LEVEL_WARNING,
- LOG_LEVEL_ERROR,
-};
-
-
-static const struct libusb_endpoint_descriptor *find_endpoint(
- struct libusb_config_descriptor *, unsigned char);
-
-void usbi_log(struct libusb_context *ctx, enum usbi_log_level level,
- const char *function, const char *format, ...)
-{
- va_list args;
- FILE *stream = stdout;
- const char *prefix;
-
- switch (level) {
- case LOG_LEVEL_INFO:
-  prefix = "info";
-  break;
- case LOG_LEVEL_WARNING:
-  stream = stderr;
-  prefix = "warning";
-  break;
- case LOG_LEVEL_ERROR:
-  stream = stderr;
-  prefix = "error";
-  break;
- case LOG_LEVEL_DEBUG:
-  stream = stderr;
-  prefix = "debug";
-  break;
- default:
-  stream = stderr;
-  prefix = "unknown";
-  break;
- }
-
- fprintf(stream, "libusb:%s [%s] ", prefix, function);
-
- va_start (args, format);
- vfprintf(stream, format, args);
- va_end (args);
-
- fprintf(stream, "\n");
-}
-
-int libusb_get_max_iso_packet_size(libusb_device *dev,
- unsigned char endpoint)
-{
- struct libusb_config_descriptor *config;
- const struct libusb_endpoint_descriptor *ep;
- enum libusb_transfer_type ep_type;
- uint16_t val;
- int r;
-
- r = libusb_get_active_config_descriptor(dev, &config);
- if (r < 0) {
-  usbi_log((dev)->ctx, 3, __FUNCTION__, "could not retrieve active config descriptor");
-  return LIBUSB_ERROR_OTHER;
- }
-
- ep = find_endpoint(config, endpoint);
- if (!ep)
-  return LIBUSB_ERROR_NOT_FOUND;
-
- val = ep->wMaxPacketSize;
- ep_type = ep->bmAttributes & 0x3;
- libusb_free_config_descriptor(config);
-
- r = val & 0x07ff;
- if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS
-   || ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT)
-  r *= (1 + ((val >> 11) & 3));
- return r;
-}
-
-static const struct libusb_endpoint_descriptor *find_endpoint(
- struct libusb_config_descriptor *config, unsigned char endpoint)
-{
- int iface_idx;
- for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) {
-  const struct libusb_interface *iface = &config->interface[iface_idx];
-  int altsetting_idx;
-
-  for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting;
-    altsetting_idx++) {
-   const struct libusb_interface_descriptor *altsetting
-    = &iface->altsetting[altsetting_idx];
-   int ep_idx;
-
-   for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; ep_idx++) {
-    const struct libusb_endpoint_descriptor *ep =
-     &altsetting->endpoint[ep_idx];
-    if (ep->bEndpointAddress == endpoint)
-     return ep;
-   }
-  }
- }
- return NULL;
-}
-
-
-
