diff --git a/Bindings/APR.hsc b/Bindings/APR.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR.hsc
@@ -0,0 +1,180 @@
+#include <bindings.dsl.h>
+#include <apr.h>
+
+module Bindings.APR where
+#strict_import
+
+{- I'm not sure if these are really helpful... (PHO)
+ -}
+#num APR_HAS_INLINE
+
+#num APR_HAVE_ARPA_INET_H
+#num APR_HAVE_CONIO_H
+#num APR_HAVE_CRYPT_H
+#num APR_HAVE_CTYPE_H
+#num APR_HAVE_DIRENT_H
+#num APR_HAVE_ERRNO_H
+#num APR_HAVE_FCNTL_H
+#num APR_HAVE_IO_H
+#num APR_HAVE_LIMITS_H
+#num APR_HAVE_NETDB_H
+#num APR_HAVE_NETINET_IN_H
+#num APR_HAVE_NETINET_SCTP_H
+#num APR_HAVE_NETINET_SCTP_UIO_H
+#num APR_HAVE_NETINET_TCP_H
+#num APR_HAVE_PTHREAD_H
+#num APR_HAVE_SEMAPHORE_H
+#num APR_HAVE_SIGNAL_H
+#num APR_HAVE_STDARG_H
+#num APR_HAVE_STDINT_H
+#num APR_HAVE_STDIO_H
+#num APR_HAVE_STDLIB_H
+#num APR_HAVE_STRING_H
+#num APR_HAVE_STRINGS_H
+#num APR_HAVE_SYS_IOCTL_H
+#num APR_HAVE_SYS_SENDFILE_H
+#num APR_HAVE_SYS_SIGNAL_H
+#num APR_HAVE_SYS_SOCKET_H
+#num APR_HAVE_SYS_SOCKIO_H
+#num APR_HAVE_SYS_SYSLIMITS_H
+#num APR_HAVE_SYS_TIME_H
+#num APR_HAVE_SYS_TYPES_H
+#num APR_HAVE_SYS_UIO_H
+#num APR_HAVE_SYS_UN_H
+#num APR_HAVE_SYS_WAIT_H
+#num APR_HAVE_TIME_H
+#num APR_HAVE_UNISTD_H
+#num APR_HAVE_WINDOWS_H
+#num APR_HAVE_WINSOCK2_H
+
+#num APR_HAVE_SHMEM_MMAP_TMP
+#num APR_HAVE_SHMEM_MMAP_SHM
+#num APR_HAVE_SHMEM_MMAP_ZERO
+#num APR_HAVE_SHMEM_SHMGET_ANON
+#num APR_HAVE_SHMEM_SHMGET
+#num APR_HAVE_SHMEM_MMAP_ANON
+#num APR_HAVE_SHMEM_BEOS
+
+#num APR_USE_SHMEM_MMAP_TMP
+#num APR_USE_SHMEM_MMAP_SHM
+#num APR_USE_SHMEM_MMAP_ZERO
+#num APR_USE_SHMEM_SHMGET_ANON
+#num APR_USE_SHMEM_SHMGET
+#num APR_USE_SHMEM_MMAP_ANON
+#num APR_USE_SHMEM_BEOS
+
+#num APR_USE_FLOCK_SERIALIZE
+#num APR_USE_SYSVSEM_SERIALIZE
+#num APR_USE_POSIXSEM_SERIALIZE
+#num APR_USE_FCNTL_SERIALIZE
+#num APR_USE_PROC_PTHREAD_SERIALIZE
+#num APR_USE_PTHREAD_SERIALIZE
+
+#num APR_HAS_FLOCK_SERIALIZE
+#num APR_HAS_SYSVSEM_SERIALIZE
+#num APR_HAS_POSIXSEM_SERIALIZE
+#num APR_HAS_FCNTL_SERIALIZE
+#num APR_HAS_PROC_PTHREAD_SERIALIZE
+
+#num APR_PROCESS_LOCK_IS_GLOBAL
+
+#num APR_HAVE_CORKABLE_TCP
+#num APR_HAVE_GETRLIMIT
+#num APR_HAVE_IN_ADDR
+#num APR_HAVE_INET_ADDR
+#num APR_HAVE_INET_NETWORK
+#num APR_HAVE_IPV6
+#num APR_HAVE_MEMMOVE
+#num APR_HAVE_SETRLIMIT
+#num APR_HAVE_SIGACTION
+#num APR_HAVE_SIGSUSPEND
+#num APR_HAVE_SIGWAIT
+#num APR_HAVE_SA_STORAGE
+#num APR_HAVE_STRCASECMP
+#num APR_HAVE_STRDUP
+#num APR_HAVE_STRICMP
+#num APR_HAVE_STRNCASECMP
+#num APR_HAVE_STRNICMP
+#num APR_HAVE_STRSTR
+#num APR_HAVE_MEMCHR
+#num APR_HAVE_STRUCT_RLIMIT
+#num APR_HAVE_UNION_SEMUN
+#num APR_HAVE_SCTP
+#num APR_HAVE_IOVEC
+
+#num APR_HAS_SHARED_MEMORY
+#num APR_HAS_THREADS
+#num APR_HAS_SENDFILE
+#num APR_HAS_MMAP
+#num APR_HAS_FORK
+#num APR_HAS_RANDOM
+#num APR_HAS_OTHER_CHILD
+#num APR_HAS_DSO
+#num APR_HAS_SO_ACCEPTFILTER
+#num APR_HAS_UNICODE_FS
+#num APR_HAS_PROC_INVOKED
+#num APR_HAS_USER
+#num APR_HAS_LARGE_FILES
+#num APR_HAS_XTHREAD_FILES
+#num APR_HAS_OS_UUID
+
+#num APR_PROCATTR_USER_SET_REQUIRES_PASSWORD
+
+#if APR_HAVE_NETINET_TCP_H
+#include <netinet/tcp.h>
+#endif
+
+#num APR_FILES_AS_SOCKETS
+#num APR_CHARSET_EBCDIC
+#num APR_TCP_NOPUSH_FLAG
+#num APR_TCP_NODELAY_INHERITED
+#num APR_O_NONBLOCK_INHERITED
+
+#integral_t apr_byte_t
+
+#integral_t apr_int16_t
+#integral_t apr_uint16_t
+
+#integral_t apr_int32_t
+#integral_t apr_uint32_t
+
+#integral_t apr_int64_t
+#integral_t apr_uint64_t
+
+#integral_t apr_size_t
+#integral_t apr_ssize_t
+#integral_t apr_off_t
+#integral_t apr_socklen_t
+#integral_t apr_ino_t
+
+#num APR_SIZEOF_VOIDP
+#integral_t apr_uintptr_t
+
+#num APR_IS_BIGENDIAN
+
+#num APR_INT16_MIN
+#num APR_INT16_MAX
+#num APR_UINT16_MAX
+#num APR_INT32_MIN
+#num APR_INT32_MAX
+#num APR_UINT32_MAX
+#num APR_INT64_MIN
+#num APR_INT64_MAX
+#num APR_UINT64_MAX
+#num APR_SIZE_MAX
+
+#globalarray APR_SSIZE_T_FMT     , CChar
+#globalarray APR_SIZE_T_FMT      , CChar
+#globalarray APR_OFF_T_FMT       , CChar
+#globalarray APR_PID_T_FMT       , CChar
+#globalarray APR_INT64_T_FMT     , CChar
+#globalarray APR_UINT64_T_FMT    , CChar
+#globalarray APR_UINT64_T_HEX_FMT, CChar
+#num APR_PROC_MUTEX_IS_GLOBAL
+#globalarray APR_EOL_STR         , CChar
+
+#opaque_t apr_wait_t
+
+#num APR_PATH_MAX
+
+#globalarray APR_DSOPATH, CChar
diff --git a/Bindings/APR/Allocator/Types.hsc b/Bindings/APR/Allocator/Types.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Allocator/Types.hsc
@@ -0,0 +1,17 @@
+#include <bindings.dsl.h>
+#include <apr_allocator.h>
+
+module Bindings.APR.Allocator.Types where
+#strict_import
+import Bindings.APR
+
+#opaque_t apr_allocator_t
+
+#starttype struct apr_memnode_t
+#  field next       , Ptr <apr_memnode_t>
+#  field ref        , Ptr (Ptr <apr_memnode_t>)
+#  field index      , <apr_uint32_t>
+#  field free_index , <apr_uint32_t>
+#  field first_avail, Ptr CChar
+#  field endp       , Ptr CChar
+#stoptype
diff --git a/Bindings/APR/Atomic.hsc b/Bindings/APR/Atomic.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Atomic.hsc
@@ -0,0 +1,22 @@
+#include <bindings.dsl.h>
+#include <apr_atomic.h>
+
+module Bindings.APR.Atomic where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#ccall apr_atomic_init, Ptr <apr_pool_t> -> IO <apr_status_t>
+
+#ccall apr_atomic_read32, Ptr <apr_uint32_t> -> IO <apr_uint32_t>
+#ccall apr_atomic_set32 , Ptr <apr_uint32_t> -> <apr_uint32_t> -> IO ()
+#ccall apr_atomic_add32 , Ptr <apr_uint32_t> -> <apr_uint32_t> -> IO <apr_uint32_t>
+#ccall apr_atomic_sub32 , Ptr <apr_uint32_t> -> <apr_uint32_t> -> IO ()
+#ccall apr_atomic_inc32 , Ptr <apr_uint32_t> -> IO <apr_uint32_t>
+#ccall apr_atomic_dec32 , Ptr <apr_uint32_t> -> IO CInt
+#ccall apr_atomic_cas32 , Ptr <apr_uint32_t> -> <apr_uint32_t> -> <apr_uint32_t> -> IO <apr_uint32_t>
+#ccall apr_atomic_xchg32, Ptr <apr_uint32_t> -> <apr_uint32_t> -> IO <apr_uint32_t>
+
+#ccall apr_atomic_casptr , Ptr (Ptr ()) -> Ptr () -> Ptr () -> IO (Ptr ())
+#ccall apr_atomic_xchgptr, Ptr (Ptr ()) -> Ptr () -> IO (Ptr ())
diff --git a/Bindings/APR/DSO.hsc b/Bindings/APR/DSO.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/DSO.hsc
@@ -0,0 +1,20 @@
+#include <bindings.dsl.h>
+#include <apr_dso.h>
+
+module Bindings.APR.DSO where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#if APR_HAS_DSO
+
+#  opaque_t  apr_dso_handle_t
+#  synonym_t apr_dso_handle_sym_t, Ptr ()
+
+#  ccall apr_dso_load  , Ptr (Ptr <apr_dso_handle_t>) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall apr_dso_unload, Ptr <apr_dso_handle_t> -> IO <apr_status_t>
+#  ccall apr_dso_sym   , Ptr <apr_dso_handle_sym_t> -> Ptr <apr_dso_handle_t> -> Ptr CChar -> IO <apr_status_t>
+#  ccall apr_dso_error , Ptr <apr_dso_handle_t> -> Ptr CChar -> <apr_size_t> -> IO (Ptr CChar)
+
+#endif
diff --git a/Bindings/APR/Env.hsc b/Bindings/APR/Env.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Env.hsc
@@ -0,0 +1,11 @@
+#include <bindings.dsl.h>
+#include <apr_env.h>
+
+module Bindings.APR.Env where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#ccall apr_env_get   , Ptr (Ptr CChar) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_env_set   , Ptr CChar -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_env_delete, Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
diff --git a/Bindings/APR/ErrNo.hsc b/Bindings/APR/ErrNo.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/ErrNo.hsc
@@ -0,0 +1,173 @@
+#include <bindings.dsl.h>
+#include <apr_errno.h>
+
+module Bindings.APR.ErrNo where
+#strict_import
+import Bindings.APR
+
+#integral_t apr_status_t
+
+#ccall apr_strerror, <apr_status_t> -> Ptr CChar -> <apr_size_t> -> IO (Ptr CChar)
+
+#num APR_OS_START_ERROR
+#num APR_OS_ERRSPACE_SIZE
+#num APR_UTIL_ERRSPACE_SIZE
+#num APR_OS_START_STATUS
+#num APR_UTIL_START_STATUS
+#num APR_OS_START_USERERR
+#num APR_OS_START_USEERR
+#num APR_OS_START_CANONERR
+#num APR_OS_START_EAIERR
+#num APR_OS_START_SYSERR
+
+#num APR_SUCCESS
+
+#num APR_ENOSTAT
+#num APR_ENOPOOL
+#num APR_EBADDATE
+#num APR_EINVALSOCK
+#num APR_ENOPROC
+#num APR_ENOTIME
+#num APR_ENODIR
+#num APR_ENOLOCK
+#num APR_ENOPOLL
+#num APR_ENOSOCKET
+#num APR_ENOTHREAD
+#num APR_ENOTHDKEY
+#num APR_EGENERAL
+#num APR_ENOSHMAVAIL
+#num APR_EBADIP
+#num APR_EBADMASK
+#num APR_EDSOOPEN
+#num APR_EABSOLUTE
+#num APR_ERELATIVE
+#num APR_EINCOMPLETE
+#num APR_EABOVEROOT
+#num APR_EBADPATH
+#num APR_EPATHWILD
+#num APR_ESYMNOTFOUND
+#num APR_EPROC_UNKNOWN
+#num APR_ENOTENOUGHENTROPY
+
+#cinline APR_STATUS_IS_ENOSTAT     , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOPOOL     , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EBADDATE    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EINVALSOCK  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOPROC     , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOTIME     , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENODIR      , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOLOCK     , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOSOCKET   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOTHREAD   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOTHDKEY   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EGENERAL    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOSHMAVAIL , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EBADIP      , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EBADMASK    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EDSOOPEN    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EABSOLUTE   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ERELATIVE   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EINCOMPLETE , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EABOVEROOT  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EBADPATH    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EPATHWILD   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ESYMNOTFOUND, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EPROC_UNKNOWN    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOTENOUGHENTROPY, <apr_status_t> -> IO CInt
+
+#num APR_INCHILD
+#num APR_INPARENT
+#num APR_DETACH
+#num APR_NOTDETACH
+#num APR_CHILD_DONE
+#num APR_CHILD_NOTDONE
+#num APR_TIMEUP
+#num APR_INCOMPLETE
+#num APR_BADCH
+#num APR_BADARG
+#num APR_EOF
+#num APR_NOTFOUND
+#num APR_ANONYMOUS
+#num APR_FILEBASED
+#num APR_KEYBASED
+#num APR_EINIT
+#num APR_ENOTIMPL
+#num APR_EMISMATCH
+#num APR_EBUSY
+
+#cinline APR_STATUS_IS_INCHILD   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_INPARENT  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_DETACH    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_NOTDETACH , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_CHILD_DONE, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_CHILD_NOTDONE, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_TIMEUP    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_INCOMPLETE, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_BADCH     , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_BADARG    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EOF       , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_NOTFOUND  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ANONYMOUS , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_FILEBASED , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_KEYBASED  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EINIT     , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOTIMPL  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EMISMATCH , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EBUSY     , <apr_status_t> -> IO CInt
+
+#num APR_EACCES
+#num APR_EEXIST
+#num APR_ENAMETOOLONG
+#num APR_ENOENT
+#num APR_ENOTDIR
+#num APR_ENOSPC
+#num APR_ENOMEM
+#num APR_EMFILE
+#num APR_ENFILE
+#num APR_EBADF
+#num APR_EINVAL
+#num APR_ESPIPE
+#num APR_EAGAIN
+#num APR_EINTR
+#num APR_ENOTSOCK
+#num APR_ECONNREFUSED
+#num APR_EINPROGRESS
+#num APR_ECONNABORTED
+#num APR_ECONNRESET
+#num APR_ETIMEDOUT
+#num APR_EHOSTUNREACH
+#num APR_ENETUNREACH
+#num APR_EFTYPE
+#num APR_EPIPE
+#num APR_EXDEV
+#num APR_ENOTEMPTY
+#num APR_EAFNOSUPPORT
+
+#cinline APR_STATUS_IS_EACCES , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EEXIST , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENAMETOOLONG, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOENT , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOTDIR, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOSPC , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOMEM , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EMFILE , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENFILE , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EBADF  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EINVAL , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ESPIPE , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EAGAIN , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EINTR  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOTSOCK, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ECONNREFUSED, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EINPROGRESS , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ECONNABORTED, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ECONNRESET  , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ETIMEDOUT   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_TIMEDUP     , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EHOSTUNREACH, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENETUNREACH , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EFTYPE   , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EPIPE    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EXDEV    , <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_ENOTEMPTY, <apr_status_t> -> IO CInt
+#cinline APR_STATUS_IS_EAFNOSUPPORT, <apr_status_t> -> IO CInt
diff --git a/Bindings/APR/FNMatch.hsc b/Bindings/APR/FNMatch.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/FNMatch.hsc
@@ -0,0 +1,19 @@
+#include <bindings.dsl.h>
+#include <apr_fnmatch.h>
+
+module Bindings.APR.FNMatch where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+import Bindings.APR.Tables
+
+#num APR_FNM_NOMATCH
+
+#num APR_FNM_NOESCAPE
+#num APR_FNM_PATHNAME
+#num APR_FNM_PERIOD
+#num APR_FNM_CASE_BLIND
+
+#ccall apr_fnmatch     , Ptr CChar -> Ptr CChar -> CInt -> IO <apr_status_t>
+#ccall apr_fnmatch_test, Ptr CChar -> IO CInt
+#ccall apr_match_glob  , Ptr CChar -> Ptr (Ptr <apr_array_header_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
diff --git a/Bindings/APR/File/IO.hsc b/Bindings/APR/File/IO.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/File/IO.hsc
@@ -0,0 +1,121 @@
+#include <bindings.dsl.h>
+#include <apr_file_io.h>
+
+module Bindings.APR.File.IO where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.File.Info
+import Bindings.APR.File.Types
+import Bindings.APR.Pools
+import Bindings.APR.Time
+import Bindings.APR.Want
+
+#num APR_FOPEN_READ
+#num APR_FOPEN_WRITE
+#num APR_FOPEN_CREATE
+#num APR_FOPEN_APPEND
+#num APR_FOPEN_TRUNCATE
+#num APR_FOPEN_BINARY
+#num APR_FOPEN_EXCL
+#num APR_FOPEN_BUFFERED
+#num APR_FOPEN_DELONCLOSE
+#num APR_FOPEN_XTHREAD
+#num APR_FOPEN_SHARELOCK
+#num APR_FOPEN_NOCLEANUP
+#num APR_FOPEN_SENDFILE_ENABLED
+#num APR_FOPEN_LARGEFILE
+#num APR_FOPEN_SPARSE
+
+#num APR_READ
+#num APR_WRITE
+#num APR_CREATE
+#num APR_APPEND
+#num APR_TRUNCATE
+#num APR_BINARY
+#num APR_EXCL
+#num APR_BUFFERED
+#num APR_DELONCLOSE
+#num APR_XTHREAD
+#num APR_SHARELOCK
+#num APR_FILE_NOCLEANUP
+#num APR_SENDFILE_ENABLED
+#num APR_LARGEFILE
+
+#num APR_SET
+#num APR_CUR
+#num APR_END
+
+#num APR_FILE_ATTR_READONLY
+#num APR_FILE_ATTR_EXECUTABLE
+#num APR_FILE_ATTR_HIDDEN
+
+#num APR_MAX_IOVEC_SIZE
+
+#integral_t apr_fileattrs_t
+#integral_t apr_seek_where_t
+
+#num APR_FLOCK_SHARED
+#num APR_FLOCK_EXCLUSIVE
+#num APR_FLOCK_TYPEMASK
+#num APR_FLOCK_NONBLOCK
+
+#ccall apr_file_open  , Ptr (Ptr <apr_file_t>) -> Ptr CChar -> <apr_int32_t> -> <apr_fileperms_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_close , Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_remove, Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_rename, Ptr CChar -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_copy  , Ptr CChar -> Ptr CChar -> <apr_fileperms_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_append, Ptr CChar -> Ptr CChar -> <apr_fileperms_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_eof   , Ptr <apr_file_t> -> IO <apr_status_t>
+
+#ccall apr_file_open_stderr, Ptr (Ptr <apr_file_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_open_stdout, Ptr (Ptr <apr_file_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_open_stdin , Ptr (Ptr <apr_file_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+
+#ccall apr_file_open_flags_stderr, Ptr (Ptr <apr_file_t>) -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_open_flags_stdout, Ptr (Ptr <apr_file_t>) -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_open_flags_stdin , Ptr (Ptr <apr_file_t>) -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+
+#ccall apr_file_read       , Ptr <apr_file_t> -> Ptr () -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_file_write      , Ptr <apr_file_t> -> Ptr () -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_file_writev     , Ptr <apr_file_t> -> Ptr <iovec> -> <apr_size_t> -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_file_read_full  , Ptr <apr_file_t> -> Ptr () -> <apr_size_t> -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_file_write_full , Ptr <apr_file_t> -> Ptr () -> <apr_size_t> -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_file_writev_full, Ptr <apr_file_t> -> Ptr <iovec> -> <apr_size_t> -> Ptr <apr_size_t> -> IO <apr_status_t>
+
+#ccall apr_file_putc    , CChar -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_getc    , CChar -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_ungetc  , CChar -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_gets    , Ptr CChar -> CInt -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_puts    , Ptr CChar -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_flush   , Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_dup     , Ptr (Ptr <apr_file_t>) -> Ptr <apr_file_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_dup2    , Ptr <apr_file_t> -> Ptr <apr_file_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_setaside, Ptr (Ptr <apr_file_t>) -> Ptr <apr_file_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_buffer_set      , Ptr <apr_file_t> -> Ptr CChar -> <apr_size_t> -> IO <apr_status_t>
+#ccall apr_file_buffer_size_get , Ptr <apr_size_t> -> IO <apr_size_t>
+#ccall apr_file_seek            , Ptr <apr_file_t> -> <apr_seek_where_t> -> Ptr <apr_off_t> -> IO <apr_status_t>
+#ccall apr_file_pipe_create     , Ptr (Ptr <apr_file_t>) -> Ptr (Ptr <apr_file_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_pipe_create_ex  , Ptr (Ptr <apr_file_t>) -> Ptr (Ptr <apr_file_t>) -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_namedpipe_create, Ptr CChar -> <apr_fileperms_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_pipe_timeout_get, Ptr <apr_file_t> -> Ptr <apr_interval_time_t> -> IO <apr_status_t>
+#ccall apr_file_pipe_timeout_set, Ptr <apr_file_t> -> <apr_interval_time_t> -> IO <apr_status_t>
+#ccall apr_file_lock     , Ptr <apr_file_t> -> CInt -> IO <apr_status_t>
+#ccall apr_file_unlock   , Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_name_get , Ptr (Ptr CChar) -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_data_get , Ptr (Ptr ()) -> Ptr CChar -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_data_set , Ptr <apr_file_t> -> Ptr () -> Ptr CChar -> FunPtr (Ptr () -> IO <apr_status_t>) -> IO <apr_status_t>
+-- apr_file_printf can't be wrapped as it takes varargs.
+#ccall apr_file_perms_set, Ptr CChar -> <apr_fileperms_t> -> IO <apr_status_t>
+#ccall apr_file_attrs_set, Ptr CChar -> <apr_fileattrs_t> -> <apr_fileattrs_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_mtime_set, Ptr CChar -> <apr_time_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_dir_make      , Ptr CChar -> <apr_fileperms_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_dir_make_recursive, Ptr CChar -> <apr_fileperms_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_dir_remove    , Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_file_info_get , Ptr <apr_finfo_t> -> <apr_int32_t> -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_trunc    , Ptr <apr_file_t> -> <apr_off_t> -> IO <apr_status_t>
+#ccall apr_file_flags_get, Ptr <apr_file_t> -> IO <apr_int32_t>
+
+#ccall apr_file_pool_get     , Ptr <apr_file_t> -> IO (Ptr <apr_pool_t>)
+#ccall apr_file_inherit_set  , Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_file_inherit_unset, Ptr <apr_file_t> -> IO <apr_status_t>
diff --git a/Bindings/APR/File/Info.hsc b/Bindings/APR/File/Info.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/File/Info.hsc
@@ -0,0 +1,131 @@
+#include <bindings.dsl.h>
+#include <apr_file_info.h>
+
+module Bindings.APR.File.Info where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.File.Types
+import Bindings.APR.Pools
+import Bindings.APR.Tables
+import Bindings.APR.Time
+import Bindings.APR.User
+
+#integral_t apr_filetype_e
+#num APR_NOFILE
+#num APR_REG
+#num APR_DIR
+#num APR_CHR
+#num APR_BLK
+#num APR_PIPE
+#num APR_LNK
+#num APR_SOCK
+#num APR_UNKFILE
+
+#num APR_FPROT_USETID
+#num APR_FPROT_UREAD
+#num APR_FPROT_UWRITE
+#num APR_FPROT_UEXECUTE
+
+#num APR_FPROT_GSETID
+#num APR_FPROT_GREAD
+#num APR_FPROT_GWRITE
+#num APR_FPROT_GEXECUTE
+
+#num APR_FPROT_WSTICKY
+#num APR_FPROT_WREAD
+#num APR_FPROT_WWRITE
+#num APR_FPROT_WEXECUTE
+
+#num APR_FPROT_OS_DEFAULT
+#num APR_FPROT_FILE_SOURCE_PERMS
+
+#num APR_USETID
+#num APR_UREAD
+#num APR_UWRITE
+#num APR_UEXECUTE
+#num APR_GSETID
+#num APR_GREAD
+#num APR_GWRITE
+#num APR_GEXECUTE
+#num APR_WSTICKY
+#num APR_WREAD
+#num APR_WWRITE
+#num APR_WEXECUTE
+#num APR_OS_DEFAULT
+#num APR_FILE_SOURCE_PERMS
+
+#opaque_t   apr_dir_t
+#integral_t apr_fileperms_t
+#integral_t apr_dev_t
+
+#num APR_FINFO_LINK
+#num APR_FINFO_MTIME
+#num APR_FINFO_CTIME
+#num APR_FINFO_ATIME
+#num APR_FINFO_SIZE
+#num APR_FINFO_CSIZE
+#num APR_FINFO_DEV
+#num APR_FINFO_INODE
+#num APR_FINFO_TYPE
+#num APR_FINFO_USER
+#num APR_FINFO_GROUP
+#num APR_FINFO_UPROT
+#num APR_FINFO_GPROT
+#num APR_FINFO_WPROT
+#num APR_FINFO_ICASE
+#num APR_FINFO_NAME
+
+#num APR_FINFO_MIN
+#num APR_FINFO_IDENT
+#num APR_FINFO_OWNER
+#num APR_FINFO_PROT
+#num APR_FINFO_NORM
+#num APR_FINFO_DIRENT
+
+#starttype struct apr_finfo_t
+#  field pool      , Ptr <apr_pool_t>
+#  field valid     , <apr_int32_t>
+#  field protection, <apr_fileperms_t>
+#  field filetype  , <apr_filetype_e>
+#  field user      , <apr_uid_t>
+#  field group     , <apr_gid_t>
+#  field inode     , <apr_ino_t>
+#  field device    , <apr_dev_t>
+#  field nlink     , <apr_int32_t>
+#  field size      , <apr_off_t>
+#  field csize     , <apr_off_t>
+#  field atime     , <apr_time_t>
+#  field mtime     , <apr_time_t>
+#  field ctime     , <apr_time_t>
+#  field fname     , Ptr CChar
+#  field name      , Ptr CChar
+#  field filehand  , Ptr <apr_file_t>
+#stoptype
+
+#ccall apr_stat      , Ptr <apr_finfo_t> -> Ptr CChar -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_dir_open  , Ptr (Ptr <apr_dir_t>) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_dir_close , Ptr <apr_dir_t> -> IO <apr_status_t>
+#ccall apr_dir_read  , Ptr <apr_finfo_t> -> <apr_int32_t> -> Ptr <apr_dir_t> -> IO <apr_status_t>
+#ccall apr_dir_rewind, Ptr <apr_dir_t> -> IO <apr_status_t>
+
+#num APR_FILEPATH_NOTABOVEROOT
+#num APR_FILEPATH_SECUREROOTTEST
+#num APR_FILEPATH_SECUREROOT
+#num APR_FILEPATH_NOTRELATIVE
+#num APR_FILEPATH_NOTABSOLUTE
+#num APR_FILEPATH_NATIVE
+#num APR_FILEPATH_TRUENAME
+
+#ccall apr_filepath_root      , Ptr (Ptr CChar) -> Ptr (Ptr CChar) -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_filepath_merge     , Ptr (Ptr CChar) -> Ptr CChar -> Ptr CChar -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_filepath_list_split, Ptr (Ptr <apr_array_header_t>) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_filepath_list_merge, Ptr (Ptr CChar) -> Ptr <apr_array_header_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_filepath_get       , Ptr (Ptr CChar) -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_filepath_set       , Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+
+#num APR_FILEPATH_ENCODING_UNKNOWN
+#num APR_FILEPATH_ENCODING_LOCALE
+#num APR_FILEPATH_ENCODING_UTF8
+
+#ccall apr_filepath_encoding, Ptr CInt -> Ptr <apr_pool_t> -> IO <apr_status_t>
diff --git a/Bindings/APR/File/Types.hsc b/Bindings/APR/File/Types.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/File/Types.hsc
@@ -0,0 +1,7 @@
+#include <bindings.dsl.h>
+#include <apr_file_io.h>
+
+module Bindings.APR.File.Types where
+#strict_import
+
+#opaque_t apr_file_t
diff --git a/Bindings/APR/General.hsc b/Bindings/APR/General.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/General.hsc
@@ -0,0 +1,39 @@
+#include <bindings.dsl.h>
+#include <apr_general.h>
+
+module Bindings.APR.General where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#num FALSE
+#num TRUE
+
+#num APR_ASCII_BLANK
+#num APR_ASCII_CR
+#num APR_ASCII_LF
+#num APR_ASCII_TAB
+
+#integral_t apr_signum_t
+
+-- It's impossible to wrap around APR_OFFSET() and APR_OFFSET_OF().
+
+#cinline strcasecmp , Ptr CChar -> Ptr CChar -> IO CInt
+#cinline strncasecmp, Ptr CChar -> Ptr CChar -> CSize -> IO CInt
+
+-- What's the correct type for these macros?
+#cinline APR_ALIGN, <apr_uint64_t> -> <apr_uint64_t> -> IO <apr_uint64_t>
+#cinline APR_ALIGN_DEFAULT, <apr_uint64_t> -> IO <apr_uint64_t>
+
+#cinline memmove, Ptr () -> Ptr () -> CSize -> IO (Ptr ())
+#cinline memchr , Ptr () -> CInt -> CSize -> IO (Ptr ())
+
+#ccall apr_initialize    , IO <apr_status_t>
+#ccall apr_app_initialize, Ptr CInt -> Ptr (Ptr (Ptr CChar)) -> Ptr (Ptr (Ptr CChar)) -> IO <apr_status_t>
+#ccall apr_terminate     , IO ()
+#ccall apr_terminate2    , IO ()
+
+#if APR_HAS_RANDOM
+#ccall apr_generate_random_bytes, Ptr CUChar -> <apr_size_t> -> IO <apr_status_t>
+#endif
diff --git a/Bindings/APR/GetOpt.hsc b/Bindings/APR/GetOpt.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/GetOpt.hsc
@@ -0,0 +1,36 @@
+#include <bindings.dsl.h>
+#include <apr_getopt.h>
+
+module Bindings.APR.GetOpt where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+-- apr_getopt_err_fn_t takes varargs so it can't be declared as FunPtr.
+#opaque_t apr_getopt_err_fn_t
+
+#starttype struct apr_getopt_t
+#  field cont  , Ptr <apr_pool_t>
+#  field errfn , Ptr <apr_getopt_err_fn_t>
+#  field errarg, Ptr ()
+#  field ind   , CInt
+#  field opt   , CInt
+#  field reset , CInt
+#  field argc  , CInt
+#  field argv  , Ptr (Ptr CChar)
+#  field place , Ptr CChar
+#  field interleave, CInt
+#  field skip_start, CInt
+#  field skip_end  , CInt
+#stoptype
+
+#starttype struct apr_getopt_option_t
+#  field name       , Ptr CChar
+#  field optch      , CInt
+#  field has_arg    , CInt
+#  field description, Ptr CChar
+#stoptype
+
+#ccall apr_getopt_init, Ptr (Ptr <apr_getopt_t>) -> Ptr <apr_pool_t> -> CInt -> Ptr (Ptr CChar) -> IO <apr_status_t>
+#ccall apr_getopt     , Ptr <apr_getopt_t> -> Ptr CChar -> Ptr CChar -> Ptr (Ptr CChar) -> IO <apr_status_t>
+#ccall apr_getopt_long, Ptr <apr_getopt_t> -> Ptr <apr_getopt_option_t> -> Ptr CInt -> Ptr (Ptr CChar) -> IO <apr_status_t>
diff --git a/Bindings/APR/Global/Mutex.hsc b/Bindings/APR/Global/Mutex.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Global/Mutex.hsc
@@ -0,0 +1,19 @@
+#include <bindings.dsl.h>
+#include <apr_getopt.h>
+
+module Bindings.APR.Global.Mutex where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+import Bindings.APR.Proc.Mutex
+
+#opaque_t apr_global_mutex_t
+
+#cinline apr_global_mutex_create    , Ptr (Ptr <apr_global_mutex_t>) -> Ptr CChar -> <apr_lockmech_e> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#cinline apr_global_mutex_child_init, Ptr (Ptr <apr_global_mutex_t>) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#cinline apr_global_mutex_lock      , Ptr <apr_global_mutex_t> -> IO <apr_status_t>
+#cinline apr_global_mutex_trylock   , Ptr <apr_global_mutex_t> -> IO <apr_status_t>
+#cinline apr_global_mutex_unlock    , Ptr <apr_global_mutex_t> -> IO <apr_status_t>
+#cinline apr_global_mutex_destroy   , Ptr <apr_global_mutex_t> -> IO <apr_status_t>
+
+#cinline apr_global_mutex_pool_get  , Ptr <apr_global_mutex_t> -> IO (Ptr <apr_pool_t>)
diff --git a/Bindings/APR/Hash.hsc b/Bindings/APR/Hash.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Hash.hsc
@@ -0,0 +1,30 @@
+#include <bindings.dsl.h>
+#include <apr_hash.h>
+
+module Bindings.APR.Hash where
+#strict_import
+import Bindings.APR
+import Bindings.APR.Pools
+
+#num APR_HASH_KEY_STRING
+
+#opaque_t apr_hash_t
+#opaque_t apr_hash_index_t
+
+#callback apr_hashfunc_t, Ptr CChar -> Ptr <apr_ssize_t> -> IO CUInt
+
+#ccall apr_hashfunc_default, Ptr CChar -> Ptr <apr_ssize_t> -> IO CUInt
+#ccall apr_hash_make       , Ptr <apr_pool_t> -> IO (Ptr <apr_hash_t>)
+#ccall apr_hash_make_custom, Ptr <apr_hash_t> -> <apr_hashfunc_t> -> IO (Ptr <apr_hash_t>)
+#ccall apr_hash_copy       , Ptr <apr_pool_t> -> Ptr <apr_hash_t> -> IO (Ptr <apr_hash_t>)
+#ccall apr_hash_set        , Ptr <apr_hash_t> -> Ptr () -> <apr_ssize_t> -> Ptr () -> IO ()
+#ccall apr_hash_get        , Ptr <apr_hash_t> -> Ptr () -> <apr_ssize_t> -> IO (Ptr ())
+#ccall apr_hash_first      , Ptr <apr_pool_t> -> Ptr <apr_hash_t> -> IO (Ptr <apr_hash_index_t>)
+#ccall apr_hash_next       , Ptr <apr_hash_index_t> -> IO (Ptr <apr_hash_index_t>)
+#ccall apr_hash_this       , Ptr <apr_hash_index_t> -> Ptr (Ptr ()) -> Ptr <apr_ssize_t> -> Ptr (Ptr ()) -> IO ()
+#ccall apr_hash_count      , Ptr <apr_hash_t> -> IO CUInt
+#ccall apr_hash_clear      , Ptr <apr_hash_t> -> IO ()
+#ccall apr_hash_overlay    , Ptr <apr_pool_t> -> Ptr <apr_hash_t> -> Ptr <apr_hash_t> -> IO (Ptr <apr_hash_t>)
+#ccall apr_hash_merge      , Ptr <apr_pool_t> -> Ptr <apr_hash_t> -> Ptr <apr_hash_t> -> FunPtr (Ptr <apr_pool_t> -> Ptr () -> <apr_ssize_t> -> Ptr () -> Ptr () -> Ptr () -> IO (Ptr ())) -> Ptr () -> IO (Ptr <apr_hash_t>)
+
+#ccall apr_hash_pool_get   , Ptr <apr_hash_t> -> IO (Ptr <apr_pool_t>)
diff --git a/Bindings/APR/Lib.hsc b/Bindings/APR/Lib.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Lib.hsc
@@ -0,0 +1,37 @@
+#include <bindings.dsl.h>
+#include <apr_lib.h>
+
+module Bindings.APR.Lib where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import System.Posix.Types
+
+#num HUGE_STRING_LEN
+
+#starttype struct apr_vformatter_buff_t
+#  field curpos, Ptr CChar
+#  field endpos, Ptr CChar
+#stoptype
+
+#ccall apr_filepath_name_get, Ptr CChar -> IO (Ptr CChar)
+
+#cinline apr_killpg, CPid -> CInt -> IO CInt
+
+-- apr_vformatter takes va_list...
+
+#ccall apr_password_get, Ptr CChar -> Ptr CChar -> Ptr <apr_size_t> -> IO <apr_status_t>
+
+#cinline apr_isalnum , CInt -> IO CInt
+#cinline apr_isalpha , CInt -> IO CInt
+#cinline apr_isdigit , CInt -> IO CInt
+#cinline apr_isgraph , CInt -> IO CInt
+#cinline apr_islower , CInt -> IO CInt
+#cinline apr_isascii , CInt -> IO CInt
+#cinline apr_isprint , CInt -> IO CInt
+#cinline apr_ispunct , CInt -> IO CInt
+#cinline apr_isspace , CInt -> IO CInt
+#cinline apr_isupper , CInt -> IO CInt
+#cinline apr_isxdigit, CInt -> IO CInt
+#cinline apr_tolower , CInt -> IO CInt
+#cinline apr_toupper , CInt -> IO CInt
diff --git a/Bindings/APR/MMap.hsc b/Bindings/APR/MMap.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/MMap.hsc
@@ -0,0 +1,34 @@
+#include <bindings.dsl.h>
+#include <apr_mmap.h>
+#include "bindings.apr.ring.h"
+
+module Bindings.APR.MMap where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+import Bindings.APR.File.Types
+
+#num APR_MMAP_READ
+#num APR_MMAP_WRITE
+
+#starttype struct apr_mmap_t
+#  field cntxt    , Ptr <apr_pool_t>
+#  field mm       , Ptr ()
+#  field size     , <apr_size_t>
+#  apr_ring_entry_field link, <apr_mmap_t>
+#stoptype
+
+#if APR_HAS_MMAP
+
+#num APR_MMAP_THRESHOLD
+#num APR_MMAP_LIMIT
+
+#cinline APR_MMAP_CANDIDATE, <apr_off_t> -> IO CInt
+
+#ccall apr_mmap_create, Ptr (Ptr <apr_mmap_t>) -> Ptr <apr_file_t> -> <apr_off_t> -> <apr_size_t> -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_mmap_dup   , Ptr (Ptr <apr_mmap_t>) -> Ptr <apr_mmap_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_mmap_delete, Ptr <apr_mmap_t> -> IO <apr_status_t>
+#ccall apr_mmap_offset, Ptr (Ptr ()) -> Ptr <apr_mmap_t> -> <apr_off_t> -> IO <apr_status_t>
+
+#endif
diff --git a/Bindings/APR/Network/IO.hsc b/Bindings/APR/Network/IO.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Network/IO.hsc
@@ -0,0 +1,142 @@
+#include <bindings.dsl.h>
+#include <apr_network_io.h>
+#include "bindings.apr.pools.h"
+#include "bindings.apr.inherit.h"
+
+module Bindings.APR.Network.IO where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.File.Types
+import Bindings.APR.Pools
+import Bindings.APR.Time
+import Bindings.APR.Want
+
+#num APR_MAX_SECS_TO_LINGER
+#num APRMAXHOSTLEN
+#globalarray APR_ANYADDR, CChar
+
+#num APR_SO_LINGER
+#num APR_SO_KEEPALIVE
+#num APR_SO_DEBUG
+#num APR_SO_NONBLOCK
+#num APR_SO_REUSEADDR
+#num APR_SO_SNDBUF
+#num APR_SO_RCVBUF
+#num APR_SO_DISCONNECTED
+#num APR_TCP_NODELAY
+#num APR_TCP_NOPUSH
+#num APR_RESET_NODELAY
+#num APR_INCOMPLETE_READ
+#num APR_INCOMPLETE_WRITE
+#num APR_IPV6_V6ONLY
+#num APR_TCP_DEFER_ACCEPT
+
+#integral_t apr_shutdown_how_e
+#num APR_IPV4_ADDR_OK
+#num APR_IPV6_ADDR_OK
+
+#num APR_INADDR_NONE
+
+#num APR_INET
+#num APR_UNSPEC
+
+#if APR_HAVE_IPV6
+#  num APR_INET6
+#endif
+
+#num APR_PROTO_TCP
+#num APR_PROTO_UDP
+#num APR_PROTO_SCTP
+
+#integral_t apr_interface_e
+#num APR_LOCAL
+#num APR_REMOTE
+
+-- FIXME: How should I wrap apr_inet_addr?
+
+#opaque_t apr_socket_t
+
+#starttype struct apr_hdtr_t
+#  field headers    , Ptr <iovec>
+#  field numheaders , CInt
+#  field trailers   , Ptr <iovec>
+#  field numtrailers, CInt
+#stoptype
+
+-- FIXME: How should I wrap apr_in_addr_t?
+
+#opaque_t apr_ipsubnet_t
+
+#integral_t apr_port_t
+
+#starttype struct apr_sockaddr_t
+#  field pool        , Ptr <apr_pool_t>
+#  field hostname    , Ptr CChar
+#  field servname    , Ptr CChar
+#  field port        , <apr_port_t>
+#  field family      , <apr_int32_t>
+#  field salen       , <apr_socklen_t>
+#  field ipaddr_len  , CInt
+#  field addr_str_len, CInt
+#  field ipaddr_ptr  , Ptr ()
+#  field next        , Ptr <apr_sockaddr_t>
+-- FIXME: wrap around sa, sin, sin6, sas
+#stoptype
+
+#if APR_HAS_SENDFILE
+#  num APR_SENDFILE_DISCONNECT_SOCKET
+#endif
+
+#ccall apr_socket_create    , Ptr (Ptr <apr_socket_t>) -> CInt -> CInt -> CInt -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_socket_shutdown  , Ptr <apr_socket_t> -> <apr_shutdown_how_e> -> IO <apr_status_t>
+#ccall apr_socket_close     , Ptr <apr_socket_t> -> IO <apr_status_t>
+#ccall apr_socket_bind      , Ptr <apr_socket_t> -> Ptr <apr_sockaddr_t> -> IO <apr_status_t>
+#ccall apr_socket_listen    , Ptr <apr_status_t> -> <apr_int32_t> -> IO <apr_status_t>
+#ccall apr_socket_accept    , Ptr (Ptr <apr_socket_t>) -> Ptr <apr_socket_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_socket_connect   , Ptr <apr_socket_t> -> Ptr <apr_sockaddr_t> -> IO <apr_status_t>
+#ccall apr_sockaddr_info_get, Ptr (Ptr <apr_sockaddr_t>) -> Ptr CChar -> <apr_int32_t> -> <apr_port_t> -> <apr_int32_t> -> Ptr <apr_port_t> -> IO <apr_status_t>
+#ccall apr_getnameinfo      , Ptr (Ptr CChar) -> Ptr <apr_sockaddr_t> -> <apr_int32_t> -> IO <apr_status_t>
+#ccall apr_parse_addr_port  , Ptr (Ptr CChar) -> Ptr (Ptr CChar) -> Ptr <apr_port_t> -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_gethostname      , Ptr CChar -> CInt -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_socket_data_get  , Ptr (Ptr ()) -> Ptr CChar -> Ptr <apr_socket_t> -> IO <apr_status_t>
+#ccall apr_socket_data_set  , Ptr <apr_socket_t> -> Ptr () -> Ptr CChar -> FunPtr (Ptr () -> IO <apr_status_t>) -> IO <apr_status_t>
+#ccall apr_socket_send      , Ptr <apr_socket_t> -> Ptr CChar -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_socket_sendv     , Ptr <apr_socket_t> -> Ptr <iovec> -> <apr_int32_t> -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_socket_sendto    , Ptr <apr_socket_t> -> Ptr <apr_sockaddr_t> -> <apr_int32_t> -> Ptr CChar -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_socket_recvfrom  , Ptr <apr_sockaddr_t> -> Ptr <apr_socket_t> -> <apr_int32_t> -> Ptr CChar -> Ptr <apr_size_t> -> IO <apr_status_t>
+
+#if APR_HAS_SENDFILE
+#  ccall apr_socket_sendfile, Ptr <apr_socket_t> -> Ptr <apr_file_t> -> Ptr <apr_hdtr_t> -> Ptr <apr_off_t> -> Ptr <apr_size_t> -> <apr_int32_t> -> IO <apr_status_t>
+#endif
+
+#ccall apr_socket_recv       , Ptr <apr_socket_t> -> Ptr CChar -> Ptr <apr_size_t> -> IO <apr_status_t>
+#ccall apr_socket_opt_set    , Ptr <apr_socket_t> -> <apr_int32_t> -> <apr_int32_t> -> IO <apr_status_t>
+#ccall apr_socket_timeout_set, Ptr <apr_socket_t> -> <apr_interval_time_t> -> IO <apr_status_t>
+#ccall apr_socket_opt_get    , Ptr <apr_socket_t> -> <apr_int32_t> -> <apr_int32_t> -> IO <apr_status_t>
+#ccall apr_socket_timeout_get, Ptr <apr_socket_t> -> Ptr <apr_interval_time_t> -> IO <apr_status_t>
+#ccall apr_socket_atmark     , Ptr <apr_socket_t> -> Ptr CInt -> IO <apr_status_t>
+#ccall apr_socket_addr_get   , Ptr (Ptr <apr_socket_t>) -> <apr_interface_e> -> Ptr <apr_socket_t> -> IO <apr_status_t>
+#ccall apr_sockaddr_ip_get   , Ptr (Ptr CChar) -> Ptr <apr_sockaddr_t> -> IO <apr_status_t>
+#ccall apr_sockaddr_ip_getbuf, Ptr CChar -> <apr_size_t> -> Ptr <apr_sockaddr_t> -> IO <apr_status_t>
+#ccall apr_sockaddr_equal    , Ptr <apr_sockaddr_t> -> Ptr <apr_sockaddr_t> -> IO CInt
+#ccall apr_socket_type_get   , Ptr <apr_socket_t> -> Ptr CInt -> IO <apr_status_t>
+#ccall apr_getservbyname     , Ptr <apr_sockaddr_t> -> Ptr CChar -> IO <apr_status_t>
+#ccall apr_ipsubnet_create   , Ptr (Ptr <apr_ipsubnet_t>) -> Ptr CChar -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_ipsubnet_test     , Ptr <apr_ipsubnet_t> -> Ptr <apr_sockaddr_t> -> IO CInt
+
+#if APR_HAS_SO_ACCEPTFILTER
+#  ccall apr_socket_accept_filter, Ptr <apr_socket_t> -> Ptr CChar -> Ptr CChar -> IO <apr_status_t>
+#endif
+
+#ccall apr_socket_protocol_get, Ptr <apr_socket_t> -> Ptr CInt -> IO <apr_status_t>
+
+#apr_pool_accessor socket
+#apr_inherit_set   socket
+#apr_inherit_unset socket
+
+#ccall apr_mcast_join     , Ptr <apr_socket_t> -> Ptr <apr_sockaddr_t> -> Ptr <apr_sockaddr_t> -> Ptr <apr_sockaddr_t> -> IO <apr_status_t>
+#ccall apr_mcast_leave    , Ptr <apr_socket_t> -> Ptr <apr_sockaddr_t> -> Ptr <apr_sockaddr_t> -> Ptr <apr_sockaddr_t> -> IO <apr_status_t>
+#ccall apr_mcast_hops     , Ptr <apr_socket_t> -> <apr_byte_t> -> IO <apr_status_t>
+#ccall apr_mcast_loopback , Ptr <apr_socket_t> -> <apr_byte_t> -> IO <apr_status_t>
+#ccall apr_mcast_interface, Ptr <apr_socket_t> -> Ptr <apr_sockaddr_t> -> IO <apr_status_t>
diff --git a/Bindings/APR/Poll.hsc b/Bindings/APR/Poll.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Poll.hsc
@@ -0,0 +1,61 @@
+#include <bindings.dsl.h>
+#include <apr_poll.h>
+
+module Bindings.APR.Poll where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.File.Types
+import Bindings.APR.Network.IO
+import Bindings.APR.Pools
+import Bindings.APR.Time
+
+#num APR_POLLIN
+#num APR_POLLPRI
+#num APR_POLLOUT
+#num APR_POLLERR
+#num APR_POLLHUP
+#num APR_POLLNVAL
+
+#num APR_POLLSET_THREADSAFE
+#num APR_POLLSET_NOCOPY
+
+#integral_t apr_datatype_e
+#num APR_NO_DESC
+#num APR_POLL_SOCKET
+#num APR_POLL_FILE
+#num APR_POLL_LASTDESC
+
+#starttype apr_descriptor
+#  union_field f, Ptr <apr_file_t>
+#  union_field s, Ptr <apr_socket_t>
+#stoptype
+
+#starttype struct apr_pollfd_t
+#  field p          , Ptr <apr_pool_t>
+#  field desc_type  , <apr_datatype_e>
+#  field reqevents  , <apr_int16_t>
+#  field rtnevents  , <apr_int16_t>
+#  field desc       , <apr_descriptor>
+#  field client_data, Ptr ()
+#stoptype
+
+#opaque_t apr_pollset_t
+
+#ccall apr_pollset_create , Ptr (Ptr <apr_pollset_t>) -> <apr_uint32_t> -> Ptr <apr_pool_t> -> <apr_uint32_t> -> IO <apr_status_t>
+#ccall apr_pollset_destroy, Ptr <apr_pollset_t> -> IO <apr_status_t>
+#ccall apr_pollset_add    , Ptr <apr_pollset_t> -> Ptr <apr_pollfd_t> -> IO <apr_status_t>
+#ccall apr_pollset_remove , Ptr <apr_pollset_t> -> Ptr <apr_pollfd_t> -> IO <apr_status_t>
+#ccall apr_pollset_poll   , Ptr <apr_pollset_t> -> <apr_interval_time_t> -> Ptr <apr_int32_t> -> Ptr (Ptr <apr_pollfd_t>) -> IO <apr_status_t>
+
+#ccall apr_poll, Ptr <apr_pollfd_t> -> <apr_int32_t> -> Ptr <apr_int32_t> -> <apr_interval_time_t> -> IO <apr_status_t>
+
+#opaque_t apr_pollcb_t
+
+#ccall apr_pollcb_create, Ptr (Ptr <apr_pollcb_t>) -> <apr_uint32_t> -> Ptr <apr_pool_t> -> <apr_uint32_t> -> IO <apr_status_t>
+#ccall apr_pollcb_add   , Ptr <apr_pollcb_t> -> Ptr <apr_pollfd_t> -> IO <apr_status_t>
+#ccall apr_pollcb_remove, Ptr <apr_pollcb_t> -> Ptr <apr_pollfd_t> -> IO <apr_status_t>
+
+#callback apr_pollcb_cb_t, Ptr () -> Ptr <apr_pollfd_t> -> IO <apr_status_t>
+
+#ccall apr_pollcb_poll, Ptr <apr_pollcb_t> -> <apr_interval_time_t> -> <apr_pollcb_cb_t> -> Ptr () -> IO <apr_status_t>
diff --git a/Bindings/APR/Pools.hsc b/Bindings/APR/Pools.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Pools.hsc
@@ -0,0 +1,95 @@
+#include <bindings.dsl.h>
+#include <apr_pools.h>
+
+module Bindings.APR.Pools where
+#strict_import
+import Bindings.APR
+import Bindings.APR.Allocator.Types
+import Bindings.APR.ErrNo
+
+#opaque_t apr_pool_t
+
+#num APR_POOL_DEBUG
+
+#callback apr_abortfunc_t, CInt -> IO CInt
+
+#ccall apr_pool_initialize, IO <apr_status_t>
+#ccall apr_pool_terminate , IO ()
+
+#if APR_POOL_DEBUG
+
+#  cinline apr_pool_create_ex, Ptr (Ptr <apr_pool_t>) -> Ptr <apr_pool_t> -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> IO <apr_status_t>
+#  cinline apr_pool_create_core_ex, Ptr (Ptr <apr_pool_t>) -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> IO <apr_status_t>
+#  cinline apr_pool_create_unmanaged_ex, Ptr (Ptr <apr_pool_t>) -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> IO <apr_status_t>
+
+#  ccall apr_pool_create_ex_debug, Ptr (Ptr <apr_pool_t>) -> Ptr <apr_pool_t> -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> Ptr CChar -> IO <apr_status_t>
+#  ccall apr_pool_create_core_ex_debug, Ptr (Ptr <apr_pool_t>) -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> Ptr CChar -> IO <apr_status_t>
+#  ccall apr_pool_create_unmanaged_ex_debug, Ptr (Ptr <apr_pool_t>) -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> Ptr CChar -> IO <apr_status_t>
+
+#else
+
+#  ccall apr_pool_create_ex, Ptr (Ptr <apr_pool_t>) -> Ptr <apr_pool_t> -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> IO <apr_status_t>
+#  ccall apr_pool_create_core_ex, Ptr (Ptr <apr_pool_t>) -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> IO <apr_status_t>
+#  ccall apr_pool_create_unmanaged_ex, Ptr (Ptr <apr_pool_t>) -> <apr_abortfunc_t> -> Ptr <apr_allocator_t> -> IO <apr_status_t>
+
+#endif
+
+#cinline apr_pool_create, Ptr (Ptr <apr_pool_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#cinline apr_pool_create_core, Ptr (Ptr <apr_pool_t>) -> IO <apr_status_t>
+#cinline apr_pool_create_unmanaged, Ptr (Ptr <apr_pool_t>) -> IO <apr_status_t>
+
+#ccall apr_pool_allocator_get, Ptr <apr_pool_t> -> IO (Ptr <apr_allocator_t>)
+
+#if APR_POOL_DEBUG
+#  cinline apr_pool_clear, Ptr <apr_pool_t> -> IO ()
+#  ccall   apr_pool_clear_debug, Ptr <apr_pool_t> -> Ptr CChar -> IO ()
+#else
+#  ccall   apr_pool_clear, Ptr <apr_pool_t> -> IO ()
+#endif
+
+#if APR_POOL_DEBUG
+#  cinline apr_pool_destroy, Ptr <apr_pool_t> -> IO ()
+#  ccall   apr_pool_destroy_debug, Ptr <apr_pool_t> -> Ptr CChar -> IO ()
+#else
+#  ccall   apr_pool_destroy, Ptr <apr_pool_t> -> IO ()
+#endif
+
+#if APR_POOL_DEBUG
+#  cinline apr_palloc, Ptr <apr_pool_t> -> <apr_size_t> -> IO (Ptr ())
+#  ccall   apr_palloc_debug, Ptr <apr_pool_t> -> <apr_size_t> -> Ptr CChar -> IO (Ptr ())
+#else
+#  ccall   apr_palloc, Ptr <apr_pool_t> -> <apr_size_t> -> IO (Ptr ())
+#endif
+
+#cinline apr_pcalloc, Ptr <apr_pool_t> -> <apr_size_t> -> IO (Ptr ())
+#if APR_POOL_DEBUG
+#  ccall apr_pcalloc_debug, Ptr <apr_pool_t> -> <apr_size_t> -> Ptr CChar -> IO (Ptr ())
+#endif
+
+#ccall apr_pool_abort_set  , <apr_abortfunc_t> -> Ptr <apr_pool_t> -> IO ()
+#ccall apr_pool_abort_get  , Ptr <apr_pool_t> -> IO <apr_abortfunc_t>
+#ccall apr_pool_parent_get , Ptr <apr_pool_t> -> IO (Ptr <apr_pool_t>)
+#ccall apr_pool_is_ancestor, Ptr <apr_pool_t> -> Ptr <apr_pool_t> -> IO CInt
+#ccall apr_pool_tag        , Ptr <apr_pool_t> -> Ptr CChar -> IO ()
+
+#ccall apr_pool_userdata_set , Ptr () -> Ptr CChar -> FunPtr (Ptr () -> IO <apr_status_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_pool_userdata_setn, Ptr () -> Ptr CChar -> FunPtr (Ptr () -> IO <apr_status_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_pool_userdata_get , Ptr (Ptr ()) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+
+#ccall apr_pool_cleanup_register    , Ptr <apr_pool_t> -> Ptr () -> FunPtr (Ptr () -> IO <apr_status_t>) -> FunPtr (Ptr () -> IO <apr_status_t>) -> IO ()
+#ccall apr_pool_pre_cleanup_register, Ptr <apr_pool_t> -> Ptr () -> FunPtr (Ptr () -> IO <apr_status_t>) -> IO ()
+#ccall apr_pool_cleanup_kill        , Ptr <apr_pool_t> -> Ptr () -> FunPtr (Ptr () -> IO <apr_status_t>) -> IO ()
+#ccall apr_pool_child_cleanup_set   , Ptr <apr_pool_t> -> Ptr () -> FunPtr (Ptr () -> IO <apr_status_t>) -> FunPtr (Ptr () -> IO <apr_status_t>) -> IO ()
+#ccall apr_pool_cleanup_run         , Ptr <apr_pool_t> -> Ptr () -> FunPtr (Ptr () -> IO <apr_status_t>) -> IO <apr_status_t>
+#ccall apr_pool_cleanup_null        , Ptr () -> IO <apr_status_t>
+#ccall apr_pool_cleanup_for_exec    , Ptr () -> IO ()
+
+#if APR_POOL_DEBUG
+#  ccall apr_pool_join     , Ptr <apr_pool_t> -> Ptr <apr_pool_t> -> IO ()
+#  ccall apr_pool_find     , Ptr () -> IO (Ptr <apr_pool_t>)
+#  ccall apr_pool_num_bytes, Ptr <apr_pool_t> -> CInt -> IO <apr_size_t>
+#  ccall apr_pool_lock     , Ptr <apr_pool_t> -> CInt -> IO ()
+#else
+#  cinline apr_pool_join, Ptr <apr_pool_t> -> Ptr <apr_pool_t> -> IO ()
+#  cinline apr_pool_lock, Ptr <apr_pool_t> -> CInt -> IO ()
+#endif
diff --git a/Bindings/APR/Portable.hsc b/Bindings/APR/Portable.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Portable.hsc
@@ -0,0 +1,82 @@
+#include <bindings.dsl.h>
+#include <apr_portable.h>
+
+module Bindings.APR.Portable where
+#strict_import
+import Bindings.APR
+import Bindings.APR.DSO
+import Bindings.APR.ErrNo
+import Bindings.APR.File.Info
+import Bindings.APR.File.Types
+import Bindings.APR.Global.Mutex
+import Bindings.APR.Network.IO
+import Bindings.APR.Pools
+import Bindings.APR.Proc.Mutex
+import Bindings.APR.Shm
+import Bindings.APR.Thread.Mutex
+import Bindings.APR.Thread.Proc
+import Bindings.APR.Time
+
+#opaque_t apr_os_file_t
+#opaque_t apr_os_dir_t
+#opaque_t apr_os_sock_t
+#opaque_t apr_os_proc_mutex_t
+#opaque_t apr_os_thread_t
+#opaque_t apr_os_proc_t
+#opaque_t apr_os_threadkey_t
+#opaque_t apr_os_imp_time_t
+#opaque_t apr_os_exp_time_t
+#opaque_t apr_os_dso_handle_t
+#opaque_t apr_os_shm_t
+
+#starttype struct apr_os_sock_info_t
+#  field os_sock , Ptr <apr_os_sock_t>
+-- FIXME: sockaddr
+-- #  field local   , Ptr <sockaddr>
+-- #  field remote  , Ptr <sockaddr>
+#  field family  , CInt
+#  field type    , CInt
+#  field protocol, CInt
+#stoptype
+
+#opaque_t apr_os_global_mutex_t
+#cinline apr_os_global_mutex_get, Ptr <apr_os_global_mutex_t> -> Ptr <apr_global_mutex_t> -> IO <apr_status_t>
+
+#ccall apr_os_file_get      , Ptr <apr_os_file_t> -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_os_dir_get       , Ptr (Ptr <apr_os_dir_t>) -> Ptr <apr_dir_t> -> IO <apr_status_t>
+#ccall apr_os_sock_get      , Ptr <apr_os_sock_t> -> Ptr <apr_socket_t> -> IO <apr_status_t>
+#ccall apr_os_proc_mutex_get, Ptr <apr_os_proc_mutex_t> -> Ptr <apr_proc_mutex_t> -> IO <apr_status_t>
+#ccall apr_os_exp_time_get  , Ptr (Ptr <apr_os_exp_time_t>) -> Ptr <apr_time_exp_t> -> Ptr <apr_status_t>
+#ccall apr_os_imp_time_get  , Ptr (Ptr <apr_os_imp_time_t>) -> Ptr <apr_time_t> -> Ptr <apr_status_t>
+#ccall apr_os_shm_get       , Ptr <apr_os_shm_t> -> Ptr <apr_shm_t> -> IO <apr_status_t>
+
+#if APR_HAS_THREADS
+#  ccall apr_os_thread_get    , Ptr (Ptr <apr_os_thread_t>) -> Ptr <apr_thread_t> -> IO <apr_status_t>
+#  ccall apr_os_threadkey_get , Ptr <apr_os_threadkey_t> -> Ptr <apr_threadkey_t> -> IO <apr_status_t>
+#  ccall apr_os_thread_put    , Ptr (Ptr <apr_thread_t>) -> Ptr <apr_os_thread_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall apr_os_threadkey_put , Ptr (Ptr <apr_threadkey_t>) -> Ptr <apr_os_threadkey_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+-- FIXME: apr_os_thread_t
+-- #  ccall apr_os_thread_current, IO <apr_os_thread_t>
+#endif
+
+#ccall apr_os_file_put      , Ptr (Ptr <apr_file_t>) -> Ptr <apr_os_file_t> -> <apr_int32_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_pipe_put      , Ptr (Ptr <apr_file_t>) -> Ptr <apr_os_file_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_pipe_put_ex   , Ptr (Ptr <apr_file_t>) -> Ptr <apr_os_file_t> -> CInt -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_dir_put       , Ptr (Ptr <apr_dir_t>) -> Ptr <apr_os_dir_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_sock_put      , Ptr (Ptr <apr_socket_t>) -> Ptr <apr_os_sock_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_sock_make     , Ptr (Ptr <apr_socket_t>) -> Ptr <apr_os_sock_info_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_proc_mutex_put, Ptr (Ptr <apr_proc_mutex_t>) -> Ptr <apr_os_proc_mutex_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_imp_time_put  , Ptr <apr_time_t> -> Ptr (Ptr <apr_os_imp_time_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_exp_time_put  , Ptr <apr_time_exp_t> -> Ptr (Ptr <apr_os_exp_time_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_os_shm_put       , Ptr (Ptr <apr_shm_t>) -> Ptr <apr_os_shm_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+
+#if APR_HAS_DSO
+#  ccall apr_os_dso_handle_put, Ptr (Ptr <apr_dso_handle_t>) -> Ptr <apr_os_dso_handle_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall apr_os_dso_handle_get, Ptr (Ptr <apr_os_dso_handle_t>) -> Ptr <apr_dso_handle_t> -> IO <apr_status_t>
+#  if APR_HAS_OS_UUID
+#    ccall apr_os_uuid_get    , Ptr CUChar -> IO <apr_status_t>
+#  endif
+#endif
+
+#ccall apr_os_default_encoding, Ptr <apr_pool_t> -> IO (Ptr CChar)
+#ccall apr_os_locale_encoding , Ptr <apr_pool_t> -> IO (Ptr CChar)
diff --git a/Bindings/APR/Proc/Mutex.hsc b/Bindings/APR/Proc/Mutex.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Proc/Mutex.hsc
@@ -0,0 +1,30 @@
+#include <bindings.dsl.h>
+#include <apr_proc_mutex.h>
+
+module Bindings.APR.Proc.Mutex where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#integral_t apr_lockmech_e
+#num APR_LOCK_FCNTL
+#num APR_LOCK_FLOCK
+#num APR_LOCK_SYSVSEM
+#num APR_LOCK_PROC_PTHREAD
+#num APR_LOCK_POSIXSEM
+#num APR_LOCK_DEFAULT
+
+#opaque_t apr_proc_mutex_t
+
+#ccall apr_proc_mutex_create    , Ptr (Ptr <apr_proc_mutex_t>) -> Ptr CChar -> <apr_lockmech_e> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_proc_mutex_child_init, Ptr (Ptr <apr_proc_mutex_t>) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_proc_mutex_lock      , Ptr <apr_proc_mutex_t> -> IO <apr_status_t>
+#ccall apr_proc_mutex_trylock   , Ptr <apr_proc_mutex_t> -> IO <apr_status_t>
+#ccall apr_proc_mutex_unlock    , Ptr <apr_proc_mutex_t> -> IO <apr_status_t>
+#ccall apr_proc_mutex_destroy   , Ptr <apr_proc_mutex_t> -> IO <apr_status_t>
+#ccall apr_proc_mutex_cleanup   , Ptr () -> IO <apr_status_t>
+#ccall apr_proc_mutex_lockfile  , Ptr <apr_proc_mutex_t> -> IO (Ptr CChar)
+#ccall apr_proc_mutex_name      , Ptr <apr_proc_mutex_t> -> IO (Ptr CChar)
+#ccall apr_proc_mutex_defname   , IO (Ptr CChar)
+
+#ccall apr_proc_mutex_pool_get  , Ptr <apr_proc_mutex_t> -> IO (Ptr <apr_pool_t>)
diff --git a/Bindings/APR/Random.hsc b/Bindings/APR/Random.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Random.hsc
@@ -0,0 +1,29 @@
+#include <bindings.dsl.h>
+#include <apr_random.h>
+
+module Bindings.APR.Random where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+import Bindings.APR.Thread.Proc
+
+#opaque_t apr_crypto_hash_t
+
+#callback apr_crypto_hash_init_t  , Ptr <apr_crypto_hash_t> -> IO ()
+#callback apr_crypto_hash_add_t   , Ptr <apr_crypto_hash_t> -> Ptr () -> <apr_size_t> -> IO ()
+#callback apr_crypto_hash_finish_t, Ptr <apr_crypto_hash_t> -> Ptr CUChar -> IO ()
+
+#ccall apr_crypto_sha256_new, Ptr <apr_pool_t> -> IO (Ptr <apr_crypto_hash_t>)
+
+#opaque_t apr_random_t
+
+#ccall apr_random_init          , Ptr <apr_random_t> -> Ptr <apr_pool_t> -> Ptr <apr_crypto_hash_t> -> Ptr <apr_crypto_hash_t> -> Ptr <apr_crypto_hash_t> -> IO ()
+#ccall apr_random_standard_new  , Ptr <apr_pool_t> -> IO (Ptr <apr_random_t>)
+#ccall apr_random_add_entropy   , Ptr <apr_random_t> -> Ptr () -> <apr_size_t> -> IO ()
+#ccall apr_random_insecure_bytes, Ptr <apr_random_t> -> Ptr () -> <apr_size_t> -> IO <apr_status_t>
+#ccall apr_random_secure_bytes  , Ptr <apr_random_t> -> Ptr () -> <apr_size_t> -> IO <apr_status_t>
+#ccall apr_random_barrier       , Ptr <apr_random_t> -> IO ()
+#ccall apr_random_secure_ready  , Ptr <apr_random_t> -> IO <apr_status_t>
+#ccall apr_random_insecure_ready, Ptr <apr_random_t> -> IO <apr_status_t>
+#ccall apr_random_after_fork    , Ptr <apr_proc_t> -> IO ()
diff --git a/Bindings/APR/Shm.hsc b/Bindings/APR/Shm.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Shm.hsc
@@ -0,0 +1,21 @@
+#include <bindings.dsl.h>
+#include <apr_shm.h>
+#include "bindings.apr.pools.h"
+
+module Bindings.APR.Shm where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#opaque_t apr_shm_t
+
+#ccall apr_shm_create      , Ptr (Ptr <apr_shm_t>) -> <apr_size_t> -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_shm_remove      , Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_shm_destroy     , Ptr <apr_shm_t> -> IO <apr_status_t>
+#ccall apr_shm_attach      , Ptr (Ptr <apr_shm_t>) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_shm_detach      , Ptr <apr_shm_t> -> IO <apr_status_t>
+#ccall apr_shm_baseaddr_get, Ptr <apr_shm_t> -> IO (Ptr ())
+#ccall apr_shm_size_get    , Ptr <apr_shm_t> -> IO <apr_size_t>
+
+#apr_pool_accessor shm
diff --git a/Bindings/APR/Signal.hsc b/Bindings/APR/Signal.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Signal.hsc
@@ -0,0 +1,17 @@
+#include <bindings.dsl.h>
+#include <apr_signal.h>
+
+module Bindings.APR.Signal where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#callback apr_sigfunc_t, CInt -> IO ()
+
+#cinline apr_signal, CInt -> <apr_sigfunc_t> -> IO <apr_sigfunc_t>
+
+#ccall apr_signal_description_get, CInt -> IO (Ptr CChar)
+#ccall apr_signal_init           , Ptr <apr_pool_t> -> IO ()
+#ccall apr_signal_block          , CInt -> IO <apr_status_t>
+#ccall apr_signal_unblock        , CInt -> IO <apr_status_t>
diff --git a/Bindings/APR/Strings.hsc b/Bindings/APR/Strings.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Strings.hsc
@@ -0,0 +1,33 @@
+#include <bindings.dsl.h>
+#include <apr_strings.h>
+
+module Bindings.APR.Strings where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+import Bindings.APR.Want
+
+#ccall apr_strnatcmp    , Ptr CChar -> Ptr CChar -> IO CInt
+#ccall apr_strnatcasecmp, Ptr CChar -> Ptr CChar -> IO CInt
+#ccall apr_pstrdup      , Ptr <apr_pool_t> -> Ptr CChar -> IO (Ptr CChar)
+#ccall apr_pstrmemdup   , Ptr <apr_pool_t> -> Ptr CChar -> <apr_size_t> -> IO (Ptr CChar)
+#ccall apr_pstrndup     , Ptr <apr_pool_t> -> Ptr CChar -> <apr_size_t> -> IO (Ptr CChar)
+#ccall apr_pmemdup      , Ptr <apr_pool_t> -> Ptr () -> <apr_size_t> -> IO (Ptr ())
+-- FIXME: apr_pstrcat
+#ccall apr_pstrcatv     , Ptr <apr_pool_t> -> Ptr <iovec> -> <apr_size_t> -> Ptr <apr_size_t> -> IO (Ptr CChar)
+-- FIXME: apr_pvsprintf
+-- FIXME: apr_psprintf
+#ccall apr_cpystrn         , Ptr CChar -> Ptr CChar -> <apr_size_t> -> IO (Ptr CChar)
+#ccall apr_collapse_spaces , Ptr CChar -> Ptr CChar -> IO (Ptr CChar)
+#ccall apr_tokenize_to_argv, Ptr CChar -> Ptr (Ptr (Ptr CChar)) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_strtok          , Ptr CChar -> Ptr CChar -> Ptr (Ptr CChar) -> IO (Ptr CChar)
+-- FIXME: apr_snprintf
+-- FIXME: apr_vsnprintf
+#ccall apr_itoa         , Ptr <apr_pool_t> -> CInt -> IO (Ptr CChar)
+#ccall apr_ltoa         , Ptr <apr_pool_t> -> CLong -> IO (Ptr CChar)
+#ccall apr_off_t_toa    , Ptr <apr_pool_t> -> <apr_off_t> -> IO (Ptr CChar)
+#ccall apr_strtoff      , Ptr <apr_off_t> -> Ptr CChar -> Ptr (Ptr CChar) -> CInt -> IO <apr_status_t>
+#ccall apr_strtoi64     , Ptr CChar -> Ptr (Ptr CChar) -> CInt -> IO <apr_int64_t>
+#ccall apr_atoi64       , Ptr CChar -> IO <apr_int64_t>
+#ccall apr_strfsize     , <apr_off_t> -> Ptr CChar -> IO (Ptr CChar)
diff --git a/Bindings/APR/Support.hsc b/Bindings/APR/Support.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Support.hsc
@@ -0,0 +1,10 @@
+#include <bindings.dsl.h>
+#include <apr_shm.h>
+
+module Bindings.APR.Support where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.File.Types
+import Bindings.APR.Network.IO
+
+#ccall apr_wait_for_io_or_timeout, Ptr <apr_file_t> -> Ptr <apr_socket_t> -> CInt -> IO <apr_status_t>
diff --git a/Bindings/APR/Tables.hsc b/Bindings/APR/Tables.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Tables.hsc
@@ -0,0 +1,67 @@
+#include <bindings.dsl.h>
+#include <apr_tables.h>
+
+module Bindings.APR.Tables where
+#strict_import
+import Bindings.APR
+import Bindings.APR.Pools
+
+#opaque_t apr_table_t
+
+#starttype struct apr_array_header_t
+#  field pool    , Ptr <apr_pool_t>
+#  field elt_size, CInt
+#  field nelts   , CInt
+#  field nalloc  , CInt
+#  field elts    , Ptr CChar
+#stoptype
+
+#starttype struct apr_table_entry_t
+#  field key, Ptr CChar
+#  field val, Ptr CChar
+#  field key_checksum, <apr_uint32_t>
+#stoptype
+
+#ccall apr_table_elts    , Ptr <apr_table_t> -> IO (Ptr <apr_array_header_t>)
+
+#ccall apr_is_empty_table, Ptr <apr_table_t> -> IO CInt
+#ccall apr_is_empty_array, Ptr <apr_array_header_t> -> IO CInt
+
+#ccall apr_array_make    , Ptr <apr_pool_t> -> CInt -> CInt -> IO (Ptr <apr_array_header_t>)
+#ccall apr_array_push    , Ptr <apr_array_header_t> -> IO (Ptr ())
+
+-- It's impossible to wrap around APR_ARRAY_IDX and APR_ARRAY_PUSH as
+-- they take C types as their arguments.
+
+#ccall apr_array_pop     , Ptr <apr_array_header_t> -> IO (Ptr ())
+#ccall apr_array_clear   , Ptr <apr_array_header_t> -> IO ()
+#ccall apr_array_cat     , Ptr <apr_array_header_t> -> Ptr <apr_array_header_t> -> IO ()
+#ccall apr_array_copy    , Ptr <apr_pool_t> -> Ptr <apr_array_header_t> -> IO (Ptr <apr_array_header_t>)
+#ccall apr_array_copy_hdr, Ptr <apr_pool_t> -> Ptr <apr_array_header_t> -> IO (Ptr <apr_array_header_t>)
+#ccall apr_array_append  , Ptr <apr_pool_t> -> Ptr <apr_array_header_t> -> Ptr <apr_array_header_t> -> IO (Ptr <apr_array_header_t>)
+#ccall apr_array_pstrcat , Ptr <apr_pool_t> -> Ptr <apr_array_header_t> -> CChar -> IO (Ptr CChar)
+
+#ccall apr_table_make  , Ptr <apr_pool_t> -> CInt -> IO (Ptr <apr_table_t>)
+#ccall apr_table_copy  , Ptr <apr_pool_t> -> Ptr <apr_table_t> -> IO (Ptr <apr_table_t>)
+#ccall apr_table_clone , Ptr <apr_pool_t> -> Ptr <apr_table_t> -> IO (Ptr <apr_table_t>)
+#ccall apr_table_clear , Ptr <apr_table_t> -> IO ()
+#ccall apr_table_get   , Ptr <apr_table_t> -> Ptr CChar -> IO (Ptr CChar)
+#ccall apr_table_set   , Ptr <apr_table_t> -> Ptr CChar -> Ptr CChar -> IO ()
+#ccall apr_table_setn  , Ptr <apr_table_t> -> Ptr CChar -> Ptr CChar -> IO ()
+#ccall apr_table_unset , Ptr <apr_table_t> -> Ptr CChar -> Ptr CChar -> IO ()
+#ccall apr_table_merge , Ptr <apr_table_t> -> Ptr CChar -> Ptr CChar -> IO ()
+#ccall apr_table_mergen, Ptr <apr_table_t> -> Ptr CChar -> Ptr CChar -> IO ()
+#ccall apr_table_add   , Ptr <apr_table_t> -> Ptr CChar -> Ptr CChar -> IO ()
+#ccall apr_table_addn  , Ptr <apr_table_t> -> Ptr CChar -> Ptr CChar -> IO ()
+#ccall apr_table_overlay, Ptr <apr_pool_t> -> Ptr <apr_table_t> -> Ptr <apr_table_t> -> IO (Ptr <apr_table_t>)
+
+#callback apr_table_do_callback_fn_t, Ptr () -> Ptr CChar -> Ptr CChar -> IO CInt
+
+-- It's impossible to wrap around apr_table_do and apr_table_vdo as
+-- they take varargs.
+
+#num APR_OVERLAP_TABLES_SET
+#num APR_OVERLAP_TABLES_MERGE
+
+#ccall apr_table_overlap , Ptr <apr_table_t> -> Ptr <apr_table_t> -> CUInt -> IO ()
+#ccall apr_table_compress, Ptr <apr_table_t> -> CUInt -> IO ()
diff --git a/Bindings/APR/Thread/Cond.hsc b/Bindings/APR/Thread/Cond.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Thread/Cond.hsc
@@ -0,0 +1,24 @@
+#include <bindings.dsl.h>
+#include <apr_thread_cond.h>
+
+module Bindings.APR.Thread.Cond where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+import Bindings.APR.Thread.Mutex
+import Bindings.APR.Time
+
+#if APR_HAS_THREADS
+
+#  opaque_t apr_thread_cond_t
+
+#  ccall apr_thread_cond_create   , Ptr (Ptr <apr_thread_cond_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall apr_thread_cond_wait     , Ptr <apr_thread_cond_t> -> Ptr <apr_thread_mutex_t> -> IO <apr_status_t>
+#  ccall apr_thread_cond_timedwait, Ptr <apr_thread_cond_t> -> Ptr <apr_thread_mutex_t> -> <apr_interval_time_t> -> IO <apr_status_t>
+#  ccall apr_thread_cond_signal   , Ptr <apr_thread_cond_t> -> IO <apr_status_t>
+#  ccall apr_thread_cond_broadcast, Ptr <apr_thread_cond_t> -> IO <apr_status_t>
+#  ccall apr_thread_cond_destroy  , Ptr <apr_thread_cond_t> -> IO <apr_status_t>
+
+#  ccall apr_thread_cond_pool_get , Ptr <apr_thread_cond_t> -> IO (Ptr <apr_pool_t>)
+
+#endif
diff --git a/Bindings/APR/Thread/Mutex.hsc b/Bindings/APR/Thread/Mutex.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Thread/Mutex.hsc
@@ -0,0 +1,21 @@
+#include <bindings.dsl.h>
+#include <apr_thread_mutex.h>
+
+module Bindings.APR.Thread.Mutex where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#opaque_t apr_thread_mutex_t
+
+#num APR_THREAD_MUTEX_DEFAULT
+#num APR_THREAD_MUTEX_NESTED
+#num APR_THREAD_MUTEX_UNNESTED
+
+#ccall apr_thread_mutex_create , Ptr <apr_thread_mutex_t> -> CUInt -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_thread_mutex_lock   , Ptr <apr_thread_mutex_t> -> IO <apr_status_t>
+#ccall apr_thread_mutex_trylock, Ptr <apr_thread_mutex_t> -> IO <apr_status_t>
+#ccall apr_thread_mutex_unlock , Ptr <apr_thread_mutex_t> -> IO <apr_status_t>
+#ccall apr_thread_mutex_destroy, Ptr <apr_thread_mutex_t> -> IO <apr_status_t>
+
+#ccall apr_thread_mutex_pool_get, Ptr <apr_thread_mutex_t> -> IO (Ptr <apr_pool_t>)
diff --git a/Bindings/APR/Thread/Proc.hsc b/Bindings/APR/Thread/Proc.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Thread/Proc.hsc
@@ -0,0 +1,161 @@
+#include <bindings.dsl.h>
+#include <apr_thread_proc.h>
+
+module Bindings.APR.Thread.Proc where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.File.Types
+import Bindings.APR.Pools
+import System.Posix.Types
+
+#integral_t apr_cmdtype_e
+#num APR_SHELLCMD
+#num APR_PROGRAM
+#num APR_PROGRAM_ENV
+#num APR_PROGRAM_PATH
+#num APR_SHELLCMD_ENV
+
+#integral_t apr_wait_how_e
+#num APR_WAIT
+#num APR_NOWAIT
+
+#integral_t apr_exit_why_e
+#num APR_PROC_EXIT
+#num APR_PROC_SIGNAL
+#num APR_PROC_SIGNAL_CORE
+
+#cinline APR_PROC_CHECK_EXIT     , Ptr <apr_exit_why_e> -> IO CInt
+#cinline APR_PROC_CHECK_SIGNALED , Ptr <apr_exit_why_e> -> IO CInt
+#cinline APR_PROC_CHECK_CORE_DUMP, Ptr <apr_exit_why_e> -> IO CInt
+
+#num APR_NO_PIPE
+#num APR_FULL_BLOCK
+#num APR_FULL_NONBLOCK
+#num APR_PARENT_BLOCK
+#num APR_CHILD_BLOCK
+#num APR_NO_FILE
+
+#num APR_READ_BLOCK
+#num APR_WRITE_BLOCK
+
+#num APR_LIMIT_CPU
+#num APR_LIMIT_MEM
+#num APR_LIMIT_NPROC
+#num APR_LIMIT_NOFILE
+
+#num APR_OC_REASON_DEATH
+#num APR_OC_REASON_UNWRITABLE
+#num APR_OC_REASON_RESTART
+#num APR_OC_REASON_UNREGISTER
+#num APR_OC_REASON_LOST
+#num APR_OC_REASON_RUNNING
+
+#starttype struct apr_proc_t
+#  field pid, CPid
+#  field in , Ptr <apr_file_t>
+#  field out, Ptr <apr_file_t>
+#  field err, Ptr <apr_file_t>
+#  if APR_HAS_PROC_INVOKED
+#    field invoked, Ptr CCHar
+#  endif
+#stoptype
+
+#callback apr_child_errfn_t, Ptr <apr_pool_t> -> <apr_status_t> -> Ptr CChar -> IO ()
+
+#opaque_t apr_thread_t
+#opaque_t apr_threadattr_t
+#opaque_t apr_procattr_t
+#opaque_t apr_thread_once_t
+#opaque_t apr_threadkey_t
+#opaque_t apr_other_child_rec_t
+
+#callback apr_thread_start_t, Ptr <apr_thread_t> -> Ptr () -> IO (Ptr ())
+
+#integral_t apr_kill_conditions_e
+#num APR_KILL_NEVER
+#num APR_KILL_ALWAYS
+#num APR_KILL_AFTER_TIMEOUT
+#num APR_JUST_WAIT
+#num APR_KILL_ONLY_ONCE
+
+#if APR_HAS_THREADS
+
+#  ccall apr_threadattr_create       , Ptr (Ptr <apr_threadattr_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall apr_threadattr_detach_set   , Ptr <apr_threadattr_t> -> <apr_int32_t> -> IO <apr_status_t>
+#  ccall apr_threadattr_detach_get   , Ptr <apr_threadattr_t> -> IO <apr_status_t>
+#  ccall apr_threadattr_stacksize_set, Ptr <apr_threadattr_t> -> <apr_size_t> -> IO <apr_status_t>
+#  ccall apr_threadattr_guardsize_set, Ptr <apr_threadattr_t> -> <apr_size_t> -> IO <apr_status_t>
+
+#  ccall apr_thread_create   , Ptr (Ptr <apr_thread_t>) -> Ptr <apr_threadattr_t> -> <apr_thread_start_t> -> Ptr () -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall apr_thread_exit     , Ptr <apr_thread_t> -> <apr_status_t> -> IO <apr_status_t>
+#  ccall apr_thread_join     , Ptr <apr_status_t> -> Ptr <apr_thread_t> -> IO <apr_status_t>
+#  ccall apr_thread_yield    , IO ()
+
+#  ccall apr_thread_once_init, Ptr (Ptr <apr_thread_once_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall apr_thread_once     , Ptr <apr_thread_once_t> -> FunPtr (IO ()) -> IO <apr_status_t>
+
+#  ccall apr_thread_detach   , Ptr <apr_thread_t> -> IO <apr_status_t>
+#  ccall apr_thread_data_get , Ptr (Ptr ()) -> Ptr CChar -> Ptr <apr_thread_t> -> IO <apr_status_t>
+#  ccall apr_thread_data_set , Ptr () -> Ptr CChar -> FunPtr (Ptr () -> IO <apr_status_t>) -> Ptr <apr_thread_t> -> IO <apr_status_t>
+
+#  ccall apr_threadkey_private_create, Ptr (Ptr <apr_threadkey_t>) -> FunPtr (Ptr () -> IO ()) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall apr_threadkey_private_get   , Ptr (Ptr ()) -> Ptr <apr_threadkey_t> -> IO <apr_status_t>
+#  ccall apr_threadkey_private_set   , Ptr () -> Ptr <apr_threadkey_t> -> IO <apr_status_t>
+#  ccall apr_threadkey_private_delete, Ptr <apr_threadkey_t> -> Ptr <apr_status_t>
+
+#  ccall apr_threadkey_data_get, Ptr (Ptr ()) -> Ptr CChar -> Ptr <apr_threadkey_t> -> IO <apr_status_t>
+#  ccall apr_threadkey_data_set, Ptr () -> Ptr CChar -> FunPtr (Ptr () -> IO <apr_status_t>) -> Ptr <apr_threadkey_t> -> IO <apr_status_t>
+
+#endif
+
+#ccall apr_procattr_create       , Ptr (Ptr <apr_procattr_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_procattr_io_set       , Ptr <apr_procattr_t> -> <apr_int32_t> -> <apr_int32_t> -> <apr_int32_t> -> IO <apr_status_t>
+#ccall apr_procattr_child_in_set , Ptr <apr_procattr_t> -> Ptr <apr_file_t> -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_procattr_child_out_set, Ptr <apr_procattr_t> -> Ptr <apr_file_t> -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_procattr_child_err_set, Ptr <apr_procattr_t> -> Ptr <apr_file_t> -> Ptr <apr_file_t> -> IO <apr_status_t>
+#ccall apr_procattr_dir_set      , Ptr <apr_procattr_t> -> Ptr CChar -> IO <apr_status_t>
+#ccall apr_procattr_cmdtype_set  , Ptr <apr_procattr_t> -> <apr_cmdtype_e> -> IO <apr_status_t>
+#ccall apr_procattr_detach_set   , Ptr <apr_procattr_t> -> <apr_int32_t> -> IO <apr_status_t>
+
+#if APR_HAVE_STRUCT_RLIMIT
+-- FIXME: rlimit
+-- #  ccall apr_procattr_limit_set  , Ptr <apr_procattr_t> -> <apr_int32_t> -> Ptr <rlimit> -> IO <apr_status_t>
+#endif
+
+#ccall apr_procattr_child_errfn_set, Ptr <apr_procattr_t> -> <apr_child_errfn_t> -> IO <apr_status_t>
+#ccall apr_procattr_error_check_set, Ptr <apr_procattr_t> -> <apr_int32_t> -> IO <apr_status_t>
+#ccall apr_procattr_addrspace_set  , Ptr <apr_procattr_t> -> <apr_int32_t> -> IO <apr_status_t>
+#ccall apr_procattr_user_set       , Ptr <apr_procattr_t> -> Ptr CChar -> Ptr CChar -> IO <apr_status_t>
+#ccall apr_procattr_group_set      , Ptr <apr_procattr_t> -> Ptr CChar -> Ptr <apr_status_t>
+
+#if APR_HAS_FORK
+#  ccall apr_proc_fork, Ptr <apr_proc_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#endif
+
+#ccall apr_proc_create        , Ptr <apr_proc_t> -> Ptr CChar -> Ptr (Ptr CChar) -> Ptr (Ptr CChar) -> Ptr <apr_procattr_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_proc_wait          , Ptr <apr_proc_t> -> Ptr CInt -> Ptr <apr_exit_why_e> -> <apr_wait_how_e> -> IO <apr_status_t>
+#ccall apr_proc_wait_all_procs, Ptr <apr_proc_t> -> Ptr CInt -> Ptr <apr_exit_why_e> -> <apr_wait_how_e> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+
+#num APR_PROC_DETACH_FOREGROUND
+#num APR_PROC_DETACH_DAEMONIZE
+
+#ccall apr_proc_detach                 , CInt -> IO <apr_status_t>
+#ccall apr_proc_other_child_register   , Ptr <apr_proc_t> -> FunPtr (CInt -> Ptr () -> CInt -> IO ()) -> Ptr () -> Ptr <apr_file_t> -> Ptr <apr_pool_t> -> IO ()
+#ccall apr_proc_other_child_unregister , Ptr () -> IO ()
+#ccall apr_proc_other_child_alert      , Ptr <apr_proc_t> -> CInt -> CInt -> IO <apr_status_t>
+#ccall apr_proc_other_child_refresh    , Ptr <apr_other_child_rec_t> -> CInt -> IO ()
+#ccall apr_proc_other_child_refresh_all, CInt -> IO ()
+#ccall apr_proc_kill                   , Ptr <apr_proc_t> -> CInt -> IO <apr_status_t>
+#ccall apr_pool_note_subprocess        , Ptr <apr_pool_t> -> Ptr <apr_pool_t> -> <apr_kill_conditions_e> -> IO ()
+
+#if APR_HAS_THREADS
+
+#  if (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2)
+#    ccall apr_setup_signal_thread, IO <apr_status_t>
+#    ccall apr_signal_thread      , FunPtr (CInt -> IO CInt) -> IO <apr_status_t>
+#  endif
+
+#  ccall apr_thread_pool_get, Ptr <apr_thread_t> -> IO (Ptr <apr_pool_t>)
+
+#endif
diff --git a/Bindings/APR/Thread/RWLock.hsc b/Bindings/APR/Thread/RWLock.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Thread/RWLock.hsc
@@ -0,0 +1,18 @@
+#include <bindings.dsl.h>
+#include <apr_thread_rwlock.h>
+
+module Bindings.APR.Thread.RWLock where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#opaque_t apr_thread_rwlock_t
+
+#ccall apr_thread_rwlock_create   , Ptr (Ptr <apr_thread_rwlock_t>) -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#ccall apr_thread_rwlock_rdlock   , Ptr <apr_thread_rwlock_t> -> IO <apr_status_t>
+#ccall apr_thread_rwlock_tryrdlock, Ptr <apr_thread_rwlock_t> -> IO <apr_status_t>
+#ccall apr_thread_rwlock_wrlock   , Ptr <apr_thread_rwlock_t> -> IO <apr_status_t>
+#ccall apr_thread_rwlock_trywrlock, Ptr <apr_thread_rwlock_t> -> IO <apr_status_t>
+#ccall apr_thread_rwlock_destroy  , Ptr <apr_thread_rwlock_t> -> IO <apr_status_t>
+
+#ccall apr_thread_rwlock_pool_get , Ptr <apr_thread_rwlock_t> -> IO (Ptr <apr_pool_t>)
diff --git a/Bindings/APR/Time.hsc b/Bindings/APR/Time.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Time.hsc
@@ -0,0 +1,62 @@
+#include <bindings.dsl.h>
+#include <apr_time.h>
+
+module Bindings.APR.Time where
+#strict_import
+import Bindings.APR
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#globalvar apr_month_snames, Ptr (Ptr CChar)
+#globalvar apr_day_snames  , Ptr (Ptr CChar)
+
+#integral_t apr_time_t
+#globalarray APR_TIME_T_FMT, CChar
+
+#integral_t apr_interval_time_t
+#integral_t apr_short_interval_time_t
+
+#num APR_USEC_PER_SEC
+
+#cinline apr_time_sec , <apr_time_t> -> IO <apr_time_t>
+#cinline apr_time_usec, <apr_time_t> -> IO <apr_time_t>
+#cinline apr_time_msec, <apr_time_t> -> IO <apr_time_t>
+#cinline apr_time_as_msec , <apr_time_t> -> IO <apr_time_t>
+#cinline apr_time_from_sec, <apr_time_t> -> IO <apr_time_t>
+#cinline apr_time_make, <apr_time_t> -> <apr_time_t> -> IO <apr_time_t>
+
+#ccall apr_time_now, IO <apr_time_t>
+
+#starttype struct apr_time_exp_t
+#  field tm_usec, <apr_int32_t>
+#  field tm_sec , <apr_int32_t>
+#  field tm_min , <apr_int32_t>
+#  field tm_hour, <apr_int32_t>
+#  field tm_mday, <apr_int32_t>
+#  field tm_mon , <apr_int32_t>
+#  field tm_year, <apr_int32_t>
+#  field tm_wday, <apr_int32_t>
+#  field tm_yday, <apr_int32_t>
+#  field tm_isdst , <apr_int32_t>
+#  field tm_gmtoff, <apr_int32_t>
+#stoptype
+
+#ccall apr_time_ansi_put, Ptr <apr_time_t> -> CTime -> IO <apr_status_t>
+
+#ccall apr_time_exp_tz , Ptr <apr_time_exp_t> -> <apr_time_t> -> <apr_int32_t> -> IO <apr_status_t>
+#ccall apr_time_exp_gmt, Ptr <apr_time_exp_t> -> <apr_time_t> -> IO <apr_status_t>
+#ccall apr_time_exp_lt , Ptr <apr_time_exp_t> -> <apr_time_t> -> IO <apr_status_t>
+#ccall apr_time_exp_get    , Ptr <apr_time_t> -> Ptr <apr_time_exp_t> -> IO <apr_status_t>
+#ccall apr_time_exp_gmt_get, Ptr <apr_time_t> -> Ptr <apr_time_exp_t> -> IO <apr_status_t>
+
+#ccall apr_sleep, <apr_interval_time_t> -> IO ()
+
+#num   APR_RFC822_DATE_LEN
+#ccall apr_rfc822_date, Ptr CChar -> <apr_time_t> -> IO <apr_status_t>
+
+#num   APR_CTIME_LEN
+#ccall apr_ctime, Ptr CChar -> <apr_time_t> -> IO <apr_status_t>
+
+#ccall apr_strftime, Ptr CChar -> Ptr <apr_size_t> -> <apr_size_t> -> Ptr CChar -> Ptr <apr_time_exp_t> -> IO <apr_status_t>
+
+#ccall apr_time_clock_hires, Ptr <apr_pool_t> -> IO ()
diff --git a/Bindings/APR/User.hsc b/Bindings/APR/User.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/User.hsc
@@ -0,0 +1,24 @@
+#include <bindings.dsl.h>
+#include <apr_user.h>
+
+module Bindings.APR.User where
+#strict_import
+import Bindings.APR.ErrNo
+import Bindings.APR.Pools
+
+#integral_t apr_uid_t
+#integral_t apr_gid_t
+
+#if APR_HAS_USER
+
+#  ccall   apr_uid_current     , Ptr <apr_uid_t> -> Ptr <apr_gid_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall   apr_uid_name_get    , Ptr (Ptr CChar) -> <apr_uid_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall   apr_uid_get         , Ptr <apr_uid_t> -> Ptr <apr_gid_t> -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall   apr_uid_homepath_get, Ptr (Ptr CChar) -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  cinline apr_uid_compare     , <apr_uid_t> -> <apr_uid_t> -> IO <apr_status_t>
+
+#  ccall   apr_gid_name_get    , Ptr (Ptr CChar) -> <apr_gid_t> -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  ccall   apr_gid_get         , Ptr <apr_gid_t> -> Ptr CChar -> Ptr <apr_pool_t> -> IO <apr_status_t>
+#  cinline apr_gid_compare     , <apr_gid_t> -> <apr_gid_t> -> IO <apr_status_t>
+
+#endif
diff --git a/Bindings/APR/Version.hsc b/Bindings/APR/Version.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Version.hsc
@@ -0,0 +1,27 @@
+#include <bindings.dsl.h>
+#include <apr_version.h>
+
+module Bindings.APR.Version where
+#strict_import
+
+#num APR_MAJOR_VERSION
+#num APR_MINOR_VERSION
+#num APR_PATCH_VERSION
+
+#cinline APR_VERSION_AT_LEAST, CInt -> CInt -> CInt -> IO CInt
+
+#globalarray APR_VERSION_STRING, CChar
+
+#if !defined(APR_VERSION_ONLY)
+
+#  starttype apr_version_t
+#    field major , CInt
+#    field minor , CInt
+#    field patch , CInt
+#    field is_dev, CInt
+#  stoptype
+
+#  ccall apr_version, Ptr <apr_version_t> -> IO ()
+#  ccall apr_version_string, IO (Ptr CChar)
+
+#endif
diff --git a/Bindings/APR/Want.hsc b/Bindings/APR/Want.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/APR/Want.hsc
@@ -0,0 +1,10 @@
+#include <bindings.dsl.h>
+#include <apr_want.h>
+
+module Bindings.APR.Want where
+#strict_import
+
+#starttype struct iovec
+#  field iov_base, Ptr CChar
+#  field iov_len , CSize
+#stoptype
diff --git a/COPYING b/COPYING
new file mode 100644
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,29 @@
+<!-- -*- xml -*-
+
+bindings-apr はパブリックドメインに在ります。
+bindings-apr is in the public domain.
+
+See http://creativecommons.org/licenses/publicdomain/
+
+-->
+
+<rdf:RDF xmlns="http://web.resource.org/cc/"
+	     xmlns:dc="http://purl.org/dc/elements/1.1/"
+	     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+  <Work rdf:about="http://cielonegro.org/Bindings-APR.html">
+	<dc:title>bindings-apr</dc:title>
+	<dc:rights>
+      <Agent>
+	    <dc:title>PHO</dc:title>
+	  </Agent>
+    </dc:rights>
+	<license rdf:resource="http://web.resource.org/cc/PublicDomain" />
+  </Work>
+      
+  <License rdf:about="http://web.resource.org/cc/PublicDomain">
+	<permits rdf:resource="http://web.resource.org/cc/Reproduction" />
+	<permits rdf:resource="http://web.resource.org/cc/Distribution" />
+	<permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+  </License>
+
+</rdf:RDF>
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,4 @@
+#!/usr/bin/env runghc
+
+import Distribution.Simple
+main = defaultMain
diff --git a/bindings-apr.cabal b/bindings-apr.cabal
new file mode 100644
--- /dev/null
+++ b/bindings-apr.cabal
@@ -0,0 +1,93 @@
+Name: bindings-apr
+Synopsis: Low level bindings to Apache Portable Runtime (APR)
+Description:
+        Bindings to APR: <http://apr.apache.org/>
+Version: 0.1
+License: PublicDomain
+License-File: COPYING
+Author: PHO <pho at cielonegro dot org>
+Maintainer: PHO <pho at cielonegro dot org>
+Stability: experimental
+Homepage: http://cielonegro.org/Bindings-APR.html
+Category: FFI
+Tested-With: GHC == 6.12.3
+Cabal-Version: >= 1.6
+Build-Type: Simple
+Extra-Source-Files:
+    COPYING
+
+Source-Repository head
+    Type: git
+    Location: git://git.cielonegro.org/bindings-apr.git
+
+Library
+    Build-Depends:
+        base         == 4.2.*,
+        bindings-DSL == 1.0.*
+
+    PkgConfig-Depends:
+        apr-1 >= 1.3
+
+    Exposed-Modules:
+        Bindings.APR
+        Bindings.APR.Allocator.Types
+        Bindings.APR.Atomic
+        Bindings.APR.DSO
+        Bindings.APR.Env
+        Bindings.APR.ErrNo
+        Bindings.APR.File.IO
+        Bindings.APR.File.Info
+        Bindings.APR.File.Types
+        Bindings.APR.FNMatch
+        Bindings.APR.General
+        Bindings.APR.GetOpt
+        Bindings.APR.Global.Mutex
+        Bindings.APR.Hash
+        Bindings.APR.Lib
+        Bindings.APR.MMap
+        Bindings.APR.Network.IO
+        Bindings.APR.Poll
+        Bindings.APR.Pools
+        Bindings.APR.Portable
+        Bindings.APR.Proc.Mutex
+        Bindings.APR.Random
+        Bindings.APR.Shm
+        Bindings.APR.Signal
+        Bindings.APR.Strings
+        Bindings.APR.Support
+        Bindings.APR.Tables
+        Bindings.APR.Thread.Cond
+        Bindings.APR.Thread.Mutex
+        Bindings.APR.Thread.Proc
+        Bindings.APR.Thread.RWLock
+        Bindings.APR.Time
+        Bindings.APR.User
+        Bindings.APR.Version
+        Bindings.APR.Want
+
+    C-Sources:
+        cbits/helper_apr.c
+        cbits/helper_apr_errno.c
+        cbits/helper_apr_general.c
+        cbits/helper_apr_global_mutex.c
+        cbits/helper_apr_pools.c
+        cbits/helper_apr_lib.c
+        cbits/helper_apr_mmap.c
+        cbits/helper_apr_network_io.c
+        cbits/helper_apr_portable.c
+        cbits/helper_apr_signal.c
+        cbits/helper_apr_time.c
+        cbits/helper_apr_thread_proc.c
+        cbits/helper_apr_user.c
+        cbits/helper_apr_version.c
+
+    Include-Dirs:
+        include
+
+    Install-Includes:
+        bindings.apr.inherit.h
+        bindings.apr.pools.h
+        bindings.apr.ring.h
+
+    Extensions:
+        ForeignFunctionInterface
diff --git a/cbits/helper_apr.c b/cbits/helper_apr.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr.c
@@ -0,0 +1,13 @@
+#include <bindings.cmacros.h>
+#include <apr.h>
+
+BC_GLOBALARRAY(APR_SSIZE_T_FMT     , char)
+BC_GLOBALARRAY(APR_SIZE_T_FMT      , char)
+BC_GLOBALARRAY(APR_OFF_T_FMT       , char)
+BC_GLOBALARRAY(APR_PID_T_FMT       , char)
+BC_GLOBALARRAY(APR_INT64_T_FMT     , char)
+BC_GLOBALARRAY(APR_UINT64_T_FMT    , char)
+BC_GLOBALARRAY(APR_UINT64_T_HEX_FMT, char)
+
+BC_GLOBALARRAY(APR_EOL_STR         , char)
+BC_GLOBALARRAY(APR_DSOPATH         , char)
diff --git a/cbits/helper_apr_errno.c b/cbits/helper_apr_errno.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_errno.c
@@ -0,0 +1,76 @@
+#include <bindings.cmacros.h>
+#include <apr_errno.h>
+
+BC_INLINE1(APR_STATUS_IS_ENOSTAT    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOPOOL    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EBADDATE   , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EINVALSOCK , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOPROC    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOTIME    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENODIR     , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOPOLL    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOSOCKET  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOTHREAD  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOTHDKEY  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EGENERAL   , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOSHMAVAIL, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EBADIP     , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EBADMASK   , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EDSOOPEN   , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EABSOLUTE  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ERELATIVE  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EINCOMPLETE, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EABOVEROOT , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EBADPATH   , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EPATHWILD  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ESYMNOTFOUND     , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EPROC_UNKNOWN    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOTENOUGHENTROPY, apr_status_t, int)
+
+BC_INLINE1(APR_STATUS_IS_INCHILD   , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_INPARENT  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_DETACH    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_NOTDETACH , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_CHILD_DONE, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_CHILD_NOTDONE, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_TIMEUP    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_INCOMPLETE, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_BADCH     , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_BADARG    , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EOF       , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_NOTFOUND  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ANONYMOUS , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_FILEBASED , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_KEYBASED  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EINIT     , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOTIMPL  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EMISMATCH , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EBUSY     , apr_status_t, int)
+
+BC_INLINE1(APR_STATUS_IS_EACCES , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EEXIST , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENAMETOOLONG, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOENT , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOTDIR, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOSPC , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOMEM , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EMFILE , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENFILE , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EBADF  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EINVAL , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ESPIPE , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EAGAIN , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EINTR  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOTSOCK, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ECONNREFUSED, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EINPROGRESS , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ECONNABORTED, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ECONNRESET  , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ETIMEDOUT   , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EHOSTUNREACH, apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENETUNREACH , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EFTYPE      , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EPIPE       , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EXDEV       , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_ENOTEMPTY   , apr_status_t, int)
+BC_INLINE1(APR_STATUS_IS_EAFNOSUPPORT, apr_status_t, int)
diff --git a/cbits/helper_apr_general.c b/cbits/helper_apr_general.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_general.c
@@ -0,0 +1,11 @@
+#include <bindings.cmacros.h>
+#include <apr_general.h>
+
+BC_INLINE2(strcasecmp , const char*, const char*, int)
+BC_INLINE3(strncasecmp, const char*, const char*, size_t, int)
+
+BC_INLINE2(APR_ALIGN, apr_uint64_t, apr_uint64_t, apr_uint64_t)
+BC_INLINE1(APR_ALIGN_DEFAULT, apr_uint64_t, apr_uint64_t)
+
+BC_INLINE3(memmove, void*, const void*, size_t, void*)
+BC_INLINE3(memchr , const void*, int, size_t, void*)
diff --git a/cbits/helper_apr_global_mutex.c b/cbits/helper_apr_global_mutex.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_global_mutex.c
@@ -0,0 +1,11 @@
+#include <bindings.cmacros.h>
+#include <apr_global_mutex.h>
+
+BC_INLINE4(apr_global_mutex_create    , apr_global_mutex_t**, const char*, apr_lockmech_e, apr_pool_t*, apr_status_t)
+BC_INLINE3(apr_global_mutex_child_init, apr_global_mutex_t**, const char*, apr_pool_t*, apr_status_t)
+BC_INLINE1(apr_global_mutex_lock      , apr_global_mutex_t*, apr_status_t)
+BC_INLINE1(apr_global_mutex_trylock   , apr_global_mutex_t*, apr_status_t)
+BC_INLINE1(apr_global_mutex_unlock    , apr_global_mutex_t*, apr_status_t)
+BC_INLINE1(apr_global_mutex_destroy   , apr_global_mutex_t*, apr_status_t)
+
+BC_INLINE1(apr_global_mutex_pool_get  , apr_global_mutex_t*, apr_pool_t*)
diff --git a/cbits/helper_apr_lib.c b/cbits/helper_apr_lib.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_lib.c
@@ -0,0 +1,19 @@
+#include <bindings.cmacros.h>
+#include <apr_lib.h>
+#include <signal.h>
+
+BC_INLINE2(apr_killpg, pid_t, int, int)
+
+BC_INLINE1(apr_isalnum , int, int)
+BC_INLINE1(apr_isalpha , int, int)
+BC_INLINE1(apr_isdigit , int, int)
+BC_INLINE1(apr_isgraph , int, int)
+BC_INLINE1(apr_islower , int, int)
+BC_INLINE1(apr_isascii , int, int)
+BC_INLINE1(apr_isprint , int, int)
+BC_INLINE1(apr_ispunct , int, int)
+BC_INLINE1(apr_isspace , int, int)
+BC_INLINE1(apr_isupper , int, int)
+BC_INLINE1(apr_isxdigit, int, int)
+BC_INLINE1(apr_tolower , int, int)
+BC_INLINE1(apr_toupper , int, int)
diff --git a/cbits/helper_apr_mmap.c b/cbits/helper_apr_mmap.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_mmap.c
@@ -0,0 +1,4 @@
+#include <bindings.cmacros.h>
+#include <apr_mmap.h>
+
+BC_INLINE1(APR_MMAP_CANDIDATE, apr_off_t, int)
diff --git a/cbits/helper_apr_network_io.c b/cbits/helper_apr_network_io.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_network_io.c
@@ -0,0 +1,4 @@
+#include <bindings.cmacros.h>
+#include <apr_network_io.h>
+
+BC_GLOBALARRAY(APR_ANYADDR, char)
diff --git a/cbits/helper_apr_pools.c b/cbits/helper_apr_pools.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_pools.c
@@ -0,0 +1,23 @@
+#include <bindings.cmacros.h>
+#include <apr_pools.h>
+
+#if APR_POOL_DEBUG
+BC_INLINE4(apr_pool_create_ex, apr_pool_t**, apr_pool_t*, apr_abortfunc_t, apr_allocator_t*, apr_status_t)
+BC_INLINE3(apr_pool_create_core_ex, apr_pool_t**, apr_abortfunc_t, apr_allocator_t*, apr_status_t)
+BC_INLINE3(apr_pool_create_unmanaged_ex, apr_pool_t**, apr_abortfunc_t, apr_allocator_t*, apr_status_t)
+#endif
+
+BC_INLINE2(apr_pool_create, apr_pool_t**, apr_pool_t*, apr_status_t)
+BC_INLINE1(apr_pool_create_core, apr_pool_t**, apr_status_t)
+BC_INLINE1(apr_pool_create_unmanaged, apr_pool_t**, apr_status_t)
+
+#if APR_POOL_DEBUG
+BC_INLINE1VOID(apr_pool_clear  , apr_pool_t*)
+BC_INLINE1VOID(apr_pool_destroy, apr_pool_t*)
+BC_INLINE3(apr_palloc, apr_pool_t*, apr_size_t, const char*, void*)
+#endif
+
+BC_INLINE2(apr_pcalloc, apr_pool_t*, apr_size_t, void*)
+
+BC_INLINE2VOID(apr_pool_join, apr_pool_t*, apr_pool_t*)
+BC_INLINE2VOID(apr_pool_lock, apr_pool_t*, int)
diff --git a/cbits/helper_apr_portable.c b/cbits/helper_apr_portable.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_portable.c
@@ -0,0 +1,4 @@
+#include <bindings.cmacros.h>
+#include <apr_portable.h>
+
+BC_INLINE2(apr_os_global_mutex_get, apr_os_global_mutex_t*, apr_global_mutex_t*, apr_status_t)
diff --git a/cbits/helper_apr_signal.c b/cbits/helper_apr_signal.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_signal.c
@@ -0,0 +1,6 @@
+#include <bindings.cmacros.h>
+#include <apr_signal.h>
+
+void (*inline_apr_signal(int signo, void (*func)(int)))(int) {
+    return apr_signal(signo, func);
+}
diff --git a/cbits/helper_apr_thread_proc.c b/cbits/helper_apr_thread_proc.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_thread_proc.c
@@ -0,0 +1,6 @@
+#include <bindings.cmacros.h>
+#include <apr_thread_proc.h>
+
+BC_INLINE1(APR_PROC_CHECK_EXIT     , apr_exit_why_e, int)
+BC_INLINE1(APR_PROC_CHECK_SIGNALED , apr_exit_why_e, int)
+BC_INLINE1(APR_PROC_CHECK_CORE_DUMP, apr_exit_why_e, int)
diff --git a/cbits/helper_apr_time.c b/cbits/helper_apr_time.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_time.c
@@ -0,0 +1,11 @@
+#include <bindings.cmacros.h>
+#include <apr_time.h>
+
+BC_GLOBALARRAY(APR_TIME_T_FMT, char)
+
+BC_INLINE1(apr_time_sec , apr_time_t, apr_time_t)
+BC_INLINE1(apr_time_usec, apr_time_t, apr_time_t)
+BC_INLINE1(apr_time_msec, apr_time_t, apr_time_t)
+BC_INLINE1(apr_time_as_msec , apr_time_t, apr_time_t)
+BC_INLINE1(apr_time_from_sec, apr_time_t, apr_time_t)
+BC_INLINE2(apr_time_make, apr_time_t, apr_time_t, apr_time_t)
diff --git a/cbits/helper_apr_user.c b/cbits/helper_apr_user.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_user.c
@@ -0,0 +1,5 @@
+#include <bindings.cmacros.h>
+#include <apr_user.h>
+
+BC_INLINE2(apr_uid_compare, apr_uid_t, apr_uid_t, apr_status_t)
+BC_INLINE2(apr_gid_compare, apr_gid_t, apr_gid_t, apr_status_t)
diff --git a/cbits/helper_apr_version.c b/cbits/helper_apr_version.c
new file mode 100644
--- /dev/null
+++ b/cbits/helper_apr_version.c
@@ -0,0 +1,6 @@
+#include <bindings.cmacros.h>
+#include <apr_version.h>
+
+BC_INLINE3(APR_VERSION_AT_LEAST, int, int, int, int)
+
+BC_GLOBALARRAY(APR_VERSION_STRING, char)
diff --git a/include/bindings.apr.inherit.h b/include/bindings.apr.inherit.h
new file mode 100644
--- /dev/null
+++ b/include/bindings.apr.inherit.h
@@ -0,0 +1,15 @@
+#ifndef __BINDINGS_APR_INHERIT_H__
+#define __BINDINGS_APR_INHERIT_H__
+#include <bindings.dsl.h>
+
+#define hsc_apr_inherit_set(TYPE)                       \
+    hsc_ccall(                                          \
+        apr_ ## TYPE ## _inherit_set,                   \
+        Ptr <apr_ ## TYPE ## _t> -> IO <apr_status_t>)
+
+#define hsc_apr_inherit_unset(TYPE)                     \
+    hsc_ccall(                                          \
+        apr_ ## TYPE ## _inherit_unset,                 \
+        Ptr <apr_ ## TYPE ## _t> -> IO <apr_status_t>)
+
+#endif
diff --git a/include/bindings.apr.pools.h b/include/bindings.apr.pools.h
new file mode 100644
--- /dev/null
+++ b/include/bindings.apr.pools.h
@@ -0,0 +1,10 @@
+#ifndef __BINDINGS_APR_POOLS_H__
+#define __BINDINGS_APR_POOLS_H__
+#include <bindings.dsl.h>
+
+#define hsc_apr_pool_accessor(TYPE)                        \
+    hsc_ccall(                                             \
+        apr_ ## TYPE ## _pool_get,                         \
+        Ptr <apr_ ## TYPE ## _t> -> IO (Ptr <apr_pool_t>))
+
+#endif
diff --git a/include/bindings.apr.ring.h b/include/bindings.apr.ring.h
new file mode 100644
--- /dev/null
+++ b/include/bindings.apr.ring.h
@@ -0,0 +1,15 @@
+#ifndef __BINDINGS_APR_RING_H__
+#define __BINDINGS_APR_RING_H__
+#include <bindings.dsl.h>
+
+#define hsc_apr_ring_entry_field(NAME, TYPE)    \
+    hsc_field(NAME.next, Ptr TYPE)              \
+    hsc_field(NAME.prev, Ptr TYPE)
+
+#define hsc_apr_ring_head_t(NAME, TYPE)         \
+    hsc_starttype(struct NAME)                  \
+    hsc_field(next, Ptr TYPE)                   \
+    hsc_field(prev, Ptr TYPE)                   \
+    hsc_stoptype(dummy)
+
+#endif
