diff --git a/Bindings/Libgit2.hs b/Bindings/Libgit2.hs
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2.hs
@@ -0,0 +1,42 @@
+
+module Bindings.Libgit2 (
+    module Bindings.Libgit2.Repository,
+    module Bindings.Libgit2.Config,
+    module Bindings.Libgit2.Types,
+    module Bindings.Libgit2.Revwalk,
+    module Bindings.Libgit2.OdbBackend,
+    module Bindings.Libgit2.Tag,
+    module Bindings.Libgit2.Net,
+    module Bindings.Libgit2.Refs,
+    module Bindings.Libgit2.Refspec,
+    module Bindings.Libgit2.Reflog,
+    module Bindings.Libgit2.Commit,
+    module Bindings.Libgit2.Index,
+    module Bindings.Libgit2.Signature,
+    module Bindings.Libgit2.Blob,
+    module Bindings.Libgit2.Errors,
+    module Bindings.Libgit2.Oid,
+    module Bindings.Libgit2.Tree,
+    module Bindings.Libgit2.Odb,
+    module Bindings.Libgit2.Common,
+    module Bindings.Libgit2.Object) where
+import Bindings.Libgit2.Repository
+import Bindings.Libgit2.Config
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Revwalk
+import Bindings.Libgit2.OdbBackend
+import Bindings.Libgit2.Tag
+import Bindings.Libgit2.Net
+import Bindings.Libgit2.Refs
+import Bindings.Libgit2.Refspec
+import Bindings.Libgit2.Reflog
+import Bindings.Libgit2.Commit
+import Bindings.Libgit2.Index
+import Bindings.Libgit2.Signature
+import Bindings.Libgit2.Blob
+import Bindings.Libgit2.Errors
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Tree
+import Bindings.Libgit2.Odb
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Object
diff --git a/Bindings/Libgit2/Attr.hsc b/Bindings/Libgit2/Attr.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Attr.hsc
@@ -0,0 +1,18 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+#include <git2/attr.h>
+module Bindings.Libgit2.Attr where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+
+{- extern __attribute__((visibility("default"))) const char * git_attr__true; -}
+{- extern __attribute__((visibility("default"))) const char * git_attr__false; -}
+{- extern __attribute__((visibility("default"))) const char * git_attr__unset; -}
+
+#ccall git_attr_get , Ptr (CString) -> Ptr <git_repository> -> CUInt -> CString -> CString -> IO (CInt)
+#ccall git_attr_get_many , Ptr (CString) -> Ptr <git_repository> -> CUInt -> CString -> CSize -> Ptr (CString) -> IO (CInt)
+#ccall git_attr_foreach , Ptr <git_repository> -> CUInt -> CString -> FunPtr (CString -> CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
+#ccall git_attr_cache_flush , Ptr <git_repository> -> IO ()
+#ccall git_attr_add_macro , Ptr <git_repository> -> CString -> CString -> IO (CInt)
diff --git a/Bindings/Libgit2/Attr.hsc.helper.c b/Bindings/Libgit2/Attr.hsc.helper.c
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Attr.hsc.helper.c
@@ -0,0 +1,7 @@
+#include <bindings.cmacros.h>
+#include <git2/attr.h>
+
+BC_INLINE1(GIT_ATTR_TRUE, const char *, int)
+BC_INLINE1(GIT_ATTR_FALSE, const char *, int)
+BC_INLINE1(GIT_ATTR_UNSPECIFIED, const char *, int)
+BC_INLINE1(GIT_ATTR_HAS_VALUE, const char *, int)
diff --git a/Bindings/Libgit2/Blob.hsc b/Bindings/Libgit2/Blob.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Blob.hsc
@@ -0,0 +1,17 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Blob where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Object
+#cinline git_blob_lookup , Ptr (Ptr <git_blob>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)
+#cinline git_blob_lookup_prefix , Ptr (Ptr <git_blob>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)
+#cinline git_blob_free , Ptr <git_blob> -> IO ()
+#ccall git_blob_rawcontent , Ptr <git_blob> -> IO (Ptr ())
+#ccall git_blob_rawsize , Ptr <git_blob> -> IO (CSize)
+#ccall git_blob_create_fromfile , Ptr <git_oid> -> Ptr <git_repository> -> CString -> IO (CInt)
+#ccall git_blob_create_fromdisk , Ptr <git_oid> -> Ptr <git_repository> -> CString -> IO (CInt)
+#ccall git_blob_create_frombuffer , Ptr <git_oid> -> Ptr <git_repository> -> Ptr () -> CSize -> IO (CInt)
diff --git a/Bindings/Libgit2/Blob.hsc.helper.c b/Bindings/Libgit2/Blob.hsc.helper.c
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Blob.hsc.helper.c
@@ -0,0 +1,6 @@
+#include <bindings.cmacros.h>
+#include <git2.h>
+
+BC_INLINE3(git_blob_lookup, git_blob * *, git_repository *, const git_oid *, int)
+BC_INLINE4(git_blob_lookup_prefix, git_blob * *, git_repository *, const git_oid *, unsigned int, int)
+BC_INLINE1VOID(git_blob_free, git_blob *)
diff --git a/Bindings/Libgit2/Branch.hsc b/Bindings/Libgit2/Branch.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Branch.hsc
@@ -0,0 +1,12 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Branch where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Types
+#ccall git_branch_create , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_object> -> CInt -> IO (CInt)
+#ccall git_branch_delete , Ptr <git_repository> -> CString -> <git_branch_t> -> IO (CInt)
+#ccall git_branch_list , Ptr <git_strarray> -> Ptr <git_repository> -> CUInt -> IO (CInt)
+#ccall git_branch_move , Ptr <git_repository> -> CString -> CString -> CInt -> IO (CInt)
diff --git a/Bindings/Libgit2/Commit.hsc b/Bindings/Libgit2/Commit.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Commit.hsc
@@ -0,0 +1,25 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Commit where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Object
+#cinline git_commit_lookup , Ptr (Ptr <git_commit>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)
+#cinline git_commit_lookup_prefix , Ptr (Ptr <git_commit>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)
+#cinline git_commit_free , Ptr <git_commit> -> IO ()
+#ccall git_commit_id , Ptr <git_commit> -> IO (Ptr <git_oid>)
+#ccall git_commit_message_encoding , Ptr <git_commit> -> IO (CString)
+#ccall git_commit_message , Ptr <git_commit> -> IO (CString)
+#ccall git_commit_time , Ptr <git_commit> -> IO (CLong)
+#ccall git_commit_time_offset , Ptr <git_commit> -> IO (CInt)
+#ccall git_commit_committer , Ptr <git_commit> -> IO (Ptr <git_signature>)
+#ccall git_commit_author , Ptr <git_commit> -> IO (Ptr <git_signature>)
+#ccall git_commit_tree , Ptr (Ptr <git_tree>) -> Ptr <git_commit> -> IO (CInt)
+#ccall git_commit_tree_oid , Ptr <git_commit> -> IO (Ptr <git_oid>)
+#ccall git_commit_parentcount , Ptr <git_commit> -> IO (CUInt)
+#ccall git_commit_parent , Ptr (Ptr <git_commit>) -> Ptr <git_commit> -> CUInt -> IO (CInt)
+#ccall git_commit_parent_oid , Ptr <git_commit> -> CUInt -> IO (Ptr <git_oid>)
+#ccall git_commit_create , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_signature> -> Ptr <git_signature> -> CString -> CString -> Ptr <git_tree> -> CInt -> Ptr (Ptr <git_commit>) -> IO (CInt)
diff --git a/Bindings/Libgit2/Commit.hsc.helper.c b/Bindings/Libgit2/Commit.hsc.helper.c
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Commit.hsc.helper.c
@@ -0,0 +1,6 @@
+#include <bindings.cmacros.h>
+#include <git2.h>
+
+BC_INLINE3(git_commit_lookup, git_commit * *, git_repository *, const git_oid *, int)
+BC_INLINE4(git_commit_lookup_prefix, git_commit * *, git_repository *, const git_oid *, unsigned, int)
+BC_INLINE1VOID(git_commit_free, git_commit *)
diff --git a/Bindings/Libgit2/Common.hsc b/Bindings/Libgit2/Common.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Common.hsc
@@ -0,0 +1,20 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Common where
+#strict_import
+
+{- typedef struct {
+            char * * strings; size_t count;
+        } git_strarray; -}
+#starttype git_strarray
+#field strings , Ptr (CString)
+#field count , CSize
+#stoptype
+#ccall git_strarray_free , Ptr <git_strarray> -> IO ()
+#ccall git_strarray_copy , Ptr <git_strarray> -> Ptr <git_strarray> -> IO (CInt)
+#ccall git_libgit2_version , Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()
+
+{- BEGIN MANUAL ENTRY -}
+#cinline GIT_PATH_LIST_SEPARATOR , CChar
+#num GIT_PATH_MAX
+{- END MANUAL ENTRY -}
diff --git a/Bindings/Libgit2/Common.hsc.helper.c b/Bindings/Libgit2/Common.hsc.helper.c
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Common.hsc.helper.c
@@ -0,0 +1,4 @@
+#include <bindings.cmacros.h>
+#include <git2.h>
+
+BC_INLINE_(GIT_PATH_LIST_SEPARATOR, char)
diff --git a/Bindings/Libgit2/Config.hsc b/Bindings/Libgit2/Config.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Config.hsc
@@ -0,0 +1,83 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Config where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+{- struct git_config_file {
+    struct git_config * cfg;
+    int (* open)(struct git_config_file *);
+    int (* get)(struct git_config_file *,
+                const char * key,
+                const char * * value);
+    int (* get_multivar)(struct git_config_file *,
+                         const char * key,
+                         const char * regexp,
+                         int (* fn)(const char *, void *),
+                         void * data);
+    int (* set)(struct git_config_file *,
+                const char * key,
+                const char * value);
+    int (* set_multivar)(git_config_file * cfg,
+                         const char * name,
+                         const char * regexp,
+                         const char * value);
+    int (* del)(struct git_config_file *, const char * key);
+    int (* foreach)(struct git_config_file *,
+                    int (* fn)(const char *, const char *, void *),
+                    void * data);
+    void (* free)(struct git_config_file *);
+}; -}
+#starttype git_config_file
+#field cfg , Ptr <git_config>
+#field open , FunPtr (Ptr <git_config_file> -> CInt)
+#field get , FunPtr (Ptr <git_config_file> -> CString -> Ptr (CString) -> CInt)
+#field get_multivar , FunPtr (Ptr <git_config_file> -> CString -> CString -> FunPtr (CString -> Ptr () -> CInt) -> Ptr () -> CInt)
+#field set , FunPtr (Ptr <git_config_file> -> CString -> CString -> CInt)
+#field set_multivar , FunPtr (Ptr <git_config_file> -> CString -> CString -> CString -> CInt)
+#field del , FunPtr (Ptr <git_config_file> -> CString -> CInt)
+#field foreach , FunPtr (Ptr <git_config_file> -> FunPtr (CString -> CString -> Ptr () -> CInt) -> Ptr () -> CInt)
+#field free , FunPtr (Ptr <git_config_file>)
+#stoptype
+{- typedef enum {
+            GIT_CVAR_FALSE = 0,
+            GIT_CVAR_TRUE = 1,
+            GIT_CVAR_INT32,
+            GIT_CVAR_STRING
+        } git_cvar_t; -}
+#integral_t git_cvar_t
+#num GIT_CVAR_FALSE
+#num GIT_CVAR_TRUE
+#num GIT_CVAR_INT32
+#num GIT_CVAR_STRING
+{- typedef struct {
+            git_cvar_t cvar_type; const char * str_match; int map_value;
+        } git_cvar_map; -}
+#starttype git_cvar_map
+#field cvar_type , <git_cvar_t>
+#field str_match , CString
+#field map_value , CInt
+#stoptype
+#ccall git_config_find_global , CString -> CSize -> IO (CInt)
+#ccall git_config_find_system , CString -> CSize -> IO (CInt)
+#ccall git_config_open_global , Ptr (Ptr <git_config>) -> IO (CInt)
+#ccall git_config_file__ondisk , Ptr (Ptr <git_config_file>) -> CString -> IO (CInt)
+#ccall git_config_new , Ptr (Ptr <git_config>) -> IO (CInt)
+#ccall git_config_add_file , Ptr <git_config> -> Ptr <git_config_file> -> CInt -> IO (CInt)
+#ccall git_config_add_file_ondisk , Ptr <git_config> -> CString -> CInt -> IO (CInt)
+#ccall git_config_open_ondisk , Ptr (Ptr <git_config>) -> CString -> IO (CInt)
+#ccall git_config_free , Ptr <git_config> -> IO ()
+#ccall git_config_get_int32 , Ptr CInt -> Ptr <git_config> -> CString -> IO (CInt)
+#ccall git_config_get_int64 , Ptr CLong -> Ptr <git_config> -> CString -> IO (CInt)
+#ccall git_config_get_bool , Ptr CInt -> Ptr <git_config> -> CString -> IO (CInt)
+#ccall git_config_get_string , Ptr (CString) -> Ptr <git_config> -> CString -> IO (CInt)
+#ccall git_config_get_multivar , Ptr <git_config> -> CString -> CString -> FunPtr (CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
+#ccall git_config_set_int32 , Ptr <git_config> -> CString -> CInt -> IO (CInt)
+#ccall git_config_set_int64 , Ptr <git_config> -> CString -> CLong -> IO (CInt)
+#ccall git_config_set_bool , Ptr <git_config> -> CString -> CInt -> IO (CInt)
+#ccall git_config_set_string , Ptr <git_config> -> CString -> CString -> IO (CInt)
+#ccall git_config_set_multivar , Ptr <git_config> -> CString -> CString -> CString -> IO (CInt)
+#ccall git_config_delete , Ptr <git_config> -> CString -> IO (CInt)
+#ccall git_config_foreach , Ptr <git_config> -> FunPtr (CString -> CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
+#ccall git_config_get_mapped , Ptr CInt -> Ptr <git_config> -> CString -> Ptr <git_cvar_map> -> CSize -> IO (CInt)
diff --git a/Bindings/Libgit2/Diff.hsc b/Bindings/Libgit2/Diff.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Diff.hsc
@@ -0,0 +1,169 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Diff where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Tree
+import Bindings.Libgit2.Refs
+{- enum {
+    GIT_DIFF_NORMAL = 0,
+    GIT_DIFF_REVERSE = 1 << 0,
+    GIT_DIFF_FORCE_TEXT = 1 << 1,
+    GIT_DIFF_IGNORE_WHITESPACE = 1 << 2,
+    GIT_DIFF_IGNORE_WHITESPACE_CHANGE = 1 << 3,
+    GIT_DIFF_IGNORE_WHITESPACE_EOL = 1 << 4,
+    GIT_DIFF_IGNORE_SUBMODULES = 1 << 5,
+    GIT_DIFF_PATIENCE = 1 << 6,
+    GIT_DIFF_INCLUDE_IGNORED = 1 << 7,
+    GIT_DIFF_INCLUDE_UNTRACKED = 1 << 8,
+    GIT_DIFF_INCLUDE_UNMODIFIED = 1 << 9,
+    GIT_DIFF_RECURSE_UNTRACKED_DIRS = 1 << 10
+}; -}
+#num GIT_DIFF_NORMAL
+#num GIT_DIFF_REVERSE
+#num GIT_DIFF_FORCE_TEXT
+#num GIT_DIFF_IGNORE_WHITESPACE
+#num GIT_DIFF_IGNORE_WHITESPACE_CHANGE
+#num GIT_DIFF_IGNORE_WHITESPACE_EOL
+#num GIT_DIFF_IGNORE_SUBMODULES
+#num GIT_DIFF_PATIENCE
+#num GIT_DIFF_INCLUDE_IGNORED
+#num GIT_DIFF_INCLUDE_UNTRACKED
+#num GIT_DIFF_INCLUDE_UNMODIFIED
+#num GIT_DIFF_RECURSE_UNTRACKED_DIRS
+{- typedef struct {
+            uint32_t flags;
+            uint16_t context_lines;
+            uint16_t interhunk_lines;
+            char * old_prefix;
+            char * new_prefix;
+            git_strarray pathspec;
+        } git_diff_options; -}
+#starttype git_diff_options
+#field flags , CUInt
+#field context_lines , CUShort
+#field interhunk_lines , CUShort
+#field old_prefix , CString
+#field new_prefix , CString
+#field pathspec , <git_strarray>
+#stoptype
+{- typedef struct git_diff_list git_diff_list; -}
+#opaque_t git_diff_list
+{- enum {
+    GIT_DIFF_FILE_VALID_OID = 1 << 0,
+    GIT_DIFF_FILE_FREE_PATH = 1 << 1,
+    GIT_DIFF_FILE_BINARY = 1 << 2,
+    GIT_DIFF_FILE_NOT_BINARY = 1 << 3,
+    GIT_DIFF_FILE_FREE_DATA = 1 << 4,
+    GIT_DIFF_FILE_UNMAP_DATA = 1 << 5
+}; -}
+#num GIT_DIFF_FILE_VALID_OID
+#num GIT_DIFF_FILE_FREE_PATH
+#num GIT_DIFF_FILE_BINARY
+#num GIT_DIFF_FILE_NOT_BINARY
+#num GIT_DIFF_FILE_FREE_DATA
+#num GIT_DIFF_FILE_UNMAP_DATA
+{- typedef enum {
+            GIT_DELTA_UNMODIFIED = 0,
+            GIT_DELTA_ADDED = 1,
+            GIT_DELTA_DELETED = 2,
+            GIT_DELTA_MODIFIED = 3,
+            GIT_DELTA_RENAMED = 4,
+            GIT_DELTA_COPIED = 5,
+            GIT_DELTA_IGNORED = 6,
+            GIT_DELTA_UNTRACKED = 7
+        } git_delta_t; -}
+#integral_t git_delta_t
+#num GIT_DELTA_UNMODIFIED
+#num GIT_DELTA_ADDED
+#num GIT_DELTA_DELETED
+#num GIT_DELTA_MODIFIED
+#num GIT_DELTA_RENAMED
+#num GIT_DELTA_COPIED
+#num GIT_DELTA_IGNORED
+#num GIT_DELTA_UNTRACKED
+{- typedef struct {
+            git_oid oid;
+            char * path;
+            uint16_t mode;
+            git_off_t size;
+            unsigned int flags;
+        } git_diff_file; -}
+#starttype git_diff_file
+#field oid , <git_oid>
+#field path , CString
+#field mode , CUShort
+#field size , CLong
+#field flags , CUInt
+#stoptype
+{- typedef struct {
+            git_diff_file old_file;
+            git_diff_file new_file;
+            git_delta_t status;
+            unsigned int similarity;
+            int binary;
+        } git_diff_delta; -}
+#starttype git_diff_delta
+#field old_file , <git_diff_file>
+#field new_file , <git_diff_file>
+#field status , <git_delta_t>
+#field similarity , CUInt
+#field binary , CInt
+#stoptype
+{- typedef int (* git_diff_file_fn)(void * cb_data,
+                                 git_diff_delta * delta,
+                                 float progress); -}
+#synonym_t git_diff_file_fn , CInt
+{- typedef struct {
+            int old_start; int old_lines; int new_start; int new_lines;
+        } git_diff_range; -}
+#starttype git_diff_range
+#field old_start , CInt
+#field old_lines , CInt
+#field new_start , CInt
+#field new_lines , CInt
+#stoptype
+{- typedef int (* git_diff_hunk_fn)(void * cb_data,
+                                 git_diff_delta * delta,
+                                 git_diff_range * range,
+                                 const char * header,
+                                 size_t header_len); -}
+#synonym_t git_diff_hunk_fn , CInt
+{- enum {
+    GIT_DIFF_LINE_CONTEXT = ' ',
+    GIT_DIFF_LINE_ADDITION = '+',
+    GIT_DIFF_LINE_DELETION = '-',
+    GIT_DIFF_LINE_ADD_EOFNL = '\n',
+    GIT_DIFF_LINE_DEL_EOFNL = '\0',
+    GIT_DIFF_LINE_FILE_HDR = 'F',
+    GIT_DIFF_LINE_HUNK_HDR = 'H',
+    GIT_DIFF_LINE_BINARY = 'B'
+}; -}
+#num GIT_DIFF_LINE_CONTEXT
+#num GIT_DIFF_LINE_ADDITION
+#num GIT_DIFF_LINE_DELETION
+#num GIT_DIFF_LINE_ADD_EOFNL
+#num GIT_DIFF_LINE_DEL_EOFNL
+#num GIT_DIFF_LINE_FILE_HDR
+#num GIT_DIFF_LINE_HUNK_HDR
+#num GIT_DIFF_LINE_BINARY
+{- typedef int (* git_diff_data_fn)(void * cb_data,
+                                 git_diff_delta * delta,
+                                 git_diff_range * range,
+                                 char line_origin,
+                                 const char * content,
+                                 size_t content_len); -}
+#synonym_t git_diff_data_fn , CInt
+#ccall git_diff_list_free , Ptr <git_diff_list> -> IO ()
+#ccall git_diff_tree_to_tree , Ptr <git_repository> -> Ptr <git_diff_options> -> Ptr <git_tree> -> Ptr <git_tree> -> Ptr (Ptr <git_diff_list>) -> IO (CInt)
+#ccall git_diff_index_to_tree , Ptr <git_repository> -> Ptr <git_diff_options> -> Ptr <git_tree> -> Ptr (Ptr <git_diff_list>) -> IO (CInt)
+#ccall git_diff_workdir_to_index , Ptr <git_repository> -> Ptr <git_diff_options> -> Ptr (Ptr <git_diff_list>) -> IO (CInt)
+#ccall git_diff_workdir_to_tree , Ptr <git_repository> -> Ptr <git_diff_options> -> Ptr <git_tree> -> Ptr (Ptr <git_diff_list>) -> IO (CInt)
+#ccall git_diff_merge , Ptr <git_diff_list> -> Ptr <git_diff_list> -> IO (CInt)
+#ccall git_diff_foreach , Ptr <git_diff_list> -> Ptr () -> CInt -> CInt -> CInt -> IO (CInt)
+#ccall git_diff_print_compact , Ptr <git_diff_list> -> Ptr () -> CInt -> IO (CInt)
+#ccall git_diff_print_patch , Ptr <git_diff_list> -> Ptr () -> CInt -> IO (CInt)
+#ccall git_diff_blobs , Ptr <git_blob> -> Ptr <git_blob> -> Ptr <git_diff_options> -> Ptr () -> CInt -> CInt -> CInt -> IO (CInt)
diff --git a/Bindings/Libgit2/Errors.hsc b/Bindings/Libgit2/Errors.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Errors.hsc
@@ -0,0 +1,66 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Errors where
+#strict_import
+
+import Bindings.Libgit2.Common
+{- enum {
+    GIT_OK = 0,
+    GIT_ERROR = -1,
+    GIT_ENOTFOUND = -3,
+    GIT_EEXISTS = -4,
+    GIT_EAMBIGUOUS = -5,
+    GIT_EBUFS = -6,
+    GIT_PASSTHROUGH = -30,
+    GIT_REVWALKOVER = -31
+}; -}
+#num GIT_OK
+#num GIT_ERROR
+#num GIT_ENOTFOUND
+#num GIT_EEXISTS
+#num GIT_EAMBIGUOUS
+#num GIT_EBUFS
+#num GIT_PASSTHROUGH
+#num GIT_REVWALKOVER
+{- typedef struct {
+            char * message; int klass;
+        } git_error; -}
+#starttype git_error
+#field message , CString
+#field klass , CInt
+#stoptype
+{- typedef enum {
+            GITERR_NOMEMORY,
+            GITERR_OS,
+            GITERR_INVALID,
+            GITERR_REFERENCE,
+            GITERR_ZLIB,
+            GITERR_REPOSITORY,
+            GITERR_CONFIG,
+            GITERR_REGEX,
+            GITERR_ODB,
+            GITERR_INDEX,
+            GITERR_OBJECT,
+            GITERR_NET,
+            GITERR_TAG,
+            GITERR_TREE,
+            GITERR_INDEXER
+        } git_error_t; -}
+#integral_t git_error_t
+#num GITERR_NOMEMORY
+#num GITERR_OS
+#num GITERR_INVALID
+#num GITERR_REFERENCE
+#num GITERR_ZLIB
+#num GITERR_REPOSITORY
+#num GITERR_CONFIG
+#num GITERR_REGEX
+#num GITERR_ODB
+#num GITERR_INDEX
+#num GITERR_OBJECT
+#num GITERR_NET
+#num GITERR_TAG
+#num GITERR_TREE
+#num GITERR_INDEXER
+#ccall giterr_last , IO (Ptr <git_error>)
+#ccall giterr_clear , IO ()
diff --git a/Bindings/Libgit2/Index.hsc b/Bindings/Libgit2/Index.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Index.hsc
@@ -0,0 +1,70 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Index where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+{- typedef struct {
+            git_time_t seconds; unsigned int nanoseconds;
+        } git_index_time; -}
+#starttype git_index_time
+#field seconds , CLong
+#field nanoseconds , CUInt
+#stoptype
+{- typedef struct git_index_entry {
+            git_index_time ctime;
+            git_index_time mtime;
+            unsigned int dev;
+            unsigned int ino;
+            unsigned int mode;
+            unsigned int uid;
+            unsigned int gid;
+            git_off_t file_size;
+            git_oid oid;
+            unsigned short flags;
+            unsigned short flags_extended;
+            char * path;
+        } git_index_entry; -}
+#starttype git_index_entry
+#field ctime , <git_index_time>
+#field mtime , <git_index_time>
+#field dev , CUInt
+#field ino , CUInt
+#field mode , CUInt
+#field uid , CUInt
+#field gid , CUInt
+#field file_size , CLong
+#field oid , <git_oid>
+#field flags , CUShort
+#field flags_extended , CUShort
+#field path , CString
+#stoptype
+{- typedef struct git_index_entry_unmerged {
+            unsigned int mode[3]; git_oid oid[3]; char * path;
+        } git_index_entry_unmerged; -}
+#starttype git_index_entry_unmerged
+#array_field mode , CUInt
+#array_field oid , <git_oid>
+#field path , CString
+#stoptype
+#ccall git_index_open , Ptr (Ptr <git_index>) -> CString -> IO (CInt)
+#ccall git_index_clear , Ptr <git_index> -> IO ()
+#ccall git_index_free , Ptr <git_index> -> IO ()
+#ccall git_index_read , Ptr <git_index> -> IO (CInt)
+#ccall git_index_write , Ptr <git_index> -> IO (CInt)
+#ccall git_index_find , Ptr <git_index> -> CString -> IO (CInt)
+#ccall git_index_uniq , Ptr <git_index> -> IO ()
+#ccall git_index_add , Ptr <git_index> -> CString -> CInt -> IO (CInt)
+#ccall git_index_add2 , Ptr <git_index> -> Ptr <git_index_entry> -> IO (CInt)
+#ccall git_index_append , Ptr <git_index> -> CString -> CInt -> IO (CInt)
+#ccall git_index_append2 , Ptr <git_index> -> Ptr <git_index_entry> -> IO (CInt)
+#ccall git_index_remove , Ptr <git_index> -> CInt -> IO (CInt)
+#ccall git_index_get , Ptr <git_index> -> CUInt -> IO (Ptr <git_index_entry>)
+#ccall git_index_entrycount , Ptr <git_index> -> IO (CUInt)
+#ccall git_index_entrycount_unmerged , Ptr <git_index> -> IO (CUInt)
+#ccall git_index_get_unmerged_bypath , Ptr <git_index> -> CString -> IO (Ptr <git_index_entry_unmerged>)
+#ccall git_index_get_unmerged_byindex , Ptr <git_index> -> CUInt -> IO (Ptr <git_index_entry_unmerged>)
+#ccall git_index_entry_stage , Ptr <git_index_entry> -> IO (CInt)
+#ccall git_index_read_tree , Ptr <git_index> -> Ptr <git_tree> -> IO (CInt)
diff --git a/Bindings/Libgit2/Indexer.hsc b/Bindings/Libgit2/Indexer.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Indexer.hsc
@@ -0,0 +1,28 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Indexer where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Oid
+{- typedef struct git_indexer_stats {
+            unsigned int total; unsigned int processed;
+        } git_indexer_stats; -}
+#starttype git_indexer_stats
+#field total , CUInt
+#field processed , CUInt
+#stoptype
+{- typedef struct git_indexer git_indexer; -}
+#opaque_t git_indexer
+{- typedef struct git_indexer_stream git_indexer_stream; -}
+#opaque_t git_indexer_stream
+#ccall git_indexer_stream_new , Ptr (Ptr <git_indexer_stream>) -> CString -> IO (CInt)
+#ccall git_indexer_stream_add , Ptr <git_indexer_stream> -> Ptr () -> CSize -> Ptr <git_indexer_stats> -> IO (CInt)
+#ccall git_indexer_stream_finalize , Ptr <git_indexer_stream> -> Ptr <git_indexer_stats> -> IO (CInt)
+#ccall git_indexer_stream_hash , Ptr <git_indexer_stream> -> IO (Ptr <git_oid>)
+#ccall git_indexer_stream_free , Ptr <git_indexer_stream> -> IO ()
+#ccall git_indexer_new , Ptr (Ptr <git_indexer>) -> CString -> IO (CInt)
+#ccall git_indexer_run , Ptr <git_indexer> -> Ptr <git_indexer_stats> -> IO (CInt)
+#ccall git_indexer_write , Ptr <git_indexer> -> IO (CInt)
+#ccall git_indexer_hash , Ptr <git_indexer> -> IO (Ptr <git_oid>)
+#ccall git_indexer_free , Ptr <git_indexer> -> IO ()
diff --git a/Bindings/Libgit2/Merge.hsc b/Bindings/Libgit2/Merge.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Merge.hsc
@@ -0,0 +1,9 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Merge where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+#ccall git_merge_base , Ptr <git_oid> -> Ptr <git_repository> -> Ptr <git_oid> -> Ptr <git_oid> -> IO (CInt)
diff --git a/Bindings/Libgit2/Net.hsc b/Bindings/Libgit2/Net.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Net.hsc
@@ -0,0 +1,19 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Net where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Types
+{- struct git_remote_head {
+    int local : 1; git_oid oid; git_oid loid; char * name;
+}; -}
+#starttype git_remote_head
+-- #field local , CInt
+#field oid , <git_oid>
+#field loid , <git_oid>
+#field name , CString
+#stoptype
+{- typedef int (* git_headlist_cb)(git_remote_head *, void *); -}
+#synonym_t git_headlist_cb , CInt
diff --git a/Bindings/Libgit2/Notes.hsc b/Bindings/Libgit2/Notes.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Notes.hsc
@@ -0,0 +1,22 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Notes where
+#strict_import
+
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Types
+#ccall git_note_read , Ptr (Ptr <git_note>) -> Ptr <git_repository> -> CString -> Ptr <git_oid> -> IO (CInt)
+#ccall git_note_message , Ptr <git_note> -> IO (CString)
+#ccall git_note_oid , Ptr <git_note> -> IO (Ptr <git_oid>)
+#ccall git_note_create , Ptr <git_oid> -> Ptr <git_repository> -> Ptr <git_signature> -> Ptr <git_signature> -> CString -> Ptr <git_oid> -> CString -> IO (CInt)
+#ccall git_note_remove , Ptr <git_repository> -> CString -> Ptr <git_signature> -> Ptr <git_signature> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_note_free , Ptr <git_note> -> IO ()
+#ccall git_note_default_ref , Ptr (CString) -> Ptr <git_repository> -> IO (CInt)
+{- typedef struct {
+            git_oid blob_oid; git_oid annotated_object_oid;
+        } git_note_data; -}
+#starttype git_note_data
+#field blob_oid , <git_oid>
+#field annotated_object_oid , <git_oid>
+#stoptype
+#ccall git_note_foreach , Ptr <git_repository> -> CString -> FunPtr (Ptr <git_note_data> -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
diff --git a/Bindings/Libgit2/Object.hsc b/Bindings/Libgit2/Object.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Object.hsc
@@ -0,0 +1,18 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Object where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+#ccall git_object_lookup , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_oid> -> <git_otype> -> IO (CInt)
+#ccall git_object_lookup_prefix , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> <git_otype> -> IO (CInt)
+#ccall git_object_id , Ptr <git_object> -> IO (Ptr <git_oid>)
+#ccall git_object_type , Ptr <git_object> -> IO (<git_otype>)
+#ccall git_object_owner , Ptr <git_object> -> IO (Ptr <git_repository>)
+#ccall git_object_free , Ptr <git_object> -> IO ()
+#ccall git_object_type2string , <git_otype> -> IO (CString)
+#ccall git_object_string2type , CString -> IO (<git_otype>)
+#ccall git_object_typeisloose , <git_otype> -> IO (CInt)
+#ccall git_object__size , <git_otype> -> IO (CSize)
diff --git a/Bindings/Libgit2/Odb.hsc b/Bindings/Libgit2/Odb.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Odb.hsc
@@ -0,0 +1,28 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Odb where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.OdbBackend
+#ccall git_odb_new , Ptr (Ptr <git_odb>) -> IO (CInt)
+#ccall git_odb_open , Ptr (Ptr <git_odb>) -> CString -> IO (CInt)
+#ccall git_odb_add_backend , Ptr <git_odb> -> Ptr <git_odb_backend> -> CInt -> IO (CInt)
+#ccall git_odb_add_alternate , Ptr <git_odb> -> Ptr <git_odb_backend> -> CInt -> IO (CInt)
+#ccall git_odb_free , Ptr <git_odb> -> IO ()
+#ccall git_odb_read , Ptr (Ptr <git_odb_object>) -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_odb_read_prefix , Ptr (Ptr <git_odb_object>) -> Ptr <git_odb> -> Ptr <git_oid> -> CUInt -> IO (CInt)
+#ccall git_odb_read_header , Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_odb_exists , Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_odb_write , Ptr <git_oid> -> Ptr <git_odb> -> Ptr () -> CSize -> <git_otype> -> IO (CInt)
+#ccall git_odb_open_wstream , Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb> -> CSize -> <git_otype> -> IO (CInt)
+#ccall git_odb_open_rstream , Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_odb_hash , Ptr <git_oid> -> Ptr () -> CSize -> <git_otype> -> IO (CInt)
+#ccall git_odb_hashfile , Ptr <git_oid> -> CString -> <git_otype> -> IO (CInt)
+#ccall git_odb_object_free , Ptr <git_odb_object> -> IO ()
+#ccall git_odb_object_id , Ptr <git_odb_object> -> IO (Ptr <git_oid>)
+#ccall git_odb_object_data , Ptr <git_odb_object> -> IO (Ptr ())
+#ccall git_odb_object_size , Ptr <git_odb_object> -> IO (CSize)
+#ccall git_odb_object_type , Ptr <git_odb_object> -> IO (<git_otype>)
diff --git a/Bindings/Libgit2/OdbBackend.hsc b/Bindings/Libgit2/OdbBackend.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/OdbBackend.hsc
@@ -0,0 +1,83 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.OdbBackend where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+{- struct git_odb_backend {
+    git_odb * odb;
+    int (* read)(void * *,
+                 size_t *,
+                 git_otype *,
+                 struct git_odb_backend *,
+                 const git_oid *);
+    int (* read_prefix)(git_oid *,
+                        void * *,
+                        size_t *,
+                        git_otype *,
+                        struct git_odb_backend *,
+                        const git_oid *,
+                        unsigned int);
+    int (* read_header)(size_t *,
+                        git_otype *,
+                        struct git_odb_backend *,
+                        const git_oid *);
+    int (* write)(git_oid *,
+                  struct git_odb_backend *,
+                  const void *,
+                  size_t,
+                  git_otype);
+    int (* writestream)(struct git_odb_stream * *,
+                        struct git_odb_backend *,
+                        size_t,
+                        git_otype);
+    int (* readstream)(struct git_odb_stream * *,
+                       struct git_odb_backend *,
+                       const git_oid *);
+    int (* exists)(struct git_odb_backend *, const git_oid *);
+    void (* free)(struct git_odb_backend *);
+}; -}
+#starttype git_odb_backend
+#field odb , Ptr <git_odb>
+#field read , FunPtr (Ptr (Ptr ()) -> Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb_backend> -> Ptr <git_oid> -> CInt)
+#field read_prefix , FunPtr (Ptr <git_oid> -> Ptr (Ptr ()) -> Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb_backend> -> Ptr <git_oid> -> CUInt -> CInt)
+#field read_header , FunPtr (Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb_backend> -> Ptr <git_oid> -> CInt)
+#field write , FunPtr (Ptr <git_oid> -> Ptr <git_odb_backend> -> Ptr () -> CSize -> <git_otype> -> CInt)
+#field writestream , FunPtr (Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb_backend> -> CSize -> <git_otype> -> CInt)
+#field readstream , FunPtr (Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb_backend> -> Ptr <git_oid> -> CInt)
+#field exists , FunPtr (Ptr <git_odb_backend> -> Ptr <git_oid> -> CInt)
+#field free , FunPtr (Ptr <git_odb_backend>)
+#stoptype
+{- enum {
+    GIT_STREAM_RDONLY = 1 << 1,
+    GIT_STREAM_WRONLY = 1 << 2,
+    GIT_STREAM_RW = GIT_STREAM_RDONLY | GIT_STREAM_WRONLY
+}; -}
+#num GIT_STREAM_RDONLY
+#num GIT_STREAM_WRONLY
+#num GIT_STREAM_RW
+{- struct git_odb_stream {
+    struct git_odb_backend * backend;
+    int mode;
+    int (* read)(struct git_odb_stream * stream,
+                 char * buffer,
+                 size_t len);
+    int (* write)(struct git_odb_stream * stream,
+                  const char * buffer,
+                  size_t len);
+    int (* finalize_write)(git_oid * oid_p,
+                           struct git_odb_stream * stream);
+    void (* free)(struct git_odb_stream * stream);
+}; -}
+#starttype git_odb_stream
+#field backend , Ptr <git_odb_backend>
+#field mode , CInt
+#field read , FunPtr (Ptr <git_odb_stream> -> CString -> CSize -> CInt)
+#field write , FunPtr (Ptr <git_odb_stream> -> CString -> CSize -> CInt)
+#field finalize_write , FunPtr (Ptr <git_oid> -> Ptr <git_odb_stream> -> CInt)
+#field free , FunPtr (Ptr <git_odb_stream>)
+#stoptype
+#ccall git_odb_backend_pack , Ptr (Ptr <git_odb_backend>) -> CString -> IO (CInt)
+#ccall git_odb_backend_loose , Ptr (Ptr <git_odb_backend>) -> CString -> CInt -> CInt -> IO (CInt)
diff --git a/Bindings/Libgit2/Oid.hsc b/Bindings/Libgit2/Oid.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Oid.hsc
@@ -0,0 +1,33 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Oid where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+#num GIT_OID_RAWSZ
+#num GIT_OID_HEXSZ
+#num GIT_OID_MINPREFIXLEN
+{- struct _git_oid {
+    unsigned char id[20];
+}; -}
+#starttype git_oid
+#array_field id , CUChar
+#stoptype
+#ccall git_oid_fromstr , Ptr <git_oid> -> CString -> IO (CInt)
+#ccall git_oid_fromstrn , Ptr <git_oid> -> CString -> CSize -> IO (CInt)
+#ccall git_oid_fromraw , Ptr <git_oid> -> Ptr CUChar -> IO ()
+#ccall git_oid_fmt , CString -> Ptr <git_oid> -> IO ()
+#ccall git_oid_pathfmt , CString -> Ptr <git_oid> -> IO ()
+#ccall git_oid_allocfmt , Ptr <git_oid> -> IO (CString)
+#ccall git_oid_tostr , CString -> CSize -> Ptr <git_oid> -> IO (CString)
+#ccall git_oid_cpy , Ptr <git_oid> -> Ptr <git_oid> -> IO ()
+#ccall git_oid_cmp , Ptr <git_oid> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_oid_ncmp , Ptr <git_oid> -> Ptr <git_oid> -> CUInt -> IO (CInt)
+#ccall git_oid_streq , Ptr <git_oid> -> CString -> IO (CInt)
+#ccall git_oid_iszero , Ptr <git_oid> -> IO (CInt)
+{- typedef struct git_oid_shorten git_oid_shorten; -}
+#opaque_t git_oid_shorten
+#ccall git_oid_shorten_new , CSize -> IO (Ptr <git_oid_shorten>)
+#ccall git_oid_shorten_add , Ptr <git_oid_shorten> -> CString -> IO (CInt)
+#ccall git_oid_shorten_free , Ptr <git_oid_shorten> -> IO ()
diff --git a/Bindings/Libgit2/Reflog.hsc b/Bindings/Libgit2/Reflog.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Reflog.hsc
@@ -0,0 +1,19 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Reflog where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+#ccall git_reflog_read , Ptr (Ptr <git_reflog>) -> Ptr <git_reference> -> IO (CInt)
+#ccall git_reflog_write , Ptr <git_reference> -> Ptr <git_oid> -> Ptr <git_signature> -> CString -> IO (CInt)
+#ccall git_reflog_rename , Ptr <git_reference> -> CString -> IO (CInt)
+#ccall git_reflog_delete , Ptr <git_reference> -> IO (CInt)
+#ccall git_reflog_entrycount , Ptr <git_reflog> -> IO (CUInt)
+#ccall git_reflog_entry_byindex , Ptr <git_reflog> -> CUInt -> IO (Ptr <git_reflog_entry>)
+#ccall git_reflog_entry_oidold , Ptr <git_reflog_entry> -> IO (Ptr <git_oid>)
+#ccall git_reflog_entry_oidnew , Ptr <git_reflog_entry> -> IO (Ptr <git_oid>)
+#ccall git_reflog_entry_committer , Ptr <git_reflog_entry> -> IO (Ptr <git_signature>)
+#ccall git_reflog_entry_msg , Ptr <git_reflog_entry> -> IO (CString)
+#ccall git_reflog_free , Ptr <git_reflog> -> IO ()
diff --git a/Bindings/Libgit2/Refs.hsc b/Bindings/Libgit2/Refs.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Refs.hsc
@@ -0,0 +1,29 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Refs where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+#ccall git_reference_lookup , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> IO (CInt)
+#ccall git_reference_name_to_oid , Ptr <git_oid> -> Ptr <git_repository> -> CString -> IO (CInt)
+#ccall git_reference_create_symbolic , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> CString -> CInt -> IO (CInt)
+#ccall git_reference_create_oid , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> Ptr <git_oid> -> CInt -> IO (CInt)
+#ccall git_reference_oid , Ptr <git_reference> -> IO (Ptr <git_oid>)
+#ccall git_reference_target , Ptr <git_reference> -> IO (CString)
+#ccall git_reference_type , Ptr <git_reference> -> IO (<git_ref_t>)
+#ccall git_reference_name , Ptr <git_reference> -> IO (CString)
+#ccall git_reference_resolve , Ptr (Ptr <git_reference>) -> Ptr <git_reference> -> IO (CInt)
+#ccall git_reference_owner , Ptr <git_reference> -> IO (Ptr <git_repository>)
+#ccall git_reference_set_target , Ptr <git_reference> -> CString -> IO (CInt)
+#ccall git_reference_set_oid , Ptr <git_reference> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_reference_rename , Ptr <git_reference> -> CString -> CInt -> IO (CInt)
+#ccall git_reference_delete , Ptr <git_reference> -> IO (CInt)
+#ccall git_reference_packall , Ptr <git_repository> -> IO (CInt)
+#ccall git_reference_list , Ptr <git_strarray> -> Ptr <git_repository> -> CUInt -> IO (CInt)
+#ccall git_reference_foreach , Ptr <git_repository> -> CUInt -> FunPtr (CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
+#ccall git_reference_is_packed , Ptr <git_reference> -> IO (CInt)
+#ccall git_reference_reload , Ptr <git_reference> -> IO (CInt)
+#ccall git_reference_free , Ptr <git_reference> -> IO ()
+#ccall git_reference_cmp , Ptr <git_reference> -> Ptr <git_reference> -> IO (CInt)
diff --git a/Bindings/Libgit2/Refspec.hsc b/Bindings/Libgit2/Refspec.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Refspec.hsc
@@ -0,0 +1,11 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Refspec where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+#ccall git_refspec_src , Ptr <git_refspec> -> IO (CString)
+#ccall git_refspec_dst , Ptr <git_refspec> -> IO (CString)
+#ccall git_refspec_src_matches , Ptr <git_refspec> -> CString -> IO (CInt)
+#ccall git_refspec_transform , CString -> CSize -> Ptr <git_refspec> -> CString -> IO (CInt)
diff --git a/Bindings/Libgit2/Remote.hsc b/Bindings/Libgit2/Remote.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Remote.hsc
@@ -0,0 +1,32 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Remote where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Repository
+import Bindings.Libgit2.Refspec
+import Bindings.Libgit2.Net
+import Bindings.Libgit2.Indexer
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Types
+#ccall git_remote_new , Ptr (Ptr <git_remote>) -> Ptr <git_repository> -> CString -> CString -> CString -> IO (CInt)
+#ccall git_remote_load , Ptr (Ptr <git_remote>) -> Ptr <git_repository> -> CString -> IO (CInt)
+#ccall git_remote_save , Ptr <git_remote> -> IO (CInt)
+#ccall git_remote_name , Ptr <git_remote> -> IO (CString)
+#ccall git_remote_url , Ptr <git_remote> -> IO (CString)
+#ccall git_remote_set_fetchspec , Ptr <git_remote> -> CString -> IO (CInt)
+#ccall git_remote_fetchspec , Ptr <git_remote> -> IO (Ptr <git_refspec>)
+#ccall git_remote_set_pushspec , Ptr <git_remote> -> CString -> IO (CInt)
+#ccall git_remote_pushspec , Ptr <git_remote> -> IO (Ptr <git_refspec>)
+#ccall git_remote_connect , Ptr <git_remote> -> CInt -> IO (CInt)
+#ccall git_remote_ls , Ptr <git_remote> -> CInt -> Ptr () -> IO (CInt)
+#ccall git_remote_download , Ptr <git_remote> -> Ptr CLong -> Ptr <git_indexer_stats> -> IO (CInt)
+#ccall git_remote_connected , Ptr <git_remote> -> IO (CInt)
+#ccall git_remote_disconnect , Ptr <git_remote> -> IO ()
+#ccall git_remote_free , Ptr <git_remote> -> IO ()
+#ccall git_remote_update_tips , Ptr <git_remote> -> FunPtr (CString -> Ptr <git_oid> -> Ptr <git_oid> -> CInt) -> IO (CInt)
+#ccall git_remote_valid_url , CString -> IO (CInt)
+#ccall git_remote_supported_url , CString -> IO (CInt)
+#ccall git_remote_list , Ptr <git_strarray> -> Ptr <git_repository> -> IO (CInt)
+#ccall git_remote_add , Ptr (Ptr <git_remote>) -> Ptr <git_repository> -> CString -> CString -> IO (CInt)
diff --git a/Bindings/Libgit2/Repository.hsc b/Bindings/Libgit2/Repository.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Repository.hsc
@@ -0,0 +1,33 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Repository where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+#ccall git_repository_open , Ptr (Ptr <git_repository>) -> CString -> IO (CInt)
+#ccall git_repository_discover , CString -> CSize -> CString -> CInt -> CString -> IO (CInt)
+{- enum {
+    GIT_REPOSITORY_OPEN_NO_SEARCH = 1 << 0,
+    GIT_REPOSITORY_OPEN_CROSS_FS = 1 << 1
+}; -}
+#num GIT_REPOSITORY_OPEN_NO_SEARCH
+#num GIT_REPOSITORY_OPEN_CROSS_FS
+#ccall git_repository_open_ext , Ptr (Ptr <git_repository>) -> CString -> CUInt -> CString -> IO (CInt)
+#ccall git_repository_free , Ptr <git_repository> -> IO ()
+#ccall git_repository_init , Ptr (Ptr <git_repository>) -> CString -> CUInt -> IO (CInt)
+#ccall git_repository_head , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> IO (CInt)
+#ccall git_repository_head_detached , Ptr <git_repository> -> IO (CInt)
+#ccall git_repository_head_orphan , Ptr <git_repository> -> IO (CInt)
+#ccall git_repository_is_empty , Ptr <git_repository> -> IO (CInt)
+#ccall git_repository_path , Ptr <git_repository> -> IO (CString)
+#ccall git_repository_workdir , Ptr <git_repository> -> IO (CString)
+#ccall git_repository_set_workdir , Ptr <git_repository> -> CString -> IO (CInt)
+#ccall git_repository_is_bare , Ptr <git_repository> -> IO (CInt)
+#ccall git_repository_config , Ptr (Ptr <git_config>) -> Ptr <git_repository> -> IO (CInt)
+#ccall git_repository_set_config , Ptr <git_repository> -> Ptr <git_config> -> IO ()
+#ccall git_repository_odb , Ptr (Ptr <git_odb>) -> Ptr <git_repository> -> IO (CInt)
+#ccall git_repository_set_odb , Ptr <git_repository> -> Ptr <git_odb> -> IO ()
+#ccall git_repository_index , Ptr (Ptr <git_index>) -> Ptr <git_repository> -> IO (CInt)
+#ccall git_repository_set_index , Ptr <git_repository> -> Ptr <git_index> -> IO ()
diff --git a/Bindings/Libgit2/Revwalk.hsc b/Bindings/Libgit2/Revwalk.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Revwalk.hsc
@@ -0,0 +1,22 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Revwalk where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+#ccall git_revwalk_new , Ptr (Ptr <git_revwalk>) -> Ptr <git_repository> -> IO (CInt)
+#ccall git_revwalk_reset , Ptr <git_revwalk> -> IO ()
+#ccall git_revwalk_push , Ptr <git_revwalk> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_revwalk_push_glob , Ptr <git_revwalk> -> CString -> IO (CInt)
+#ccall git_revwalk_push_head , Ptr <git_revwalk> -> IO (CInt)
+#ccall git_revwalk_hide , Ptr <git_revwalk> -> Ptr <git_oid> -> IO (CInt)
+#ccall git_revwalk_hide_glob , Ptr <git_revwalk> -> CString -> IO (CInt)
+#ccall git_revwalk_hide_head , Ptr <git_revwalk> -> IO (CInt)
+#ccall git_revwalk_push_ref , Ptr <git_revwalk> -> CString -> IO (CInt)
+#ccall git_revwalk_hide_ref , Ptr <git_revwalk> -> CString -> IO (CInt)
+#ccall git_revwalk_next , Ptr <git_oid> -> Ptr <git_revwalk> -> IO (CInt)
+#ccall git_revwalk_sorting , Ptr <git_revwalk> -> CUInt -> IO ()
+#ccall git_revwalk_free , Ptr <git_revwalk> -> IO ()
+#ccall git_revwalk_repository , Ptr <git_revwalk> -> IO (Ptr <git_repository>)
diff --git a/Bindings/Libgit2/Signature.hsc b/Bindings/Libgit2/Signature.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Signature.hsc
@@ -0,0 +1,11 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Signature where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+#ccall git_signature_new , Ptr (Ptr <git_signature>) -> CString -> CString -> CLong -> CInt -> IO (CInt)
+#ccall git_signature_now , Ptr (Ptr <git_signature>) -> CString -> CString -> IO (CInt)
+#ccall git_signature_dup , Ptr <git_signature> -> IO (Ptr <git_signature>)
+#ccall git_signature_free , Ptr <git_signature> -> IO ()
diff --git a/Bindings/Libgit2/Status.hsc b/Bindings/Libgit2/Status.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Status.hsc
@@ -0,0 +1,60 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Status where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+{- enum {
+    GIT_STATUS_CURRENT = 0,
+    GIT_STATUS_INDEX_NEW = 1 << 0,
+    GIT_STATUS_INDEX_MODIFIED = 1 << 1,
+    GIT_STATUS_INDEX_DELETED = 1 << 2,
+    GIT_STATUS_WT_NEW = 1 << 3,
+    GIT_STATUS_WT_MODIFIED = 1 << 4,
+    GIT_STATUS_WT_DELETED = 1 << 5,
+    GIT_STATUS_IGNORED = 1 << 6
+}; -}
+#num GIT_STATUS_CURRENT
+#num GIT_STATUS_INDEX_NEW
+#num GIT_STATUS_INDEX_MODIFIED
+#num GIT_STATUS_INDEX_DELETED
+#num GIT_STATUS_WT_NEW
+#num GIT_STATUS_WT_MODIFIED
+#num GIT_STATUS_WT_DELETED
+#num GIT_STATUS_IGNORED
+#ccall git_status_foreach , Ptr <git_repository> -> FunPtr (CString -> CUInt -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
+{- typedef enum {
+            GIT_STATUS_SHOW_INDEX_AND_WORKDIR = 0,
+            GIT_STATUS_SHOW_INDEX_ONLY = 1,
+            GIT_STATUS_SHOW_WORKDIR_ONLY = 2,
+            GIT_STATUS_SHOW_INDEX_THEN_WORKDIR = 3
+        } git_status_show_t; -}
+#integral_t git_status_show_t
+#num GIT_STATUS_SHOW_INDEX_AND_WORKDIR
+#num GIT_STATUS_SHOW_INDEX_ONLY
+#num GIT_STATUS_SHOW_WORKDIR_ONLY
+#num GIT_STATUS_SHOW_INDEX_THEN_WORKDIR
+{- enum {
+    GIT_STATUS_OPT_INCLUDE_UNTRACKED = 1 << 0,
+    GIT_STATUS_OPT_INCLUDE_IGNORED = 1 << 1,
+    GIT_STATUS_OPT_INCLUDE_UNMODIFIED = 1 << 2,
+    GIT_STATUS_OPT_EXCLUDE_SUBMODULED = 1 << 3,
+    GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS = 1 << 4
+}; -}
+#num GIT_STATUS_OPT_INCLUDE_UNTRACKED
+#num GIT_STATUS_OPT_INCLUDE_IGNORED
+#num GIT_STATUS_OPT_INCLUDE_UNMODIFIED
+#num GIT_STATUS_OPT_EXCLUDE_SUBMODULED
+#num GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS
+{- typedef struct {
+            git_status_show_t show; unsigned int flags; git_strarray pathspec;
+        } git_status_options; -}
+#starttype git_status_options
+#field show , <git_status_show_t>
+#field flags , CUInt
+#field pathspec , <git_strarray>
+#stoptype
+#ccall git_status_foreach_ext , Ptr <git_repository> -> Ptr <git_status_options> -> FunPtr (CString -> CUInt -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
+#ccall git_status_file , Ptr CUInt -> Ptr <git_repository> -> CString -> IO (CInt)
+#ccall git_status_should_ignore , Ptr CInt -> Ptr <git_repository> -> CString -> IO (CInt)
diff --git a/Bindings/Libgit2/Submodule.hsc b/Bindings/Libgit2/Submodule.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Submodule.hsc
@@ -0,0 +1,50 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Submodule where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+{- typedef enum {
+            GIT_SUBMODULE_UPDATE_CHECKOUT = 0,
+            GIT_SUBMODULE_UPDATE_REBASE = 1,
+            GIT_SUBMODULE_UPDATE_MERGE = 2
+        } git_submodule_update_t; -}
+#integral_t git_submodule_update_t
+#num GIT_SUBMODULE_UPDATE_CHECKOUT
+#num GIT_SUBMODULE_UPDATE_REBASE
+#num GIT_SUBMODULE_UPDATE_MERGE
+{- typedef enum {
+            GIT_SUBMODULE_IGNORE_ALL = 0,
+            GIT_SUBMODULE_IGNORE_DIRTY = 1,
+            GIT_SUBMODULE_IGNORE_UNTRACKED = 2,
+            GIT_SUBMODULE_IGNORE_NONE = 3
+        } git_submodule_ignore_t; -}
+#integral_t git_submodule_ignore_t
+#num GIT_SUBMODULE_IGNORE_ALL
+#num GIT_SUBMODULE_IGNORE_DIRTY
+#num GIT_SUBMODULE_IGNORE_UNTRACKED
+#num GIT_SUBMODULE_IGNORE_NONE
+{- typedef struct {
+            char * name;
+            char * path;
+            char * url;
+            git_oid oid;
+            git_submodule_update_t update;
+            git_submodule_ignore_t ignore;
+            int fetch_recurse;
+            int refcount;
+        } git_submodule; -}
+#starttype git_submodule
+#field name , CString
+#field path , CString
+#field url , CString
+#field oid , <git_oid>
+#field update , <git_submodule_update_t>
+#field ignore , <git_submodule_ignore_t>
+#field fetch_recurse , CInt
+#field refcount , CInt
+#stoptype
+#ccall git_submodule_foreach , Ptr <git_repository> -> FunPtr (CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
+#ccall git_submodule_lookup , Ptr (Ptr <git_submodule>) -> Ptr <git_repository> -> CString -> IO (CInt)
diff --git a/Bindings/Libgit2/Tag.hsc b/Bindings/Libgit2/Tag.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Tag.hsc
@@ -0,0 +1,26 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Tag where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Object
+#cinline git_tag_lookup , Ptr (Ptr <git_tag>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)
+#cinline git_tag_lookup_prefix , Ptr (Ptr <git_tag>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)
+#cinline git_tag_free , Ptr <git_tag> -> IO ()
+#ccall git_tag_id , Ptr <git_tag> -> IO (Ptr <git_oid>)
+#ccall git_tag_target , Ptr (Ptr <git_object>) -> Ptr <git_tag> -> IO (CInt)
+#ccall git_tag_target_oid , Ptr <git_tag> -> IO (Ptr <git_oid>)
+#ccall git_tag_type , Ptr <git_tag> -> IO (<git_otype>)
+#ccall git_tag_name , Ptr <git_tag> -> IO (CString)
+#ccall git_tag_tagger , Ptr <git_tag> -> IO (Ptr <git_signature>)
+#ccall git_tag_message , Ptr <git_tag> -> IO (CString)
+#ccall git_tag_create , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_object> -> Ptr <git_signature> -> CString -> CInt -> IO (CInt)
+#ccall git_tag_create_frombuffer , Ptr <git_oid> -> Ptr <git_repository> -> CString -> CInt -> IO (CInt)
+#ccall git_tag_create_lightweight , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_object> -> CInt -> IO (CInt)
+#ccall git_tag_delete , Ptr <git_repository> -> CString -> IO (CInt)
+#ccall git_tag_list , Ptr <git_strarray> -> Ptr <git_repository> -> IO (CInt)
+#ccall git_tag_list_match , Ptr <git_strarray> -> CString -> Ptr <git_repository> -> IO (CInt)
+#ccall git_tag_peel , Ptr (Ptr <git_object>) -> Ptr <git_tag> -> IO (CInt)
diff --git a/Bindings/Libgit2/Tag.hsc.helper.c b/Bindings/Libgit2/Tag.hsc.helper.c
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Tag.hsc.helper.c
@@ -0,0 +1,6 @@
+#include <bindings.cmacros.h>
+#include <git2.h>
+
+BC_INLINE3(git_tag_lookup, git_tag**, git_repository*, const git_oid*, int)
+BC_INLINE4(git_tag_lookup_prefix, git_tag**, git_repository*, const git_oid*, unsigned int, int)
+BC_INLINE1VOID(git_tag_free, git_tag*)
diff --git a/Bindings/Libgit2/Threads.hsc b/Bindings/Libgit2/Threads.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Threads.hsc
@@ -0,0 +1,8 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Threads where
+#strict_import
+
+import Bindings.Libgit2.Common
+#ccall git_threads_init , IO ()
+#ccall git_threads_shutdown , IO ()
diff --git a/Bindings/Libgit2/Tree.hsc b/Bindings/Libgit2/Tree.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Tree.hsc
@@ -0,0 +1,42 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+#include <git2/tree.h>
+module Bindings.Libgit2.Tree where
+#strict_import
+
+import Bindings.Libgit2.Common
+import Bindings.Libgit2.Types
+import Bindings.Libgit2.Oid
+import Bindings.Libgit2.Object
+#cinline git_tree_lookup , Ptr (Ptr <git_tree>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)
+#cinline git_tree_lookup_prefix , Ptr (Ptr <git_tree>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)
+#cinline git_tree_free , Ptr <git_tree> -> IO ()
+#ccall git_tree_id , Ptr <git_tree> -> IO (Ptr <git_oid>)
+#ccall git_tree_entrycount , Ptr <git_tree> -> IO (CUInt)
+#ccall git_tree_entry_byname , Ptr <git_tree> -> CString -> IO (Ptr <git_tree_entry>)
+#ccall git_tree_entry_byindex , Ptr <git_tree> -> CUInt -> IO (Ptr <git_tree_entry>)
+#ccall git_tree_entry_attributes , Ptr <git_tree_entry> -> IO (CUInt)
+#ccall git_tree_entry_name , Ptr <git_tree_entry> -> IO (CString)
+#ccall git_tree_entry_id , Ptr <git_tree_entry> -> IO (Ptr <git_oid>)
+#ccall git_tree_entry_type , Ptr <git_tree_entry> -> IO (<git_otype>)
+#ccall git_tree_entry_to_object , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_tree_entry> -> IO (CInt)
+#ccall git_tree_create_fromindex , Ptr <git_oid> -> Ptr <git_index> -> IO (CInt)
+#ccall git_treebuilder_create , Ptr (Ptr <git_treebuilder>) -> Ptr <git_tree> -> IO (CInt)
+#ccall git_treebuilder_clear , Ptr <git_treebuilder> -> IO ()
+#ccall git_treebuilder_free , Ptr <git_treebuilder> -> IO ()
+#ccall git_treebuilder_get , Ptr <git_treebuilder> -> CString -> IO (Ptr <git_tree_entry>)
+#ccall git_treebuilder_insert , Ptr (Ptr <git_tree_entry>) -> Ptr <git_treebuilder> -> CString -> Ptr <git_oid> -> CUInt -> IO (CInt)
+#ccall git_treebuilder_remove , Ptr <git_treebuilder> -> CString -> IO (CInt)
+#ccall git_treebuilder_filter , Ptr <git_treebuilder> -> FunPtr (Ptr <git_tree_entry> -> Ptr () -> CInt) -> Ptr () -> IO ()
+#ccall git_treebuilder_write , Ptr <git_oid> -> Ptr <git_repository> -> Ptr <git_treebuilder> -> IO (CInt)
+#ccall git_tree_get_subtree , Ptr (Ptr <git_tree>) -> Ptr <git_tree> -> CString -> IO (CInt)
+{- typedef int (* git_treewalk_cb)(const char * root,
+                                git_tree_entry * entry,
+                                void * payload); -}
+#synonym_t git_treewalk_cb , CInt
+{- enum git_treewalk_mode {
+    GIT_TREEWALK_PRE = 0, GIT_TREEWALK_POST = 1
+}; -}
+#num GIT_TREEWALK_PRE
+#num GIT_TREEWALK_POST
+#ccall git_tree_walk , Ptr <git_tree> -> CInt -> CInt -> Ptr () -> IO (CInt)
diff --git a/Bindings/Libgit2/Tree.hsc.helper.c b/Bindings/Libgit2/Tree.hsc.helper.c
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Tree.hsc.helper.c
@@ -0,0 +1,6 @@
+#include <bindings.cmacros.h>
+#include <git2.h>
+
+BC_INLINE3(git_tree_lookup, git_tree**, git_repository*, const git_oid*, int)
+BC_INLINE4(git_tree_lookup_prefix, git_tree**, git_repository*, const git_oid*, unsigned int, int)
+BC_INLINE1VOID(git_tree_free, git_tree*)
diff --git a/Bindings/Libgit2/Types.hsc b/Bindings/Libgit2/Types.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Types.hsc
@@ -0,0 +1,115 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Types where
+#strict_import
+
+import Bindings.Libgit2.Common
+{- typedef int64_t git_off_t; -}
+#synonym_t git_off_t , CLong
+{- typedef int64_t git_time_t; -}
+#synonym_t git_time_t , CLong
+{- typedef enum {
+            GIT_OBJ_ANY = -2,
+            GIT_OBJ_BAD = -1,
+            GIT_OBJ__EXT1 = 0,
+            GIT_OBJ_COMMIT = 1,
+            GIT_OBJ_TREE = 2,
+            GIT_OBJ_BLOB = 3,
+            GIT_OBJ_TAG = 4,
+            GIT_OBJ__EXT2 = 5,
+            GIT_OBJ_OFS_DELTA = 6,
+            GIT_OBJ_REF_DELTA = 7
+        } git_otype; -}
+#integral_t git_otype
+#num GIT_OBJ_ANY
+#num GIT_OBJ_BAD
+#num GIT_OBJ__EXT1
+#num GIT_OBJ_COMMIT
+#num GIT_OBJ_TREE
+#num GIT_OBJ_BLOB
+#num GIT_OBJ_TAG
+#num GIT_OBJ__EXT2
+#num GIT_OBJ_OFS_DELTA
+#num GIT_OBJ_REF_DELTA
+{- typedef struct git_odb git_odb; -}
+#opaque_t git_odb
+-- {- typedef struct git_odb_backend git_odb_backend; -}
+-- #opaque_t git_odb_backend
+{- typedef struct git_odb_object git_odb_object; -}
+#opaque_t git_odb_object
+-- {- typedef struct git_odb_stream git_odb_stream; -}
+-- #opaque_t git_odb_stream
+{- typedef struct git_repository git_repository; -}
+#opaque_t git_repository
+{- typedef struct git_object git_object; -}
+#opaque_t git_object
+{- typedef struct git_revwalk git_revwalk; -}
+#opaque_t git_revwalk
+{- typedef struct git_tag git_tag; -}
+#opaque_t git_tag
+{- typedef struct git_blob git_blob; -}
+#opaque_t git_blob
+{- typedef struct git_commit git_commit; -}
+#opaque_t git_commit
+{- typedef struct git_tree_entry git_tree_entry; -}
+#opaque_t git_tree_entry
+{- typedef struct git_tree git_tree; -}
+#opaque_t git_tree
+{- typedef struct git_treebuilder git_treebuilder; -}
+#opaque_t git_treebuilder
+{- typedef struct git_index git_index; -}
+#opaque_t git_index
+{- typedef struct git_config git_config; -}
+#opaque_t git_config
+-- {- typedef struct git_config_file git_config_file; -}
+-- #opaque_t git_config_file
+{- typedef struct git_reflog_entry git_reflog_entry; -}
+#opaque_t git_reflog_entry
+{- typedef struct git_reflog git_reflog; -}
+#opaque_t git_reflog
+{- typedef struct git_note git_note; -}
+#opaque_t git_note
+{- typedef struct git_time {
+            git_time_t time; int offset;
+        } git_time; -}
+#starttype git_time
+#field time , CLong
+#field offset , CInt
+#stoptype
+{- typedef struct git_signature {
+            char * name; char * email; git_time when;
+        } git_signature; -}
+#starttype git_signature
+#field name , CString
+#field email , CString
+#field when , <git_time>
+#stoptype
+{- typedef struct git_reference git_reference; -}
+#opaque_t git_reference
+{- typedef enum {
+            GIT_REF_INVALID = 0,
+            GIT_REF_OID = 1,
+            GIT_REF_SYMBOLIC = 2,
+            GIT_REF_PACKED = 4,
+            GIT_REF_HAS_PEEL = 8,
+            GIT_REF_LISTALL = GIT_REF_OID | GIT_REF_SYMBOLIC | GIT_REF_PACKED
+        } git_ref_t; -}
+#integral_t git_ref_t
+#num GIT_REF_INVALID
+#num GIT_REF_OID
+#num GIT_REF_SYMBOLIC
+#num GIT_REF_PACKED
+#num GIT_REF_HAS_PEEL
+#num GIT_REF_LISTALL
+{- typedef enum {
+            GIT_BRANCH_LOCAL = 1, GIT_BRANCH_REMOTE = 2
+        } git_branch_t; -}
+#integral_t git_branch_t
+#num GIT_BRANCH_LOCAL
+#num GIT_BRANCH_REMOTE
+{- typedef struct git_refspec git_refspec; -}
+#opaque_t git_refspec
+{- typedef struct git_remote git_remote; -}
+#opaque_t git_remote
+-- {- typedef struct git_remote_head git_remote_head; -}
+-- #opaque_t git_remote_head
diff --git a/Bindings/Libgit2/Version.hsc b/Bindings/Libgit2/Version.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Version.hsc
@@ -0,0 +1,5 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Version where
+#strict_import
+
diff --git a/Bindings/Libgit2/Windows.hsc b/Bindings/Libgit2/Windows.hsc
new file mode 100644
--- /dev/null
+++ b/Bindings/Libgit2/Windows.hsc
@@ -0,0 +1,9 @@
+#include <bindings.dsl.h>
+#include <git2.h>
+module Bindings.Libgit2.Windows where
+#strict_import
+
+import Bindings.Libgit2.Common
+#ccall gitwin_set_codepage , CUInt -> IO ()
+#ccall gitwin_get_codepage , IO (CUInt)
+#ccall gitwin_set_utf8 , IO ()
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,3 +1,4 @@
+Copyright (c) 2012 John Wiegley
 Copyright (c) 2011 Sakari Jokinen, Jacob Stanley
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/hlibgit2.cabal b/hlibgit2.cabal
--- a/hlibgit2.cabal
+++ b/hlibgit2.cabal
@@ -1,5 +1,5 @@
 Name:                hlibgit2
-Version:             0.5.0
+Version:             0.6.0
 Synopsis:            Low-level bindings to libgit2.
 Description:         Bindings to libgit2 v0.16.0-471-g5b9fac3
 License-file:        LICENSE
@@ -32,13 +32,6 @@
       base >=3
     , hlibgit2
     , process
-    , system-filepath >= 0.4.7
-    , system-fileio   >= 0.3.9
-    , time            >= 1.4
-    , text            >= 0.11.2
-    , containers      >= 0.4.2
-    , bytestring      >= 0.9.2.1
-    , lens            >= 2.8
 
 Library
   default-language: Haskell98
@@ -47,13 +40,6 @@
   build-depends:
       base            >= 3 && < 5
     , bindings-DSL    >= 1.0.11
-    , system-filepath >= 0.4.7
-    , system-fileio   >= 0.3.9
-    , time            >= 1.4
-    , text            >= 0.11.2
-    , containers      >= 0.4.2
-    , bytestring      >= 0.9.2.1
-    , lens            >= 2.8
   exposed-modules:
     Bindings.Libgit2
     Bindings.Libgit2.Attr
@@ -88,28 +74,14 @@
     Bindings.Libgit2.Types
     Bindings.Libgit2.Version
     Bindings.Libgit2.Windows
-    Data.Git
-    Data.Git.Blob
-    Data.Git.Commit
-    Data.Git.Common
-    Data.Git.Errors
-    Data.Git.Object
-    Data.Git.Oid
-    Data.Git.Repository
-    Data.Git.Tag
-    Data.Git.Tree
-  other-modules:
-    Data.Git.Internal
-    Data.Git.Stringable
   c-sources:
-    src/Bindings/Libgit2/Attr.hsc.helper.c
-    src/Bindings/Libgit2/Blob.hsc.helper.c
-    src/Bindings/Libgit2/Commit.hsc.helper.c
-    src/Bindings/Libgit2/Common.hsc.helper.c
-    src/Bindings/Libgit2/Tag.hsc.helper.c
-    src/Bindings/Libgit2/Tree.hsc.helper.c
+    Bindings/Libgit2/Attr.hsc.helper.c
+    Bindings/Libgit2/Blob.hsc.helper.c
+    Bindings/Libgit2/Commit.hsc.helper.c
+    Bindings/Libgit2/Common.hsc.helper.c
+    Bindings/Libgit2/Tag.hsc.helper.c
+    Bindings/Libgit2/Tree.hsc.helper.c
 
-  hs-source-dirs: src
   include-dirs: libgit2/include
   extra-libraries: git2
   if os(windows)
diff --git a/src/Bindings/Libgit2.hs b/src/Bindings/Libgit2.hs
deleted file mode 100644
--- a/src/Bindings/Libgit2.hs
+++ /dev/null
@@ -1,42 +0,0 @@
-
-module Bindings.Libgit2 (
-    module Bindings.Libgit2.Repository,
-    module Bindings.Libgit2.Config,
-    module Bindings.Libgit2.Types,
-    module Bindings.Libgit2.Revwalk,
-    module Bindings.Libgit2.OdbBackend,
-    module Bindings.Libgit2.Tag,
-    module Bindings.Libgit2.Net,
-    module Bindings.Libgit2.Refs,
-    module Bindings.Libgit2.Refspec,
-    module Bindings.Libgit2.Reflog,
-    module Bindings.Libgit2.Commit,
-    module Bindings.Libgit2.Index,
-    module Bindings.Libgit2.Signature,
-    module Bindings.Libgit2.Blob,
-    module Bindings.Libgit2.Errors,
-    module Bindings.Libgit2.Oid,
-    module Bindings.Libgit2.Tree,
-    module Bindings.Libgit2.Odb,
-    module Bindings.Libgit2.Common,
-    module Bindings.Libgit2.Object) where
-import Bindings.Libgit2.Repository
-import Bindings.Libgit2.Config
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Revwalk
-import Bindings.Libgit2.OdbBackend
-import Bindings.Libgit2.Tag
-import Bindings.Libgit2.Net
-import Bindings.Libgit2.Refs
-import Bindings.Libgit2.Refspec
-import Bindings.Libgit2.Reflog
-import Bindings.Libgit2.Commit
-import Bindings.Libgit2.Index
-import Bindings.Libgit2.Signature
-import Bindings.Libgit2.Blob
-import Bindings.Libgit2.Errors
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Tree
-import Bindings.Libgit2.Odb
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Object
diff --git a/src/Bindings/Libgit2/Attr.hsc b/src/Bindings/Libgit2/Attr.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Attr.hsc
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-#include <git2/attr.h>
-module Bindings.Libgit2.Attr where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-
-{- extern __attribute__((visibility("default"))) const char * git_attr__true; -}
-{- extern __attribute__((visibility("default"))) const char * git_attr__false; -}
-{- extern __attribute__((visibility("default"))) const char * git_attr__unset; -}
-
-#ccall git_attr_get , Ptr (CString) -> Ptr <git_repository> -> CUInt -> CString -> CString -> IO (CInt)
-#ccall git_attr_get_many , Ptr (CString) -> Ptr <git_repository> -> CUInt -> CString -> CSize -> Ptr (CString) -> IO (CInt)
-#ccall git_attr_foreach , Ptr <git_repository> -> CUInt -> CString -> FunPtr (CString -> CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
-#ccall git_attr_cache_flush , Ptr <git_repository> -> IO ()
-#ccall git_attr_add_macro , Ptr <git_repository> -> CString -> CString -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Attr.hsc.helper.c b/src/Bindings/Libgit2/Attr.hsc.helper.c
deleted file mode 100644
--- a/src/Bindings/Libgit2/Attr.hsc.helper.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <bindings.cmacros.h>
-#include <git2/attr.h>
-
-BC_INLINE1(GIT_ATTR_TRUE, const char *, int)
-BC_INLINE1(GIT_ATTR_FALSE, const char *, int)
-BC_INLINE1(GIT_ATTR_UNSPECIFIED, const char *, int)
-BC_INLINE1(GIT_ATTR_HAS_VALUE, const char *, int)
diff --git a/src/Bindings/Libgit2/Blob.hsc b/src/Bindings/Libgit2/Blob.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Blob.hsc
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Blob where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Object
-#cinline git_blob_lookup , Ptr (Ptr <git_blob>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)
-#cinline git_blob_lookup_prefix , Ptr (Ptr <git_blob>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)
-#cinline git_blob_free , Ptr <git_blob> -> IO ()
-#ccall git_blob_rawcontent , Ptr <git_blob> -> IO (Ptr ())
-#ccall git_blob_rawsize , Ptr <git_blob> -> IO (CSize)
-#ccall git_blob_create_fromfile , Ptr <git_oid> -> Ptr <git_repository> -> CString -> IO (CInt)
-#ccall git_blob_create_fromdisk , Ptr <git_oid> -> Ptr <git_repository> -> CString -> IO (CInt)
-#ccall git_blob_create_frombuffer , Ptr <git_oid> -> Ptr <git_repository> -> Ptr () -> CSize -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Blob.hsc.helper.c b/src/Bindings/Libgit2/Blob.hsc.helper.c
deleted file mode 100644
--- a/src/Bindings/Libgit2/Blob.hsc.helper.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <bindings.cmacros.h>
-#include <git2.h>
-
-BC_INLINE3(git_blob_lookup, git_blob * *, git_repository *, const git_oid *, int)
-BC_INLINE4(git_blob_lookup_prefix, git_blob * *, git_repository *, const git_oid *, unsigned int, int)
-BC_INLINE1VOID(git_blob_free, git_blob *)
diff --git a/src/Bindings/Libgit2/Branch.hsc b/src/Bindings/Libgit2/Branch.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Branch.hsc
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Branch where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Types
-#ccall git_branch_create , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_object> -> CInt -> IO (CInt)
-#ccall git_branch_delete , Ptr <git_repository> -> CString -> <git_branch_t> -> IO (CInt)
-#ccall git_branch_list , Ptr <git_strarray> -> Ptr <git_repository> -> CUInt -> IO (CInt)
-#ccall git_branch_move , Ptr <git_repository> -> CString -> CString -> CInt -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Commit.hsc b/src/Bindings/Libgit2/Commit.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Commit.hsc
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Commit where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Object
-#cinline git_commit_lookup , Ptr (Ptr <git_commit>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)
-#cinline git_commit_lookup_prefix , Ptr (Ptr <git_commit>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)
-#cinline git_commit_free , Ptr <git_commit> -> IO ()
-#ccall git_commit_id , Ptr <git_commit> -> IO (Ptr <git_oid>)
-#ccall git_commit_message_encoding , Ptr <git_commit> -> IO (CString)
-#ccall git_commit_message , Ptr <git_commit> -> IO (CString)
-#ccall git_commit_time , Ptr <git_commit> -> IO (CLong)
-#ccall git_commit_time_offset , Ptr <git_commit> -> IO (CInt)
-#ccall git_commit_committer , Ptr <git_commit> -> IO (Ptr <git_signature>)
-#ccall git_commit_author , Ptr <git_commit> -> IO (Ptr <git_signature>)
-#ccall git_commit_tree , Ptr (Ptr <git_tree>) -> Ptr <git_commit> -> IO (CInt)
-#ccall git_commit_tree_oid , Ptr <git_commit> -> IO (Ptr <git_oid>)
-#ccall git_commit_parentcount , Ptr <git_commit> -> IO (CUInt)
-#ccall git_commit_parent , Ptr (Ptr <git_commit>) -> Ptr <git_commit> -> CUInt -> IO (CInt)
-#ccall git_commit_parent_oid , Ptr <git_commit> -> CUInt -> IO (Ptr <git_oid>)
-#ccall git_commit_create , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_signature> -> Ptr <git_signature> -> CString -> CString -> Ptr <git_tree> -> CInt -> Ptr (Ptr <git_commit>) -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Commit.hsc.helper.c b/src/Bindings/Libgit2/Commit.hsc.helper.c
deleted file mode 100644
--- a/src/Bindings/Libgit2/Commit.hsc.helper.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <bindings.cmacros.h>
-#include <git2.h>
-
-BC_INLINE3(git_commit_lookup, git_commit * *, git_repository *, const git_oid *, int)
-BC_INLINE4(git_commit_lookup_prefix, git_commit * *, git_repository *, const git_oid *, unsigned, int)
-BC_INLINE1VOID(git_commit_free, git_commit *)
diff --git a/src/Bindings/Libgit2/Common.hsc b/src/Bindings/Libgit2/Common.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Common.hsc
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Common where
-#strict_import
-
-{- typedef struct {
-            char * * strings; size_t count;
-        } git_strarray; -}
-#starttype git_strarray
-#field strings , Ptr (CString)
-#field count , CSize
-#stoptype
-#ccall git_strarray_free , Ptr <git_strarray> -> IO ()
-#ccall git_strarray_copy , Ptr <git_strarray> -> Ptr <git_strarray> -> IO (CInt)
-#ccall git_libgit2_version , Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()
-
-{- BEGIN MANUAL ENTRY -}
-#cinline GIT_PATH_LIST_SEPARATOR , CChar
-#num GIT_PATH_MAX
-{- END MANUAL ENTRY -}
diff --git a/src/Bindings/Libgit2/Common.hsc.helper.c b/src/Bindings/Libgit2/Common.hsc.helper.c
deleted file mode 100644
--- a/src/Bindings/Libgit2/Common.hsc.helper.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <bindings.cmacros.h>
-#include <git2.h>
-
-BC_INLINE_(GIT_PATH_LIST_SEPARATOR, char)
diff --git a/src/Bindings/Libgit2/Config.hsc b/src/Bindings/Libgit2/Config.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Config.hsc
+++ /dev/null
@@ -1,83 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Config where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-{- struct git_config_file {
-    struct git_config * cfg;
-    int (* open)(struct git_config_file *);
-    int (* get)(struct git_config_file *,
-                const char * key,
-                const char * * value);
-    int (* get_multivar)(struct git_config_file *,
-                         const char * key,
-                         const char * regexp,
-                         int (* fn)(const char *, void *),
-                         void * data);
-    int (* set)(struct git_config_file *,
-                const char * key,
-                const char * value);
-    int (* set_multivar)(git_config_file * cfg,
-                         const char * name,
-                         const char * regexp,
-                         const char * value);
-    int (* del)(struct git_config_file *, const char * key);
-    int (* foreach)(struct git_config_file *,
-                    int (* fn)(const char *, const char *, void *),
-                    void * data);
-    void (* free)(struct git_config_file *);
-}; -}
-#starttype git_config_file
-#field cfg , Ptr <git_config>
-#field open , FunPtr (Ptr <git_config_file> -> CInt)
-#field get , FunPtr (Ptr <git_config_file> -> CString -> Ptr (CString) -> CInt)
-#field get_multivar , FunPtr (Ptr <git_config_file> -> CString -> CString -> FunPtr (CString -> Ptr () -> CInt) -> Ptr () -> CInt)
-#field set , FunPtr (Ptr <git_config_file> -> CString -> CString -> CInt)
-#field set_multivar , FunPtr (Ptr <git_config_file> -> CString -> CString -> CString -> CInt)
-#field del , FunPtr (Ptr <git_config_file> -> CString -> CInt)
-#field foreach , FunPtr (Ptr <git_config_file> -> FunPtr (CString -> CString -> Ptr () -> CInt) -> Ptr () -> CInt)
-#field free , FunPtr (Ptr <git_config_file>)
-#stoptype
-{- typedef enum {
-            GIT_CVAR_FALSE = 0,
-            GIT_CVAR_TRUE = 1,
-            GIT_CVAR_INT32,
-            GIT_CVAR_STRING
-        } git_cvar_t; -}
-#integral_t git_cvar_t
-#num GIT_CVAR_FALSE
-#num GIT_CVAR_TRUE
-#num GIT_CVAR_INT32
-#num GIT_CVAR_STRING
-{- typedef struct {
-            git_cvar_t cvar_type; const char * str_match; int map_value;
-        } git_cvar_map; -}
-#starttype git_cvar_map
-#field cvar_type , <git_cvar_t>
-#field str_match , CString
-#field map_value , CInt
-#stoptype
-#ccall git_config_find_global , CString -> CSize -> IO (CInt)
-#ccall git_config_find_system , CString -> CSize -> IO (CInt)
-#ccall git_config_open_global , Ptr (Ptr <git_config>) -> IO (CInt)
-#ccall git_config_file__ondisk , Ptr (Ptr <git_config_file>) -> CString -> IO (CInt)
-#ccall git_config_new , Ptr (Ptr <git_config>) -> IO (CInt)
-#ccall git_config_add_file , Ptr <git_config> -> Ptr <git_config_file> -> CInt -> IO (CInt)
-#ccall git_config_add_file_ondisk , Ptr <git_config> -> CString -> CInt -> IO (CInt)
-#ccall git_config_open_ondisk , Ptr (Ptr <git_config>) -> CString -> IO (CInt)
-#ccall git_config_free , Ptr <git_config> -> IO ()
-#ccall git_config_get_int32 , Ptr CInt -> Ptr <git_config> -> CString -> IO (CInt)
-#ccall git_config_get_int64 , Ptr CLong -> Ptr <git_config> -> CString -> IO (CInt)
-#ccall git_config_get_bool , Ptr CInt -> Ptr <git_config> -> CString -> IO (CInt)
-#ccall git_config_get_string , Ptr (CString) -> Ptr <git_config> -> CString -> IO (CInt)
-#ccall git_config_get_multivar , Ptr <git_config> -> CString -> CString -> FunPtr (CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
-#ccall git_config_set_int32 , Ptr <git_config> -> CString -> CInt -> IO (CInt)
-#ccall git_config_set_int64 , Ptr <git_config> -> CString -> CLong -> IO (CInt)
-#ccall git_config_set_bool , Ptr <git_config> -> CString -> CInt -> IO (CInt)
-#ccall git_config_set_string , Ptr <git_config> -> CString -> CString -> IO (CInt)
-#ccall git_config_set_multivar , Ptr <git_config> -> CString -> CString -> CString -> IO (CInt)
-#ccall git_config_delete , Ptr <git_config> -> CString -> IO (CInt)
-#ccall git_config_foreach , Ptr <git_config> -> FunPtr (CString -> CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
-#ccall git_config_get_mapped , Ptr CInt -> Ptr <git_config> -> CString -> Ptr <git_cvar_map> -> CSize -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Diff.hsc b/src/Bindings/Libgit2/Diff.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Diff.hsc
+++ /dev/null
@@ -1,169 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Diff where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Tree
-import Bindings.Libgit2.Refs
-{- enum {
-    GIT_DIFF_NORMAL = 0,
-    GIT_DIFF_REVERSE = 1 << 0,
-    GIT_DIFF_FORCE_TEXT = 1 << 1,
-    GIT_DIFF_IGNORE_WHITESPACE = 1 << 2,
-    GIT_DIFF_IGNORE_WHITESPACE_CHANGE = 1 << 3,
-    GIT_DIFF_IGNORE_WHITESPACE_EOL = 1 << 4,
-    GIT_DIFF_IGNORE_SUBMODULES = 1 << 5,
-    GIT_DIFF_PATIENCE = 1 << 6,
-    GIT_DIFF_INCLUDE_IGNORED = 1 << 7,
-    GIT_DIFF_INCLUDE_UNTRACKED = 1 << 8,
-    GIT_DIFF_INCLUDE_UNMODIFIED = 1 << 9,
-    GIT_DIFF_RECURSE_UNTRACKED_DIRS = 1 << 10
-}; -}
-#num GIT_DIFF_NORMAL
-#num GIT_DIFF_REVERSE
-#num GIT_DIFF_FORCE_TEXT
-#num GIT_DIFF_IGNORE_WHITESPACE
-#num GIT_DIFF_IGNORE_WHITESPACE_CHANGE
-#num GIT_DIFF_IGNORE_WHITESPACE_EOL
-#num GIT_DIFF_IGNORE_SUBMODULES
-#num GIT_DIFF_PATIENCE
-#num GIT_DIFF_INCLUDE_IGNORED
-#num GIT_DIFF_INCLUDE_UNTRACKED
-#num GIT_DIFF_INCLUDE_UNMODIFIED
-#num GIT_DIFF_RECURSE_UNTRACKED_DIRS
-{- typedef struct {
-            uint32_t flags;
-            uint16_t context_lines;
-            uint16_t interhunk_lines;
-            char * old_prefix;
-            char * new_prefix;
-            git_strarray pathspec;
-        } git_diff_options; -}
-#starttype git_diff_options
-#field flags , CUInt
-#field context_lines , CUShort
-#field interhunk_lines , CUShort
-#field old_prefix , CString
-#field new_prefix , CString
-#field pathspec , <git_strarray>
-#stoptype
-{- typedef struct git_diff_list git_diff_list; -}
-#opaque_t git_diff_list
-{- enum {
-    GIT_DIFF_FILE_VALID_OID = 1 << 0,
-    GIT_DIFF_FILE_FREE_PATH = 1 << 1,
-    GIT_DIFF_FILE_BINARY = 1 << 2,
-    GIT_DIFF_FILE_NOT_BINARY = 1 << 3,
-    GIT_DIFF_FILE_FREE_DATA = 1 << 4,
-    GIT_DIFF_FILE_UNMAP_DATA = 1 << 5
-}; -}
-#num GIT_DIFF_FILE_VALID_OID
-#num GIT_DIFF_FILE_FREE_PATH
-#num GIT_DIFF_FILE_BINARY
-#num GIT_DIFF_FILE_NOT_BINARY
-#num GIT_DIFF_FILE_FREE_DATA
-#num GIT_DIFF_FILE_UNMAP_DATA
-{- typedef enum {
-            GIT_DELTA_UNMODIFIED = 0,
-            GIT_DELTA_ADDED = 1,
-            GIT_DELTA_DELETED = 2,
-            GIT_DELTA_MODIFIED = 3,
-            GIT_DELTA_RENAMED = 4,
-            GIT_DELTA_COPIED = 5,
-            GIT_DELTA_IGNORED = 6,
-            GIT_DELTA_UNTRACKED = 7
-        } git_delta_t; -}
-#integral_t git_delta_t
-#num GIT_DELTA_UNMODIFIED
-#num GIT_DELTA_ADDED
-#num GIT_DELTA_DELETED
-#num GIT_DELTA_MODIFIED
-#num GIT_DELTA_RENAMED
-#num GIT_DELTA_COPIED
-#num GIT_DELTA_IGNORED
-#num GIT_DELTA_UNTRACKED
-{- typedef struct {
-            git_oid oid;
-            char * path;
-            uint16_t mode;
-            git_off_t size;
-            unsigned int flags;
-        } git_diff_file; -}
-#starttype git_diff_file
-#field oid , <git_oid>
-#field path , CString
-#field mode , CUShort
-#field size , CLong
-#field flags , CUInt
-#stoptype
-{- typedef struct {
-            git_diff_file old_file;
-            git_diff_file new_file;
-            git_delta_t status;
-            unsigned int similarity;
-            int binary;
-        } git_diff_delta; -}
-#starttype git_diff_delta
-#field old_file , <git_diff_file>
-#field new_file , <git_diff_file>
-#field status , <git_delta_t>
-#field similarity , CUInt
-#field binary , CInt
-#stoptype
-{- typedef int (* git_diff_file_fn)(void * cb_data,
-                                 git_diff_delta * delta,
-                                 float progress); -}
-#synonym_t git_diff_file_fn , CInt
-{- typedef struct {
-            int old_start; int old_lines; int new_start; int new_lines;
-        } git_diff_range; -}
-#starttype git_diff_range
-#field old_start , CInt
-#field old_lines , CInt
-#field new_start , CInt
-#field new_lines , CInt
-#stoptype
-{- typedef int (* git_diff_hunk_fn)(void * cb_data,
-                                 git_diff_delta * delta,
-                                 git_diff_range * range,
-                                 const char * header,
-                                 size_t header_len); -}
-#synonym_t git_diff_hunk_fn , CInt
-{- enum {
-    GIT_DIFF_LINE_CONTEXT = ' ',
-    GIT_DIFF_LINE_ADDITION = '+',
-    GIT_DIFF_LINE_DELETION = '-',
-    GIT_DIFF_LINE_ADD_EOFNL = '\n',
-    GIT_DIFF_LINE_DEL_EOFNL = '\0',
-    GIT_DIFF_LINE_FILE_HDR = 'F',
-    GIT_DIFF_LINE_HUNK_HDR = 'H',
-    GIT_DIFF_LINE_BINARY = 'B'
-}; -}
-#num GIT_DIFF_LINE_CONTEXT
-#num GIT_DIFF_LINE_ADDITION
-#num GIT_DIFF_LINE_DELETION
-#num GIT_DIFF_LINE_ADD_EOFNL
-#num GIT_DIFF_LINE_DEL_EOFNL
-#num GIT_DIFF_LINE_FILE_HDR
-#num GIT_DIFF_LINE_HUNK_HDR
-#num GIT_DIFF_LINE_BINARY
-{- typedef int (* git_diff_data_fn)(void * cb_data,
-                                 git_diff_delta * delta,
-                                 git_diff_range * range,
-                                 char line_origin,
-                                 const char * content,
-                                 size_t content_len); -}
-#synonym_t git_diff_data_fn , CInt
-#ccall git_diff_list_free , Ptr <git_diff_list> -> IO ()
-#ccall git_diff_tree_to_tree , Ptr <git_repository> -> Ptr <git_diff_options> -> Ptr <git_tree> -> Ptr <git_tree> -> Ptr (Ptr <git_diff_list>) -> IO (CInt)
-#ccall git_diff_index_to_tree , Ptr <git_repository> -> Ptr <git_diff_options> -> Ptr <git_tree> -> Ptr (Ptr <git_diff_list>) -> IO (CInt)
-#ccall git_diff_workdir_to_index , Ptr <git_repository> -> Ptr <git_diff_options> -> Ptr (Ptr <git_diff_list>) -> IO (CInt)
-#ccall git_diff_workdir_to_tree , Ptr <git_repository> -> Ptr <git_diff_options> -> Ptr <git_tree> -> Ptr (Ptr <git_diff_list>) -> IO (CInt)
-#ccall git_diff_merge , Ptr <git_diff_list> -> Ptr <git_diff_list> -> IO (CInt)
-#ccall git_diff_foreach , Ptr <git_diff_list> -> Ptr () -> CInt -> CInt -> CInt -> IO (CInt)
-#ccall git_diff_print_compact , Ptr <git_diff_list> -> Ptr () -> CInt -> IO (CInt)
-#ccall git_diff_print_patch , Ptr <git_diff_list> -> Ptr () -> CInt -> IO (CInt)
-#ccall git_diff_blobs , Ptr <git_blob> -> Ptr <git_blob> -> Ptr <git_diff_options> -> Ptr () -> CInt -> CInt -> CInt -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Errors.hsc b/src/Bindings/Libgit2/Errors.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Errors.hsc
+++ /dev/null
@@ -1,66 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Errors where
-#strict_import
-
-import Bindings.Libgit2.Common
-{- enum {
-    GIT_OK = 0,
-    GIT_ERROR = -1,
-    GIT_ENOTFOUND = -3,
-    GIT_EEXISTS = -4,
-    GIT_EAMBIGUOUS = -5,
-    GIT_EBUFS = -6,
-    GIT_PASSTHROUGH = -30,
-    GIT_REVWALKOVER = -31
-}; -}
-#num GIT_OK
-#num GIT_ERROR
-#num GIT_ENOTFOUND
-#num GIT_EEXISTS
-#num GIT_EAMBIGUOUS
-#num GIT_EBUFS
-#num GIT_PASSTHROUGH
-#num GIT_REVWALKOVER
-{- typedef struct {
-            char * message; int klass;
-        } git_error; -}
-#starttype git_error
-#field message , CString
-#field klass , CInt
-#stoptype
-{- typedef enum {
-            GITERR_NOMEMORY,
-            GITERR_OS,
-            GITERR_INVALID,
-            GITERR_REFERENCE,
-            GITERR_ZLIB,
-            GITERR_REPOSITORY,
-            GITERR_CONFIG,
-            GITERR_REGEX,
-            GITERR_ODB,
-            GITERR_INDEX,
-            GITERR_OBJECT,
-            GITERR_NET,
-            GITERR_TAG,
-            GITERR_TREE,
-            GITERR_INDEXER
-        } git_error_t; -}
-#integral_t git_error_t
-#num GITERR_NOMEMORY
-#num GITERR_OS
-#num GITERR_INVALID
-#num GITERR_REFERENCE
-#num GITERR_ZLIB
-#num GITERR_REPOSITORY
-#num GITERR_CONFIG
-#num GITERR_REGEX
-#num GITERR_ODB
-#num GITERR_INDEX
-#num GITERR_OBJECT
-#num GITERR_NET
-#num GITERR_TAG
-#num GITERR_TREE
-#num GITERR_INDEXER
-#ccall giterr_last , IO (Ptr <git_error>)
-#ccall giterr_clear , IO ()
diff --git a/src/Bindings/Libgit2/Index.hsc b/src/Bindings/Libgit2/Index.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Index.hsc
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Index where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-{- typedef struct {
-            git_time_t seconds; unsigned int nanoseconds;
-        } git_index_time; -}
-#starttype git_index_time
-#field seconds , CLong
-#field nanoseconds , CUInt
-#stoptype
-{- typedef struct git_index_entry {
-            git_index_time ctime;
-            git_index_time mtime;
-            unsigned int dev;
-            unsigned int ino;
-            unsigned int mode;
-            unsigned int uid;
-            unsigned int gid;
-            git_off_t file_size;
-            git_oid oid;
-            unsigned short flags;
-            unsigned short flags_extended;
-            char * path;
-        } git_index_entry; -}
-#starttype git_index_entry
-#field ctime , <git_index_time>
-#field mtime , <git_index_time>
-#field dev , CUInt
-#field ino , CUInt
-#field mode , CUInt
-#field uid , CUInt
-#field gid , CUInt
-#field file_size , CLong
-#field oid , <git_oid>
-#field flags , CUShort
-#field flags_extended , CUShort
-#field path , CString
-#stoptype
-{- typedef struct git_index_entry_unmerged {
-            unsigned int mode[3]; git_oid oid[3]; char * path;
-        } git_index_entry_unmerged; -}
-#starttype git_index_entry_unmerged
-#array_field mode , CUInt
-#array_field oid , <git_oid>
-#field path , CString
-#stoptype
-#ccall git_index_open , Ptr (Ptr <git_index>) -> CString -> IO (CInt)
-#ccall git_index_clear , Ptr <git_index> -> IO ()
-#ccall git_index_free , Ptr <git_index> -> IO ()
-#ccall git_index_read , Ptr <git_index> -> IO (CInt)
-#ccall git_index_write , Ptr <git_index> -> IO (CInt)
-#ccall git_index_find , Ptr <git_index> -> CString -> IO (CInt)
-#ccall git_index_uniq , Ptr <git_index> -> IO ()
-#ccall git_index_add , Ptr <git_index> -> CString -> CInt -> IO (CInt)
-#ccall git_index_add2 , Ptr <git_index> -> Ptr <git_index_entry> -> IO (CInt)
-#ccall git_index_append , Ptr <git_index> -> CString -> CInt -> IO (CInt)
-#ccall git_index_append2 , Ptr <git_index> -> Ptr <git_index_entry> -> IO (CInt)
-#ccall git_index_remove , Ptr <git_index> -> CInt -> IO (CInt)
-#ccall git_index_get , Ptr <git_index> -> CUInt -> IO (Ptr <git_index_entry>)
-#ccall git_index_entrycount , Ptr <git_index> -> IO (CUInt)
-#ccall git_index_entrycount_unmerged , Ptr <git_index> -> IO (CUInt)
-#ccall git_index_get_unmerged_bypath , Ptr <git_index> -> CString -> IO (Ptr <git_index_entry_unmerged>)
-#ccall git_index_get_unmerged_byindex , Ptr <git_index> -> CUInt -> IO (Ptr <git_index_entry_unmerged>)
-#ccall git_index_entry_stage , Ptr <git_index_entry> -> IO (CInt)
-#ccall git_index_read_tree , Ptr <git_index> -> Ptr <git_tree> -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Indexer.hsc b/src/Bindings/Libgit2/Indexer.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Indexer.hsc
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Indexer where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Oid
-{- typedef struct git_indexer_stats {
-            unsigned int total; unsigned int processed;
-        } git_indexer_stats; -}
-#starttype git_indexer_stats
-#field total , CUInt
-#field processed , CUInt
-#stoptype
-{- typedef struct git_indexer git_indexer; -}
-#opaque_t git_indexer
-{- typedef struct git_indexer_stream git_indexer_stream; -}
-#opaque_t git_indexer_stream
-#ccall git_indexer_stream_new , Ptr (Ptr <git_indexer_stream>) -> CString -> IO (CInt)
-#ccall git_indexer_stream_add , Ptr <git_indexer_stream> -> Ptr () -> CSize -> Ptr <git_indexer_stats> -> IO (CInt)
-#ccall git_indexer_stream_finalize , Ptr <git_indexer_stream> -> Ptr <git_indexer_stats> -> IO (CInt)
-#ccall git_indexer_stream_hash , Ptr <git_indexer_stream> -> IO (Ptr <git_oid>)
-#ccall git_indexer_stream_free , Ptr <git_indexer_stream> -> IO ()
-#ccall git_indexer_new , Ptr (Ptr <git_indexer>) -> CString -> IO (CInt)
-#ccall git_indexer_run , Ptr <git_indexer> -> Ptr <git_indexer_stats> -> IO (CInt)
-#ccall git_indexer_write , Ptr <git_indexer> -> IO (CInt)
-#ccall git_indexer_hash , Ptr <git_indexer> -> IO (Ptr <git_oid>)
-#ccall git_indexer_free , Ptr <git_indexer> -> IO ()
diff --git a/src/Bindings/Libgit2/Merge.hsc b/src/Bindings/Libgit2/Merge.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Merge.hsc
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Merge where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-#ccall git_merge_base , Ptr <git_oid> -> Ptr <git_repository> -> Ptr <git_oid> -> Ptr <git_oid> -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Net.hsc b/src/Bindings/Libgit2/Net.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Net.hsc
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Net where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Types
-{- struct git_remote_head {
-    int local : 1; git_oid oid; git_oid loid; char * name;
-}; -}
-#starttype git_remote_head
--- #field local , CInt
-#field oid , <git_oid>
-#field loid , <git_oid>
-#field name , CString
-#stoptype
-{- typedef int (* git_headlist_cb)(git_remote_head *, void *); -}
-#synonym_t git_headlist_cb , CInt
diff --git a/src/Bindings/Libgit2/Notes.hsc b/src/Bindings/Libgit2/Notes.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Notes.hsc
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Notes where
-#strict_import
-
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Types
-#ccall git_note_read , Ptr (Ptr <git_note>) -> Ptr <git_repository> -> CString -> Ptr <git_oid> -> IO (CInt)
-#ccall git_note_message , Ptr <git_note> -> IO (CString)
-#ccall git_note_oid , Ptr <git_note> -> IO (Ptr <git_oid>)
-#ccall git_note_create , Ptr <git_oid> -> Ptr <git_repository> -> Ptr <git_signature> -> Ptr <git_signature> -> CString -> Ptr <git_oid> -> CString -> IO (CInt)
-#ccall git_note_remove , Ptr <git_repository> -> CString -> Ptr <git_signature> -> Ptr <git_signature> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_note_free , Ptr <git_note> -> IO ()
-#ccall git_note_default_ref , Ptr (CString) -> Ptr <git_repository> -> IO (CInt)
-{- typedef struct {
-            git_oid blob_oid; git_oid annotated_object_oid;
-        } git_note_data; -}
-#starttype git_note_data
-#field blob_oid , <git_oid>
-#field annotated_object_oid , <git_oid>
-#stoptype
-#ccall git_note_foreach , Ptr <git_repository> -> CString -> FunPtr (Ptr <git_note_data> -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Object.hsc b/src/Bindings/Libgit2/Object.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Object.hsc
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Object where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-#ccall git_object_lookup , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_oid> -> <git_otype> -> IO (CInt)
-#ccall git_object_lookup_prefix , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> <git_otype> -> IO (CInt)
-#ccall git_object_id , Ptr <git_object> -> IO (Ptr <git_oid>)
-#ccall git_object_type , Ptr <git_object> -> IO (<git_otype>)
-#ccall git_object_owner , Ptr <git_object> -> IO (Ptr <git_repository>)
-#ccall git_object_free , Ptr <git_object> -> IO ()
-#ccall git_object_type2string , <git_otype> -> IO (CString)
-#ccall git_object_string2type , CString -> IO (<git_otype>)
-#ccall git_object_typeisloose , <git_otype> -> IO (CInt)
-#ccall git_object__size , <git_otype> -> IO (CSize)
diff --git a/src/Bindings/Libgit2/Odb.hsc b/src/Bindings/Libgit2/Odb.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Odb.hsc
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Odb where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.OdbBackend
-#ccall git_odb_new , Ptr (Ptr <git_odb>) -> IO (CInt)
-#ccall git_odb_open , Ptr (Ptr <git_odb>) -> CString -> IO (CInt)
-#ccall git_odb_add_backend , Ptr <git_odb> -> Ptr <git_odb_backend> -> CInt -> IO (CInt)
-#ccall git_odb_add_alternate , Ptr <git_odb> -> Ptr <git_odb_backend> -> CInt -> IO (CInt)
-#ccall git_odb_free , Ptr <git_odb> -> IO ()
-#ccall git_odb_read , Ptr (Ptr <git_odb_object>) -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_odb_read_prefix , Ptr (Ptr <git_odb_object>) -> Ptr <git_odb> -> Ptr <git_oid> -> CUInt -> IO (CInt)
-#ccall git_odb_read_header , Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_odb_exists , Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_odb_write , Ptr <git_oid> -> Ptr <git_odb> -> Ptr () -> CSize -> <git_otype> -> IO (CInt)
-#ccall git_odb_open_wstream , Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb> -> CSize -> <git_otype> -> IO (CInt)
-#ccall git_odb_open_rstream , Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_odb_hash , Ptr <git_oid> -> Ptr () -> CSize -> <git_otype> -> IO (CInt)
-#ccall git_odb_hashfile , Ptr <git_oid> -> CString -> <git_otype> -> IO (CInt)
-#ccall git_odb_object_free , Ptr <git_odb_object> -> IO ()
-#ccall git_odb_object_id , Ptr <git_odb_object> -> IO (Ptr <git_oid>)
-#ccall git_odb_object_data , Ptr <git_odb_object> -> IO (Ptr ())
-#ccall git_odb_object_size , Ptr <git_odb_object> -> IO (CSize)
-#ccall git_odb_object_type , Ptr <git_odb_object> -> IO (<git_otype>)
diff --git a/src/Bindings/Libgit2/OdbBackend.hsc b/src/Bindings/Libgit2/OdbBackend.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/OdbBackend.hsc
+++ /dev/null
@@ -1,83 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.OdbBackend where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-{- struct git_odb_backend {
-    git_odb * odb;
-    int (* read)(void * *,
-                 size_t *,
-                 git_otype *,
-                 struct git_odb_backend *,
-                 const git_oid *);
-    int (* read_prefix)(git_oid *,
-                        void * *,
-                        size_t *,
-                        git_otype *,
-                        struct git_odb_backend *,
-                        const git_oid *,
-                        unsigned int);
-    int (* read_header)(size_t *,
-                        git_otype *,
-                        struct git_odb_backend *,
-                        const git_oid *);
-    int (* write)(git_oid *,
-                  struct git_odb_backend *,
-                  const void *,
-                  size_t,
-                  git_otype);
-    int (* writestream)(struct git_odb_stream * *,
-                        struct git_odb_backend *,
-                        size_t,
-                        git_otype);
-    int (* readstream)(struct git_odb_stream * *,
-                       struct git_odb_backend *,
-                       const git_oid *);
-    int (* exists)(struct git_odb_backend *, const git_oid *);
-    void (* free)(struct git_odb_backend *);
-}; -}
-#starttype git_odb_backend
-#field odb , Ptr <git_odb>
-#field read , FunPtr (Ptr (Ptr ()) -> Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb_backend> -> Ptr <git_oid> -> CInt)
-#field read_prefix , FunPtr (Ptr <git_oid> -> Ptr (Ptr ()) -> Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb_backend> -> Ptr <git_oid> -> CUInt -> CInt)
-#field read_header , FunPtr (Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb_backend> -> Ptr <git_oid> -> CInt)
-#field write , FunPtr (Ptr <git_oid> -> Ptr <git_odb_backend> -> Ptr () -> CSize -> <git_otype> -> CInt)
-#field writestream , FunPtr (Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb_backend> -> CSize -> <git_otype> -> CInt)
-#field readstream , FunPtr (Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb_backend> -> Ptr <git_oid> -> CInt)
-#field exists , FunPtr (Ptr <git_odb_backend> -> Ptr <git_oid> -> CInt)
-#field free , FunPtr (Ptr <git_odb_backend>)
-#stoptype
-{- enum {
-    GIT_STREAM_RDONLY = 1 << 1,
-    GIT_STREAM_WRONLY = 1 << 2,
-    GIT_STREAM_RW = GIT_STREAM_RDONLY | GIT_STREAM_WRONLY
-}; -}
-#num GIT_STREAM_RDONLY
-#num GIT_STREAM_WRONLY
-#num GIT_STREAM_RW
-{- struct git_odb_stream {
-    struct git_odb_backend * backend;
-    int mode;
-    int (* read)(struct git_odb_stream * stream,
-                 char * buffer,
-                 size_t len);
-    int (* write)(struct git_odb_stream * stream,
-                  const char * buffer,
-                  size_t len);
-    int (* finalize_write)(git_oid * oid_p,
-                           struct git_odb_stream * stream);
-    void (* free)(struct git_odb_stream * stream);
-}; -}
-#starttype git_odb_stream
-#field backend , Ptr <git_odb_backend>
-#field mode , CInt
-#field read , FunPtr (Ptr <git_odb_stream> -> CString -> CSize -> CInt)
-#field write , FunPtr (Ptr <git_odb_stream> -> CString -> CSize -> CInt)
-#field finalize_write , FunPtr (Ptr <git_oid> -> Ptr <git_odb_stream> -> CInt)
-#field free , FunPtr (Ptr <git_odb_stream>)
-#stoptype
-#ccall git_odb_backend_pack , Ptr (Ptr <git_odb_backend>) -> CString -> IO (CInt)
-#ccall git_odb_backend_loose , Ptr (Ptr <git_odb_backend>) -> CString -> CInt -> CInt -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Oid.hsc b/src/Bindings/Libgit2/Oid.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Oid.hsc
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Oid where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-#num GIT_OID_RAWSZ
-#num GIT_OID_HEXSZ
-#num GIT_OID_MINPREFIXLEN
-{- struct _git_oid {
-    unsigned char id[20];
-}; -}
-#starttype git_oid
-#array_field id , CUChar
-#stoptype
-#ccall git_oid_fromstr , Ptr <git_oid> -> CString -> IO (CInt)
-#ccall git_oid_fromstrn , Ptr <git_oid> -> CString -> CSize -> IO (CInt)
-#ccall git_oid_fromraw , Ptr <git_oid> -> Ptr CUChar -> IO ()
-#ccall git_oid_fmt , CString -> Ptr <git_oid> -> IO ()
-#ccall git_oid_pathfmt , CString -> Ptr <git_oid> -> IO ()
-#ccall git_oid_allocfmt , Ptr <git_oid> -> IO (CString)
-#ccall git_oid_tostr , CString -> CSize -> Ptr <git_oid> -> IO (CString)
-#ccall git_oid_cpy , Ptr <git_oid> -> Ptr <git_oid> -> IO ()
-#ccall git_oid_cmp , Ptr <git_oid> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_oid_ncmp , Ptr <git_oid> -> Ptr <git_oid> -> CUInt -> IO (CInt)
-#ccall git_oid_streq , Ptr <git_oid> -> CString -> IO (CInt)
-#ccall git_oid_iszero , Ptr <git_oid> -> IO (CInt)
-{- typedef struct git_oid_shorten git_oid_shorten; -}
-#opaque_t git_oid_shorten
-#ccall git_oid_shorten_new , CSize -> IO (Ptr <git_oid_shorten>)
-#ccall git_oid_shorten_add , Ptr <git_oid_shorten> -> CString -> IO (CInt)
-#ccall git_oid_shorten_free , Ptr <git_oid_shorten> -> IO ()
diff --git a/src/Bindings/Libgit2/Reflog.hsc b/src/Bindings/Libgit2/Reflog.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Reflog.hsc
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Reflog where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-#ccall git_reflog_read , Ptr (Ptr <git_reflog>) -> Ptr <git_reference> -> IO (CInt)
-#ccall git_reflog_write , Ptr <git_reference> -> Ptr <git_oid> -> Ptr <git_signature> -> CString -> IO (CInt)
-#ccall git_reflog_rename , Ptr <git_reference> -> CString -> IO (CInt)
-#ccall git_reflog_delete , Ptr <git_reference> -> IO (CInt)
-#ccall git_reflog_entrycount , Ptr <git_reflog> -> IO (CUInt)
-#ccall git_reflog_entry_byindex , Ptr <git_reflog> -> CUInt -> IO (Ptr <git_reflog_entry>)
-#ccall git_reflog_entry_oidold , Ptr <git_reflog_entry> -> IO (Ptr <git_oid>)
-#ccall git_reflog_entry_oidnew , Ptr <git_reflog_entry> -> IO (Ptr <git_oid>)
-#ccall git_reflog_entry_committer , Ptr <git_reflog_entry> -> IO (Ptr <git_signature>)
-#ccall git_reflog_entry_msg , Ptr <git_reflog_entry> -> IO (CString)
-#ccall git_reflog_free , Ptr <git_reflog> -> IO ()
diff --git a/src/Bindings/Libgit2/Refs.hsc b/src/Bindings/Libgit2/Refs.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Refs.hsc
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Refs where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-#ccall git_reference_lookup , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> IO (CInt)
-#ccall git_reference_name_to_oid , Ptr <git_oid> -> Ptr <git_repository> -> CString -> IO (CInt)
-#ccall git_reference_create_symbolic , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> CString -> CInt -> IO (CInt)
-#ccall git_reference_create_oid , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> Ptr <git_oid> -> CInt -> IO (CInt)
-#ccall git_reference_oid , Ptr <git_reference> -> IO (Ptr <git_oid>)
-#ccall git_reference_target , Ptr <git_reference> -> IO (CString)
-#ccall git_reference_type , Ptr <git_reference> -> IO (<git_ref_t>)
-#ccall git_reference_name , Ptr <git_reference> -> IO (CString)
-#ccall git_reference_resolve , Ptr (Ptr <git_reference>) -> Ptr <git_reference> -> IO (CInt)
-#ccall git_reference_owner , Ptr <git_reference> -> IO (Ptr <git_repository>)
-#ccall git_reference_set_target , Ptr <git_reference> -> CString -> IO (CInt)
-#ccall git_reference_set_oid , Ptr <git_reference> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_reference_rename , Ptr <git_reference> -> CString -> CInt -> IO (CInt)
-#ccall git_reference_delete , Ptr <git_reference> -> IO (CInt)
-#ccall git_reference_packall , Ptr <git_repository> -> IO (CInt)
-#ccall git_reference_list , Ptr <git_strarray> -> Ptr <git_repository> -> CUInt -> IO (CInt)
-#ccall git_reference_foreach , Ptr <git_repository> -> CUInt -> FunPtr (CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
-#ccall git_reference_is_packed , Ptr <git_reference> -> IO (CInt)
-#ccall git_reference_reload , Ptr <git_reference> -> IO (CInt)
-#ccall git_reference_free , Ptr <git_reference> -> IO ()
-#ccall git_reference_cmp , Ptr <git_reference> -> Ptr <git_reference> -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Refspec.hsc b/src/Bindings/Libgit2/Refspec.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Refspec.hsc
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Refspec where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-#ccall git_refspec_src , Ptr <git_refspec> -> IO (CString)
-#ccall git_refspec_dst , Ptr <git_refspec> -> IO (CString)
-#ccall git_refspec_src_matches , Ptr <git_refspec> -> CString -> IO (CInt)
-#ccall git_refspec_transform , CString -> CSize -> Ptr <git_refspec> -> CString -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Remote.hsc b/src/Bindings/Libgit2/Remote.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Remote.hsc
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Remote where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Repository
-import Bindings.Libgit2.Refspec
-import Bindings.Libgit2.Net
-import Bindings.Libgit2.Indexer
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Types
-#ccall git_remote_new , Ptr (Ptr <git_remote>) -> Ptr <git_repository> -> CString -> CString -> CString -> IO (CInt)
-#ccall git_remote_load , Ptr (Ptr <git_remote>) -> Ptr <git_repository> -> CString -> IO (CInt)
-#ccall git_remote_save , Ptr <git_remote> -> IO (CInt)
-#ccall git_remote_name , Ptr <git_remote> -> IO (CString)
-#ccall git_remote_url , Ptr <git_remote> -> IO (CString)
-#ccall git_remote_set_fetchspec , Ptr <git_remote> -> CString -> IO (CInt)
-#ccall git_remote_fetchspec , Ptr <git_remote> -> IO (Ptr <git_refspec>)
-#ccall git_remote_set_pushspec , Ptr <git_remote> -> CString -> IO (CInt)
-#ccall git_remote_pushspec , Ptr <git_remote> -> IO (Ptr <git_refspec>)
-#ccall git_remote_connect , Ptr <git_remote> -> CInt -> IO (CInt)
-#ccall git_remote_ls , Ptr <git_remote> -> CInt -> Ptr () -> IO (CInt)
-#ccall git_remote_download , Ptr <git_remote> -> Ptr CLong -> Ptr <git_indexer_stats> -> IO (CInt)
-#ccall git_remote_connected , Ptr <git_remote> -> IO (CInt)
-#ccall git_remote_disconnect , Ptr <git_remote> -> IO ()
-#ccall git_remote_free , Ptr <git_remote> -> IO ()
-#ccall git_remote_update_tips , Ptr <git_remote> -> FunPtr (CString -> Ptr <git_oid> -> Ptr <git_oid> -> CInt) -> IO (CInt)
-#ccall git_remote_valid_url , CString -> IO (CInt)
-#ccall git_remote_supported_url , CString -> IO (CInt)
-#ccall git_remote_list , Ptr <git_strarray> -> Ptr <git_repository> -> IO (CInt)
-#ccall git_remote_add , Ptr (Ptr <git_remote>) -> Ptr <git_repository> -> CString -> CString -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Repository.hsc b/src/Bindings/Libgit2/Repository.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Repository.hsc
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Repository where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-#ccall git_repository_open , Ptr (Ptr <git_repository>) -> CString -> IO (CInt)
-#ccall git_repository_discover , CString -> CSize -> CString -> CInt -> CString -> IO (CInt)
-{- enum {
-    GIT_REPOSITORY_OPEN_NO_SEARCH = 1 << 0,
-    GIT_REPOSITORY_OPEN_CROSS_FS = 1 << 1
-}; -}
-#num GIT_REPOSITORY_OPEN_NO_SEARCH
-#num GIT_REPOSITORY_OPEN_CROSS_FS
-#ccall git_repository_open_ext , Ptr (Ptr <git_repository>) -> CString -> CUInt -> CString -> IO (CInt)
-#ccall git_repository_free , Ptr <git_repository> -> IO ()
-#ccall git_repository_init , Ptr (Ptr <git_repository>) -> CString -> CUInt -> IO (CInt)
-#ccall git_repository_head , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> IO (CInt)
-#ccall git_repository_head_detached , Ptr <git_repository> -> IO (CInt)
-#ccall git_repository_head_orphan , Ptr <git_repository> -> IO (CInt)
-#ccall git_repository_is_empty , Ptr <git_repository> -> IO (CInt)
-#ccall git_repository_path , Ptr <git_repository> -> IO (CString)
-#ccall git_repository_workdir , Ptr <git_repository> -> IO (CString)
-#ccall git_repository_set_workdir , Ptr <git_repository> -> CString -> IO (CInt)
-#ccall git_repository_is_bare , Ptr <git_repository> -> IO (CInt)
-#ccall git_repository_config , Ptr (Ptr <git_config>) -> Ptr <git_repository> -> IO (CInt)
-#ccall git_repository_set_config , Ptr <git_repository> -> Ptr <git_config> -> IO ()
-#ccall git_repository_odb , Ptr (Ptr <git_odb>) -> Ptr <git_repository> -> IO (CInt)
-#ccall git_repository_set_odb , Ptr <git_repository> -> Ptr <git_odb> -> IO ()
-#ccall git_repository_index , Ptr (Ptr <git_index>) -> Ptr <git_repository> -> IO (CInt)
-#ccall git_repository_set_index , Ptr <git_repository> -> Ptr <git_index> -> IO ()
diff --git a/src/Bindings/Libgit2/Revwalk.hsc b/src/Bindings/Libgit2/Revwalk.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Revwalk.hsc
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Revwalk where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-#ccall git_revwalk_new , Ptr (Ptr <git_revwalk>) -> Ptr <git_repository> -> IO (CInt)
-#ccall git_revwalk_reset , Ptr <git_revwalk> -> IO ()
-#ccall git_revwalk_push , Ptr <git_revwalk> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_revwalk_push_glob , Ptr <git_revwalk> -> CString -> IO (CInt)
-#ccall git_revwalk_push_head , Ptr <git_revwalk> -> IO (CInt)
-#ccall git_revwalk_hide , Ptr <git_revwalk> -> Ptr <git_oid> -> IO (CInt)
-#ccall git_revwalk_hide_glob , Ptr <git_revwalk> -> CString -> IO (CInt)
-#ccall git_revwalk_hide_head , Ptr <git_revwalk> -> IO (CInt)
-#ccall git_revwalk_push_ref , Ptr <git_revwalk> -> CString -> IO (CInt)
-#ccall git_revwalk_hide_ref , Ptr <git_revwalk> -> CString -> IO (CInt)
-#ccall git_revwalk_next , Ptr <git_oid> -> Ptr <git_revwalk> -> IO (CInt)
-#ccall git_revwalk_sorting , Ptr <git_revwalk> -> CUInt -> IO ()
-#ccall git_revwalk_free , Ptr <git_revwalk> -> IO ()
-#ccall git_revwalk_repository , Ptr <git_revwalk> -> IO (Ptr <git_repository>)
diff --git a/src/Bindings/Libgit2/Signature.hsc b/src/Bindings/Libgit2/Signature.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Signature.hsc
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Signature where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-#ccall git_signature_new , Ptr (Ptr <git_signature>) -> CString -> CString -> CLong -> CInt -> IO (CInt)
-#ccall git_signature_now , Ptr (Ptr <git_signature>) -> CString -> CString -> IO (CInt)
-#ccall git_signature_dup , Ptr <git_signature> -> IO (Ptr <git_signature>)
-#ccall git_signature_free , Ptr <git_signature> -> IO ()
diff --git a/src/Bindings/Libgit2/Status.hsc b/src/Bindings/Libgit2/Status.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Status.hsc
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Status where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-{- enum {
-    GIT_STATUS_CURRENT = 0,
-    GIT_STATUS_INDEX_NEW = 1 << 0,
-    GIT_STATUS_INDEX_MODIFIED = 1 << 1,
-    GIT_STATUS_INDEX_DELETED = 1 << 2,
-    GIT_STATUS_WT_NEW = 1 << 3,
-    GIT_STATUS_WT_MODIFIED = 1 << 4,
-    GIT_STATUS_WT_DELETED = 1 << 5,
-    GIT_STATUS_IGNORED = 1 << 6
-}; -}
-#num GIT_STATUS_CURRENT
-#num GIT_STATUS_INDEX_NEW
-#num GIT_STATUS_INDEX_MODIFIED
-#num GIT_STATUS_INDEX_DELETED
-#num GIT_STATUS_WT_NEW
-#num GIT_STATUS_WT_MODIFIED
-#num GIT_STATUS_WT_DELETED
-#num GIT_STATUS_IGNORED
-#ccall git_status_foreach , Ptr <git_repository> -> FunPtr (CString -> CUInt -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
-{- typedef enum {
-            GIT_STATUS_SHOW_INDEX_AND_WORKDIR = 0,
-            GIT_STATUS_SHOW_INDEX_ONLY = 1,
-            GIT_STATUS_SHOW_WORKDIR_ONLY = 2,
-            GIT_STATUS_SHOW_INDEX_THEN_WORKDIR = 3
-        } git_status_show_t; -}
-#integral_t git_status_show_t
-#num GIT_STATUS_SHOW_INDEX_AND_WORKDIR
-#num GIT_STATUS_SHOW_INDEX_ONLY
-#num GIT_STATUS_SHOW_WORKDIR_ONLY
-#num GIT_STATUS_SHOW_INDEX_THEN_WORKDIR
-{- enum {
-    GIT_STATUS_OPT_INCLUDE_UNTRACKED = 1 << 0,
-    GIT_STATUS_OPT_INCLUDE_IGNORED = 1 << 1,
-    GIT_STATUS_OPT_INCLUDE_UNMODIFIED = 1 << 2,
-    GIT_STATUS_OPT_EXCLUDE_SUBMODULED = 1 << 3,
-    GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS = 1 << 4
-}; -}
-#num GIT_STATUS_OPT_INCLUDE_UNTRACKED
-#num GIT_STATUS_OPT_INCLUDE_IGNORED
-#num GIT_STATUS_OPT_INCLUDE_UNMODIFIED
-#num GIT_STATUS_OPT_EXCLUDE_SUBMODULED
-#num GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS
-{- typedef struct {
-            git_status_show_t show; unsigned int flags; git_strarray pathspec;
-        } git_status_options; -}
-#starttype git_status_options
-#field show , <git_status_show_t>
-#field flags , CUInt
-#field pathspec , <git_strarray>
-#stoptype
-#ccall git_status_foreach_ext , Ptr <git_repository> -> Ptr <git_status_options> -> FunPtr (CString -> CUInt -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
-#ccall git_status_file , Ptr CUInt -> Ptr <git_repository> -> CString -> IO (CInt)
-#ccall git_status_should_ignore , Ptr CInt -> Ptr <git_repository> -> CString -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Submodule.hsc b/src/Bindings/Libgit2/Submodule.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Submodule.hsc
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Submodule where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-{- typedef enum {
-            GIT_SUBMODULE_UPDATE_CHECKOUT = 0,
-            GIT_SUBMODULE_UPDATE_REBASE = 1,
-            GIT_SUBMODULE_UPDATE_MERGE = 2
-        } git_submodule_update_t; -}
-#integral_t git_submodule_update_t
-#num GIT_SUBMODULE_UPDATE_CHECKOUT
-#num GIT_SUBMODULE_UPDATE_REBASE
-#num GIT_SUBMODULE_UPDATE_MERGE
-{- typedef enum {
-            GIT_SUBMODULE_IGNORE_ALL = 0,
-            GIT_SUBMODULE_IGNORE_DIRTY = 1,
-            GIT_SUBMODULE_IGNORE_UNTRACKED = 2,
-            GIT_SUBMODULE_IGNORE_NONE = 3
-        } git_submodule_ignore_t; -}
-#integral_t git_submodule_ignore_t
-#num GIT_SUBMODULE_IGNORE_ALL
-#num GIT_SUBMODULE_IGNORE_DIRTY
-#num GIT_SUBMODULE_IGNORE_UNTRACKED
-#num GIT_SUBMODULE_IGNORE_NONE
-{- typedef struct {
-            char * name;
-            char * path;
-            char * url;
-            git_oid oid;
-            git_submodule_update_t update;
-            git_submodule_ignore_t ignore;
-            int fetch_recurse;
-            int refcount;
-        } git_submodule; -}
-#starttype git_submodule
-#field name , CString
-#field path , CString
-#field url , CString
-#field oid , <git_oid>
-#field update , <git_submodule_update_t>
-#field ignore , <git_submodule_ignore_t>
-#field fetch_recurse , CInt
-#field refcount , CInt
-#stoptype
-#ccall git_submodule_foreach , Ptr <git_repository> -> FunPtr (CString -> Ptr () -> CInt) -> Ptr () -> IO (CInt)
-#ccall git_submodule_lookup , Ptr (Ptr <git_submodule>) -> Ptr <git_repository> -> CString -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Tag.hsc b/src/Bindings/Libgit2/Tag.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Tag.hsc
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Tag where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Object
-#cinline git_tag_lookup , Ptr (Ptr <git_tag>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)
-#cinline git_tag_lookup_prefix , Ptr (Ptr <git_tag>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)
-#cinline git_tag_free , Ptr <git_tag> -> IO ()
-#ccall git_tag_id , Ptr <git_tag> -> IO (Ptr <git_oid>)
-#ccall git_tag_target , Ptr (Ptr <git_object>) -> Ptr <git_tag> -> IO (CInt)
-#ccall git_tag_target_oid , Ptr <git_tag> -> IO (Ptr <git_oid>)
-#ccall git_tag_type , Ptr <git_tag> -> IO (<git_otype>)
-#ccall git_tag_name , Ptr <git_tag> -> IO (CString)
-#ccall git_tag_tagger , Ptr <git_tag> -> IO (Ptr <git_signature>)
-#ccall git_tag_message , Ptr <git_tag> -> IO (CString)
-#ccall git_tag_create , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_object> -> Ptr <git_signature> -> CString -> CInt -> IO (CInt)
-#ccall git_tag_create_frombuffer , Ptr <git_oid> -> Ptr <git_repository> -> CString -> CInt -> IO (CInt)
-#ccall git_tag_create_lightweight , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_object> -> CInt -> IO (CInt)
-#ccall git_tag_delete , Ptr <git_repository> -> CString -> IO (CInt)
-#ccall git_tag_list , Ptr <git_strarray> -> Ptr <git_repository> -> IO (CInt)
-#ccall git_tag_list_match , Ptr <git_strarray> -> CString -> Ptr <git_repository> -> IO (CInt)
-#ccall git_tag_peel , Ptr (Ptr <git_object>) -> Ptr <git_tag> -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Tag.hsc.helper.c b/src/Bindings/Libgit2/Tag.hsc.helper.c
deleted file mode 100644
--- a/src/Bindings/Libgit2/Tag.hsc.helper.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <bindings.cmacros.h>
-#include <git2.h>
-
-BC_INLINE3(git_tag_lookup, git_tag**, git_repository*, const git_oid*, int)
-BC_INLINE4(git_tag_lookup_prefix, git_tag**, git_repository*, const git_oid*, unsigned int, int)
-BC_INLINE1VOID(git_tag_free, git_tag*)
diff --git a/src/Bindings/Libgit2/Threads.hsc b/src/Bindings/Libgit2/Threads.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Threads.hsc
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Threads where
-#strict_import
-
-import Bindings.Libgit2.Common
-#ccall git_threads_init , IO ()
-#ccall git_threads_shutdown , IO ()
diff --git a/src/Bindings/Libgit2/Tree.hsc b/src/Bindings/Libgit2/Tree.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Tree.hsc
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-#include <git2/tree.h>
-module Bindings.Libgit2.Tree where
-#strict_import
-
-import Bindings.Libgit2.Common
-import Bindings.Libgit2.Types
-import Bindings.Libgit2.Oid
-import Bindings.Libgit2.Object
-#cinline git_tree_lookup , Ptr (Ptr <git_tree>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)
-#cinline git_tree_lookup_prefix , Ptr (Ptr <git_tree>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)
-#cinline git_tree_free , Ptr <git_tree> -> IO ()
-#ccall git_tree_id , Ptr <git_tree> -> IO (Ptr <git_oid>)
-#ccall git_tree_entrycount , Ptr <git_tree> -> IO (CUInt)
-#ccall git_tree_entry_byname , Ptr <git_tree> -> CString -> IO (Ptr <git_tree_entry>)
-#ccall git_tree_entry_byindex , Ptr <git_tree> -> CUInt -> IO (Ptr <git_tree_entry>)
-#ccall git_tree_entry_attributes , Ptr <git_tree_entry> -> IO (CUInt)
-#ccall git_tree_entry_name , Ptr <git_tree_entry> -> IO (CString)
-#ccall git_tree_entry_id , Ptr <git_tree_entry> -> IO (Ptr <git_oid>)
-#ccall git_tree_entry_type , Ptr <git_tree_entry> -> IO (<git_otype>)
-#ccall git_tree_entry_to_object , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_tree_entry> -> IO (CInt)
-#ccall git_tree_create_fromindex , Ptr <git_oid> -> Ptr <git_index> -> IO (CInt)
-#ccall git_treebuilder_create , Ptr (Ptr <git_treebuilder>) -> Ptr <git_tree> -> IO (CInt)
-#ccall git_treebuilder_clear , Ptr <git_treebuilder> -> IO ()
-#ccall git_treebuilder_free , Ptr <git_treebuilder> -> IO ()
-#ccall git_treebuilder_get , Ptr <git_treebuilder> -> CString -> IO (Ptr <git_tree_entry>)
-#ccall git_treebuilder_insert , Ptr (Ptr <git_tree_entry>) -> Ptr <git_treebuilder> -> CString -> Ptr <git_oid> -> CUInt -> IO (CInt)
-#ccall git_treebuilder_remove , Ptr <git_treebuilder> -> CString -> IO (CInt)
-#ccall git_treebuilder_filter , Ptr <git_treebuilder> -> FunPtr (Ptr <git_tree_entry> -> Ptr () -> CInt) -> Ptr () -> IO ()
-#ccall git_treebuilder_write , Ptr <git_oid> -> Ptr <git_repository> -> Ptr <git_treebuilder> -> IO (CInt)
-#ccall git_tree_get_subtree , Ptr (Ptr <git_tree>) -> Ptr <git_tree> -> CString -> IO (CInt)
-{- typedef int (* git_treewalk_cb)(const char * root,
-                                git_tree_entry * entry,
-                                void * payload); -}
-#synonym_t git_treewalk_cb , CInt
-{- enum git_treewalk_mode {
-    GIT_TREEWALK_PRE = 0, GIT_TREEWALK_POST = 1
-}; -}
-#num GIT_TREEWALK_PRE
-#num GIT_TREEWALK_POST
-#ccall git_tree_walk , Ptr <git_tree> -> CInt -> CInt -> Ptr () -> IO (CInt)
diff --git a/src/Bindings/Libgit2/Tree.hsc.helper.c b/src/Bindings/Libgit2/Tree.hsc.helper.c
deleted file mode 100644
--- a/src/Bindings/Libgit2/Tree.hsc.helper.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <bindings.cmacros.h>
-#include <git2.h>
-
-BC_INLINE3(git_tree_lookup, git_tree**, git_repository*, const git_oid*, int)
-BC_INLINE4(git_tree_lookup_prefix, git_tree**, git_repository*, const git_oid*, unsigned int, int)
-BC_INLINE1VOID(git_tree_free, git_tree*)
diff --git a/src/Bindings/Libgit2/Types.hsc b/src/Bindings/Libgit2/Types.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Types.hsc
+++ /dev/null
@@ -1,115 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Types where
-#strict_import
-
-import Bindings.Libgit2.Common
-{- typedef int64_t git_off_t; -}
-#synonym_t git_off_t , CLong
-{- typedef int64_t git_time_t; -}
-#synonym_t git_time_t , CLong
-{- typedef enum {
-            GIT_OBJ_ANY = -2,
-            GIT_OBJ_BAD = -1,
-            GIT_OBJ__EXT1 = 0,
-            GIT_OBJ_COMMIT = 1,
-            GIT_OBJ_TREE = 2,
-            GIT_OBJ_BLOB = 3,
-            GIT_OBJ_TAG = 4,
-            GIT_OBJ__EXT2 = 5,
-            GIT_OBJ_OFS_DELTA = 6,
-            GIT_OBJ_REF_DELTA = 7
-        } git_otype; -}
-#integral_t git_otype
-#num GIT_OBJ_ANY
-#num GIT_OBJ_BAD
-#num GIT_OBJ__EXT1
-#num GIT_OBJ_COMMIT
-#num GIT_OBJ_TREE
-#num GIT_OBJ_BLOB
-#num GIT_OBJ_TAG
-#num GIT_OBJ__EXT2
-#num GIT_OBJ_OFS_DELTA
-#num GIT_OBJ_REF_DELTA
-{- typedef struct git_odb git_odb; -}
-#opaque_t git_odb
--- {- typedef struct git_odb_backend git_odb_backend; -}
--- #opaque_t git_odb_backend
-{- typedef struct git_odb_object git_odb_object; -}
-#opaque_t git_odb_object
--- {- typedef struct git_odb_stream git_odb_stream; -}
--- #opaque_t git_odb_stream
-{- typedef struct git_repository git_repository; -}
-#opaque_t git_repository
-{- typedef struct git_object git_object; -}
-#opaque_t git_object
-{- typedef struct git_revwalk git_revwalk; -}
-#opaque_t git_revwalk
-{- typedef struct git_tag git_tag; -}
-#opaque_t git_tag
-{- typedef struct git_blob git_blob; -}
-#opaque_t git_blob
-{- typedef struct git_commit git_commit; -}
-#opaque_t git_commit
-{- typedef struct git_tree_entry git_tree_entry; -}
-#opaque_t git_tree_entry
-{- typedef struct git_tree git_tree; -}
-#opaque_t git_tree
-{- typedef struct git_treebuilder git_treebuilder; -}
-#opaque_t git_treebuilder
-{- typedef struct git_index git_index; -}
-#opaque_t git_index
-{- typedef struct git_config git_config; -}
-#opaque_t git_config
--- {- typedef struct git_config_file git_config_file; -}
--- #opaque_t git_config_file
-{- typedef struct git_reflog_entry git_reflog_entry; -}
-#opaque_t git_reflog_entry
-{- typedef struct git_reflog git_reflog; -}
-#opaque_t git_reflog
-{- typedef struct git_note git_note; -}
-#opaque_t git_note
-{- typedef struct git_time {
-            git_time_t time; int offset;
-        } git_time; -}
-#starttype git_time
-#field time , CLong
-#field offset , CInt
-#stoptype
-{- typedef struct git_signature {
-            char * name; char * email; git_time when;
-        } git_signature; -}
-#starttype git_signature
-#field name , CString
-#field email , CString
-#field when , <git_time>
-#stoptype
-{- typedef struct git_reference git_reference; -}
-#opaque_t git_reference
-{- typedef enum {
-            GIT_REF_INVALID = 0,
-            GIT_REF_OID = 1,
-            GIT_REF_SYMBOLIC = 2,
-            GIT_REF_PACKED = 4,
-            GIT_REF_HAS_PEEL = 8,
-            GIT_REF_LISTALL = GIT_REF_OID | GIT_REF_SYMBOLIC | GIT_REF_PACKED
-        } git_ref_t; -}
-#integral_t git_ref_t
-#num GIT_REF_INVALID
-#num GIT_REF_OID
-#num GIT_REF_SYMBOLIC
-#num GIT_REF_PACKED
-#num GIT_REF_HAS_PEEL
-#num GIT_REF_LISTALL
-{- typedef enum {
-            GIT_BRANCH_LOCAL = 1, GIT_BRANCH_REMOTE = 2
-        } git_branch_t; -}
-#integral_t git_branch_t
-#num GIT_BRANCH_LOCAL
-#num GIT_BRANCH_REMOTE
-{- typedef struct git_refspec git_refspec; -}
-#opaque_t git_refspec
-{- typedef struct git_remote git_remote; -}
-#opaque_t git_remote
--- {- typedef struct git_remote_head git_remote_head; -}
--- #opaque_t git_remote_head
diff --git a/src/Bindings/Libgit2/Version.hsc b/src/Bindings/Libgit2/Version.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Version.hsc
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Version where
-#strict_import
-
diff --git a/src/Bindings/Libgit2/Windows.hsc b/src/Bindings/Libgit2/Windows.hsc
deleted file mode 100644
--- a/src/Bindings/Libgit2/Windows.hsc
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <bindings.dsl.h>
-#include <git2.h>
-module Bindings.Libgit2.Windows where
-#strict_import
-
-import Bindings.Libgit2.Common
-#ccall gitwin_set_codepage , CUInt -> IO ()
-#ccall gitwin_get_codepage , IO (CUInt)
-#ccall gitwin_set_utf8 , IO ()
diff --git a/src/Data/Git.hs b/src/Data/Git.hs
deleted file mode 100644
--- a/src/Data/Git.hs
+++ /dev/null
@@ -1,43 +0,0 @@
-module Data.Git (
-    module Data.Git.Repository,
-    -- module Data.Git.Config,
-    -- module Data.Git.Types,
-    -- module Data.Git.Revwalk,
-    -- module Data.Git.OdbBackend,
-    -- module Data.Git.Tag,
-    -- module Data.Git.Net,
-    -- module Data.Git.Refs,
-    -- module Data.Git.Refspec,
-    -- module Data.Git.Reflog,
-    -- module Data.Git.Commit,
-    -- module Data.Git.Index,
-    -- module Data.Git.Signature,
-    module Data.Git.Blob,
-    module Data.Git.Errors,
-    module Data.Git.Oid,
-    module Data.Git.Tree,
-    -- module Data.Git.Odb,
-    module Data.Git.Common,
-    module Data.Git.Object
-) where
-
-import Data.Git.Repository
--- import Data.Git.Config
--- import Data.Git.Types
--- import Data.Git.Revwalk
--- import Data.Git.OdbBackend
--- import Data.Git.Tag
--- import Data.Git.Net
--- import Data.Git.Refs
--- import Data.Git.Refspec
--- import Data.Git.Reflog
--- import Data.Git.Commit
--- import Data.Git.Index
--- import Data.Git.Signature
-import Data.Git.Blob
-import Data.Git.Errors
-import Data.Git.Oid
-import Data.Git.Tree
--- import Data.Git.Odb
-import Data.Git.Common
-import Data.Git.Object
diff --git a/src/Data/Git/Blob.hs b/src/Data/Git/Blob.hs
deleted file mode 100644
--- a/src/Data/Git/Blob.hs
+++ /dev/null
@@ -1,105 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
-
-module Data.Git.Blob
-       ( Blob(..), HasBlob(..)
-       , createBlob
-       , getBlobContents
-       , writeBlob )
-       where
-
-import Bindings.Libgit2
-import Data.ByteString as B hiding (map)
-import Data.ByteString.Unsafe
-import Data.Git.Common
-import Data.Git.Errors
-import Data.Git.Internal
-import Data.Text as T hiding (map)
-import Prelude hiding (FilePath)
-
-default (Text)
-
-data Blob = Blob { _blobInfo     :: Base Blob
-                 , _blobContents :: B.ByteString }
-
-makeClassy ''Blob
-
-instance Show Blob where
-  show x = case x^.blobInfo.gitId of
-    Left _  -> "Blob"
-    Right y -> "Blob#" ++ show y
-
-instance Updatable Blob where
-  update = writeBlob
-
--- | Create a new blob in the 'Repository', with 'ByteString' as its contents.
---
---   Note that since empty blobs cannot exist in Git, no means is provided for
---   creating one; if the give string is 'empty', it is an error.
-createBlob :: Repository -> B.ByteString -> Blob
-createBlob repo text
-  | text == B.empty = error "Cannot create an empty blob"
-  | otherwise = Blob { _blobInfo     = newBase repo (Left doWriteBlob) Nothing
-                     , _blobContents = text }
-
-lookupBlob :: Repository -> Oid -> IO (Maybe Blob)
-lookupBlob repo oid =
-  lookupObject' repo oid c'git_blob_lookup c'git_blob_lookup_prefix
-                (\coid obj _ ->
-                  return Blob { _blobInfo     = newBase repo (Right coid)
-                                                             (Just obj)
-                              , _blobContents = B.empty })
-
-getBlobContents :: Blob -> IO (Blob, B.ByteString)
-getBlobContents b =
-  case b^.blobInfo.gitId of
-    Left _     -> return $ (b, contents)
-    Right hash ->
-      if contents /= B.empty
-        then return (b, contents)
-        else
-        case b^.blobInfo.gitObj of
-          Just blobPtr ->
-            withForeignPtr blobPtr $ \ptr -> do
-              size <- c'git_blob_rawsize (castPtr ptr)
-              buf  <- c'git_blob_rawcontent (castPtr ptr)
-              bstr <- curry unsafePackCStringLen (castPtr buf)
-                            (fromIntegral size)
-              return (blobContents .~ bstr $ b, bstr)
-
-          Nothing -> do
-            b' <- lookupBlob repo (Oid hash)
-            case b' of
-              Just blobPtr' -> getBlobContents blobPtr'
-              Nothing       -> return (b, B.empty)
-
-  where repo     = b^.blobInfo.gitRepo
-        contents = b^.blobContents
-
--- | Write out a blob to its repository.  If it has already been written,
---   nothing will happen.
-writeBlob :: Blob -> IO Blob
-writeBlob b@(Blob { _blobInfo = Base { _gitId = Right _ } }) = return b
-writeBlob b = do hash <- doWriteBlob b
-                 return $ blobInfo.gitId .~ Right hash $
-                          blobContents   .~ B.empty    $ b
-
-doWriteBlob :: Blob -> IO COid
-doWriteBlob b = do
-  ptr <- mallocForeignPtr
-  r   <- withForeignPtr repo (createFromBuffer ptr)
-  when (r < 0) $ throwIO BlobCreateFailed
-  return (COid ptr)
-
-  where
-    repo = fromMaybe (error "Repository invalid") $
-           b^.blobInfo.gitRepo.repoObj
-
-    createFromBuffer ptr repoPtr =
-      unsafeUseAsCStringLen (b^.blobContents) $
-        uncurry (\cstr len ->
-                  withForeignPtr ptr $ \ptr' ->
-                    c'git_blob_create_frombuffer
-                      ptr' repoPtr (castPtr cstr) (fromIntegral len))
-
--- Blob.hs
diff --git a/src/Data/Git/Commit.hs b/src/Data/Git/Commit.hs
deleted file mode 100644
--- a/src/Data/Git/Commit.hs
+++ /dev/null
@@ -1,31 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
-
-module Data.Git.Commit where
-
-import Bindings.Libgit2
-import Control.Lens
-import Data.Either
-import Data.Git.Common
-import Data.Git.Internal
-import Data.Git.Tree
-import Data.Text as T hiding (map)
-import Prelude hiding (FilePath)
-
-default (Text)
-
-data Commit = Commit { _commitInfo :: Base Commit
-                     , _commitWho  :: WhoWhen
-                     , _commitLog  :: Text
-                     , _commitTree :: Tree
-                     , _commitObj  :: ObjPtr C'git_commit }
-
-makeClassy ''Commit
-
-instance Show Commit where
-  show x = case x^.commitInfo.gitId of
-    Left _  -> "Commit"
-    Right y -> "Commit#" ++ show y
-
--- Commit.hs
diff --git a/src/Data/Git/Common.hs b/src/Data/Git/Common.hs
deleted file mode 100644
--- a/src/Data/Git/Common.hs
+++ /dev/null
@@ -1,34 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
-
-module Data.Git.Common
-       ( Author, HasAuthor(..)
-       , WhoWhen, HasWhoWhen(..)
-       , Base(..), gitId, gitRepo
-       , newBase )
-       where
-
-import Control.Lens
-import Data.Either
-import Data.Git.Internal
-import Data.Text as T hiding (map)
-import Data.Time
-import Prelude hiding (FilePath)
-
-default (Text)
-
-data Author = Author { _authorName  :: Text
-                     , _authorEmail :: Text }
-            deriving (Show, Eq)
-
-makeClassy ''Author
-
-data WhoWhen = WhoWhen { _whoAuthor        :: Author
-                       , _whoAuthorDate    :: UTCTime
-                       , _whoCommitter     :: Author
-                       , _whoCommitterDate :: UTCTime }
-           deriving (Show, Eq)
-
-makeClassy ''WhoWhen
-
--- Common.hs
diff --git a/src/Data/Git/Errors.hs b/src/Data/Git/Errors.hs
deleted file mode 100644
--- a/src/Data/Git/Errors.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-
-module Data.Git.Errors
-       ( GitException(..) )
-       where
-
-import Control.Exception
-import Data.Typeable
-import Prelude hiding (FilePath)
-
-data GitException = RepositoryNotExist String
-                  | RepositoryInvalid
-                  | BlobCreateFailed
-                  | ObjectLookupFailed
-                  | ObjectIdTooLong
-                  | OidCopyFailed
-                  deriving (Show, Typeable)
-
-instance Exception GitException
-
--- Errors.hs
diff --git a/src/Data/Git/Internal.hs b/src/Data/Git/Internal.hs
deleted file mode 100644
--- a/src/Data/Git/Internal.hs
+++ /dev/null
@@ -1,149 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE FlexibleInstances #-}
-
-module Data.Git.Internal
-       ( ObjPtr
-
-       , Updatable(..)
-
-       , Base(..), gitId, gitRepo, gitObj
-       , newBase
-
-       , Repository
-       , HasRepository(..)
-
-       , openRepository
-       , createRepository
-       , openOrCreateRepository
-       , repositoryPtr
-
-       , lookupObject'
-
-       , module X )
-       where
-
-import Bindings.Libgit2 as X
-import Control.Applicative as X
-import Control.Exception as X
-import Control.Lens as X hiding((<.>))
-import Control.Monad as X hiding (mapM, mapM_, sequence, sequence_,
-                                  forM, forM_, msum)
-import Data.Either as X
-import Data.Foldable as X
-import Data.Git.Errors as X
-import Data.Git.Oid as X
-import Data.Git.Stringable as X
-import Data.Maybe as X
-import Data.Monoid as X
-import Data.Text as T hiding (map)
-import Data.Traversable as X
-import Filesystem as X
-import Filesystem.Path.CurrentOS as X hiding (empty, concat)
-import Foreign.C.String as X
-import Foreign.C.Types as X
-import Foreign.ForeignPtr as X
-import Foreign.Marshal.Alloc as X
-import Foreign.Marshal.Utils as X
-import Foreign.Ptr as X
-import Foreign.StablePtr as X
-import Foreign.Storable as X
-import Prelude hiding (FilePath, mapM, mapM_, sequence, sequence_)
-import Unsafe.Coerce as X
-
-default (Text)
-
-type ObjPtr a = Maybe (ForeignPtr a)
-
-class Updatable a where
-  update :: a -> IO a
-  update_ :: a -> IO ()
-  update_ x = void (update x)
-
-data Repository = Repository { _repoPath :: FilePath
-                             , _repoObj  :: ObjPtr C'git_repository }
-
-makeClassy ''Repository
-
-instance Show Repository where
-  show x = "Repository " <> toString (x^.repoPath)
-
-data Base a = Base { _gitId   :: Ident a
-                   , _gitRepo :: Repository
-                   , _gitObj  :: ObjPtr C'git_object }
-
-makeLenses ''Base
-
-instance Show (Base a) where
-  show x = case x^.gitId of
-    Left _  -> "Base"
-    Right y -> "Base#" ++ show y
-
-newBase :: Repository -> Ident a -> ObjPtr C'git_object -> Base a
-newBase repo oid obj = Base { _gitId   = oid
-                            , _gitRepo = repo
-                            , _gitObj  = obj }
-
-repositoryPtr :: Repository -> ForeignPtr C'git_repository
-repositoryPtr repo = fromMaybe (error "Repository invalid") (repo^.repoObj)
-
-openRepository :: FilePath -> IO Repository
-openRepository path =
-  openRepositoryWith path c'git_repository_open
-
-createRepository :: FilePath -> Bool -> IO Repository
-createRepository path bare =
-  openRepositoryWith path (\x y -> c'git_repository_init x y (fromBool bare))
-
-openOrCreateRepository :: FilePath -> Bool -> IO Repository
-openOrCreateRepository path bare = do
-  b <- isDirectory path
-  if b
-    then openRepository path
-    else createRepository path bare
-
-openRepositoryWith :: FilePath
-                   -> (Ptr (Ptr C'git_repository) -> CString -> IO CInt)
-                   -> IO Repository
-openRepositoryWith path fn = alloca $ \ptr ->
-  case toText path of
-    Left p  -> doesNotExist p
-    Right p ->
-      withCStringable p $ \str -> do
-        r <- fn ptr str
-        when (r < 0) $ doesNotExist p
-        ptr' <- peek ptr
-        fptr <- newForeignPtr p'git_repository_free ptr'
-        return Repository { _repoPath = path
-                          , _repoObj  = Just fptr }
-
-  where doesNotExist = throwIO . RepositoryNotExist . toString
-
-lookupObject'
-  :: Repository -> Oid
-  -> (Ptr (Ptr a) -> Ptr C'git_repository -> Ptr C'git_oid -> IO CInt)
-  -> (Ptr (Ptr a) -> Ptr C'git_repository -> Ptr C'git_oid -> CUInt -> IO CInt)
-  -> (COid -> ForeignPtr C'git_object -> Ptr C'git_object -> IO b)
-  -> IO (Maybe b)
-lookupObject' repo oid lookupFn lookupPrefixFn createFn = alloca $ \ptr -> do
-  r <- withForeignPtr (repositoryPtr repo) $ \repoPtr ->
-         case oid of
-           Oid (COid oid') ->
-             withForeignPtr oid' $ \oidPtr ->
-               lookupFn (castPtr ptr) repoPtr oidPtr
-           PartialOid (COid oid') len ->
-             withForeignPtr oid' $ \oidPtr ->
-               lookupPrefixFn (castPtr ptr) repoPtr oidPtr (fromIntegral len)
-  if r < 0
-    then return Nothing
-    else do
-      ptr'     <- peek ptr
-      coid     <- c'git_object_id ptr'
-      coidCopy <- mallocForeignPtr
-      withForeignPtr coidCopy $ flip c'git_oid_cpy coid
-
-      fptr <- newForeignPtr p'git_object_free ptr'
-      Just <$> createFn (COid coidCopy) fptr ptr'
-
--- Internal.hs
diff --git a/src/Data/Git/Object.hs b/src/Data/Git/Object.hs
deleted file mode 100644
--- a/src/Data/Git/Object.hs
+++ /dev/null
@@ -1,62 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
-module Data.Git.Object
-       ( Object(..)
-       , Ref(..)
-       , revParse
-       , lookupObject )
-       where
-
-import           Data.ByteString as B hiding (map)
-import           Data.Git.Blob
-import           Data.Git.Commit
-import           Data.Git.Internal
-import           Data.Git.Tag
-import           Data.Git.Tree
-import qualified Data.Map as M
-
-data Object = BlobObj   Blob
-            | TreeObj   Tree
-            | CommitObj Commit
-            | TagObj    Tag
-
-data Ref a = FullHash a
-           | PartialHash a
-           | BranchName a
-           | TagName a
-           | RefName a
-           | FullRefName a
-           | Specifier a
-
-revParse :: CStringable a => Ref a -> IO (Maybe Oid)
-revParse (FullHash r)    = stringToOid r
-revParse (PartialHash r) = stringToOid r
-revParse (BranchName r)  = undefined
-revParse (TagName r)     = undefined
-revParse (RefName r)     = undefined
-revParse (FullRefName r) = undefined
-revParse (Specifier r)   = undefined
-
-lookupObject :: Repository -> Oid -> IO (Maybe Object)
-lookupObject repo oid =
-  lookupObject' repo oid
-    (\x y z    -> c'git_object_lookup x y z c'GIT_OBJ_ANY)
-    (\x y z l  -> c'git_object_lookup_prefix x y z l c'GIT_OBJ_ANY)
-    (\coid x y -> c'git_object_type y >>= createObject repo coid x)
-
-createObject :: Repository -> COid -> ForeignPtr C'git_object -> C'git_otype
-             -> IO Object
-createObject repo coid obj typ
-  | typ == c'GIT_OBJ_BLOB =
-    return $ BlobObj Blob { _blobInfo =
-                               newBase repo (Right coid) (Just obj)
-                          , _blobContents = B.empty }
-
-  | typ == c'GIT_OBJ_TREE =
-    return $ TreeObj Tree { _treeInfo =
-                               newBase repo (Right coid) (Just obj)
-                          , _treeContents = M.empty }
-
-  | otherwise = return undefined
-
--- Object.hs
diff --git a/src/Data/Git/Oid.hs b/src/Data/Git/Oid.hs
deleted file mode 100644
--- a/src/Data/Git/Oid.hs
+++ /dev/null
@@ -1,84 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-
-module Data.Git.Oid
-       ( Oid(..)
-       , COid(..)
-       , Ident
-       , compareCOid
-       , compareCOidLen
-       , equalCOid
-       , stringToOid )
-       where
-
-import Bindings.Libgit2.Oid
-import Control.Exception
-import Control.Monad
-import Data.ByteString.Unsafe
-import Data.Git.Errors
-import Data.Git.Stringable
-import Foreign.ForeignPtr
-import System.IO.Unsafe
-
-newtype COid = COid (ForeignPtr C'git_oid)
-
-instance Show COid where
-  show (COid x) =
-    toString $ unsafePerformIO $
-      withForeignPtr x (unsafePackMallocCString <=< c'git_oid_allocfmt)
-
-type Ident a = Either (a -> IO COid) COid
-
-data Oid = Oid COid
-         | PartialOid COid Int
-         deriving Show
-
-compareCOid :: COid -> COid -> Ordering
-(COid x) `compareCOid` (COid y) =
-  let c = unsafePerformIO $
-            withForeignPtr x $ \x' ->
-              withForeignPtr y $ \y' ->
-                c'git_oid_cmp x' y'
-  in c `compare` 0
-
-compareCOidLen :: COid -> COid -> Int -> Ordering
-compareCOidLen (COid x) (COid y) l =
-  let c = unsafePerformIO $
-            withForeignPtr x $ \x' ->
-              withForeignPtr y $ \y' ->
-                c'git_oid_ncmp x' y' (fromIntegral l)
-  in c `compare` 0
-
-instance Ord COid where
-  compare = compareCOid
-
-equalCOid :: Ord a => a -> a -> Bool
-x `equalCOid` y = (x `compare` y) == EQ
-
-instance Eq COid where
-  (==) = equalCOid
-
-instance Eq Oid where
-  (Oid x) == (Oid y) = x `equalCOid` y
-  (PartialOid x xl) == (PartialOid y yl) =
-    xl == yl && compareCOidLen x y xl == EQ
-  _ == _ = False
-
-stringToOid :: CStringable a => a -> IO (Maybe Oid)
-stringToOid str
-  | len > 40 = throwIO ObjectIdTooLong
-  | otherwise = do
-      oid <- mallocForeignPtr
-      withCStringable str $ \cstr ->
-        withForeignPtr oid $ \ptr -> do
-          r <- if len == 40
-               then c'git_oid_fromstr ptr cstr
-               else c'git_oid_fromstrn ptr cstr (fromIntegral len)
-          if r < 0
-            then return Nothing
-            else return . Just $ if len == 40
-                                 then Oid (COid oid)
-                                 else PartialOid (COid oid) len
-
-  where len = lengthStr str
-
--- Oid.hs
diff --git a/src/Data/Git/Repository.hs b/src/Data/Git/Repository.hs
deleted file mode 100644
--- a/src/Data/Git/Repository.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
-
-module Data.Git.Repository
-       ( Oid
-       , Ident
-       , ObjPtr
-
-       , Updatable(..)
-
-       , Repository
-       , HasRepository(..)
-
-       , openRepository
-       , createRepository
-       , openOrCreateRepository )
-       where
-
-import Data.Git.Internal
-
--- Repository.hs
diff --git a/src/Data/Git/Stringable.hs b/src/Data/Git/Stringable.hs
deleted file mode 100644
--- a/src/Data/Git/Stringable.hs
+++ /dev/null
@@ -1,87 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-
-module Data.Git.Stringable
-       ( Stringable(..)
-       , CStringable(..) )
-       where
-
-import qualified Data.ByteString as B
-import qualified Data.ByteString.Lazy as BL
-import qualified Data.ByteString.Unsafe as BU
-import           Data.Either
-import qualified Data.Text as T hiding (map)
-import qualified Data.Text.Encoding as E
-import qualified Data.Text.Lazy as TL
-import qualified Data.Text.Lazy.Encoding as EL
-import           Filesystem.Path.CurrentOS hiding (empty, concat)
-import           Foreign.C.String
-import           Prelude hiding (FilePath)
-
-class Stringable a where
-  toString   :: a -> String
-  fromString :: String -> a
-  lengthStr  :: a -> Int
-
-instance Stringable String where
-  toString   = id
-  fromString = id
-  lengthStr  = length
-
-instance Stringable T.Text where
-  toString   = T.unpack
-  fromString = T.pack
-  lengthStr  = T.length
-
-instance Stringable TL.Text where
-  toString   = TL.unpack
-  fromString = TL.pack
-  lengthStr  = undefined
-
-instance Stringable B.ByteString where
-  toString   = T.unpack . E.decodeUtf8
-  fromString = E.encodeUtf8 . T.pack
-  lengthStr  = B.length
-
-instance Stringable BL.ByteString where
-  toString   = TL.unpack . EL.decodeUtf8
-  fromString = EL.encodeUtf8 . TL.pack
-  lengthStr  = undefined
-
-instance Stringable FilePath where
-  toString   = toString . either id id . toText
-  fromString = fromText . T.pack
-  lengthStr  = undefined
-
-class Stringable a => CStringable a where
-  withCStringable :: a -> (CString -> IO b) -> IO b
-  withCStringable = withCString . toString
-
-  withCStringLenable :: a -> (CString -> Int -> IO b) -> IO b
-  withCStringLenable str f = withCStringLen (toString str) (uncurry f)
-
-instance CStringable String where
-  withCStringable = withCString
-
-withByteString :: B.ByteString -> (CString -> IO a) -> IO a
-withByteString = BU.unsafeUseAsCString
-
-withByteStringLen :: B.ByteString -> (CString -> Int -> IO a) -> IO a
-withByteStringLen str f = BU.unsafeUseAsCStringLen str (uncurry f)
-
-instance CStringable T.Text where
-  withCStringable    = withCStringable . E.encodeUtf8
-  withCStringLenable = withCStringLenable . E.encodeUtf8
-
-instance CStringable TL.Text where
-  withCStringable    = withCStringable . EL.encodeUtf8
-  withCStringLenable = withCStringLenable . EL.encodeUtf8
-
-instance CStringable B.ByteString where
-  withCStringable    = withByteString
-  withCStringLenable = withByteStringLen
-
-instance CStringable BL.ByteString where
-  withCStringable    = withByteString . B.concat . BL.toChunks
-  withCStringLenable = withByteStringLen . B.concat . BL.toChunks
-
--- Stringable.hs
diff --git a/src/Data/Git/Tag.hs b/src/Data/Git/Tag.hs
deleted file mode 100644
--- a/src/Data/Git/Tag.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
-
-module Data.Git.Tag where
-
-import Control.Lens
-import Data.Either
-import Data.Git.Common
-import Data.Git.Internal
-import Data.Text as T hiding (map)
-import Prelude hiding (FilePath)
-
-default (Text)
-
-data Tag = Tag { _tagInfo :: Base Tag
-               , _tagRef  :: Oid }
-
-makeClassy ''Tag
-
-instance Show Tag where
-  show x = case x^.tagInfo.gitId of
-    Left _  -> "Tag"
-    Right y -> "Tag#" ++ show y
-
--- Tag.hs
diff --git a/src/Data/Git/Tree.hs b/src/Data/Git/Tree.hs
deleted file mode 100644
--- a/src/Data/Git/Tree.hs
+++ /dev/null
@@ -1,84 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
-
-module Data.Git.Tree where
-
-import Bindings.Libgit2
-import Control.Lens
-import Data.Either
-import Data.Git.Common
-import Data.Git.Internal
-import Data.Git.Blob
-import Data.Git.Errors
-import Data.Map as M hiding (map)
-import Data.Text as T hiding (map)
-import Prelude hiding (FilePath)
-
-default (Text)
-
-type TreeOrBlob = Either Blob Tree
-type TreeMap    = Map Text TreeOrBlob
-
-data Tree = Tree { _treeInfo     :: Base Tree
-                 , _treeContents :: TreeMap }
-
-makeClassy ''Tree
-
-instance Show Tree where
-  show x = case x^.treeInfo.gitId of
-    Left _  -> "Tree"
-    Right y -> "Tree#" ++ show y
-
-newTreeBase :: Tree -> Base Tree
-newTreeBase t = newBase (t^.treeInfo.gitRepo) (Left doWriteTree) Nothing
-
--- | Create a new tree, starting it with the contents at the given path.
---
---   Note that since empty trees cannot exist in Git, no means is provided for
---   creating one.
-createTree :: Repository -> FilePath -> TreeOrBlob -> Tree
-createTree repo path item = updateTree path item (emptyTree repo)
-
-doWriteTree :: Tree -> IO COid
-doWriteTree = undefined
-{-
-  alloca $ \ptr ->
-  tb <- c'git_treebuilder_create ptr str
-        when (r < 0) $ throwIO (RepositoryNotExist p)
-        ptr' <- peek ptr
-        let finalizer = newForeignPtr p'git_repository_free ptr'
-        return $ Repository { _repoPath = path
-                            , _repoObj  = finalizer }
--}
-
-emptyTree :: Repository -> Tree
-emptyTree repo =
-  Tree { _treeInfo     = newBase repo (Left doWriteTree) Nothing
-       , _treeContents = M.empty }
-
-doUpdateTree :: [Text] -> TreeOrBlob -> Tree -> Tree
-doUpdateTree (x:xs) item t =
-  treeInfo     .~ newTreeBase t $
-  treeContents .~ update' xs    $ t
-
-  where repo       = t^.treeInfo.gitRepo
-        treeMap    = t^.treeContents
-        update' [] = insert x item treeMap
-        update' _  = insert x subTree treeMap
-        subTree    = Right $ doUpdateTree xs item tree'
-        tree'      = case M.lookup x treeMap of
-                       Just (Right m) -> m
-                       _ -> emptyTree repo
-doUpdateTree [] _ _ = undefined
-
-updateTree :: FilePath -> TreeOrBlob -> Tree -> Tree
-updateTree = doUpdateTree . splitPath
-
-splitPath :: FilePath -> [Text]
-splitPath path = splitOn "/" text
-  where text = case toText path of
-                 Left x  -> error $ "Invalid path: " ++ T.unpack x
-                 Right y -> y
-
--- Tree.hs
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -1,62 +1,24 @@
-{-# LANGUAGE OverloadedStrings #-}
-
 module Main where
 
-import           Bindings.Libgit2
-import           Control.Monad
-import           Data.Foldable
-import           Data.Git
-import           Data.Text as T hiding (map)
-import           Data.Text.IO
-import qualified Data.Text.Encoding as E
-import           Filesystem.Path.CurrentOS
-import           Foreign.C.String
-import           Foreign.Marshal.Alloc
-import           Foreign.Storable
-import           Prelude hiding (FilePath, putStr, putStrLn)
-import           System.Exit
-import           System.Process(system)
+import Bindings.Libgit2
+import Control.Monad
+import Foreign.C.String
+import Foreign.Marshal.Alloc
+import Foreign.Storable
+import Prelude
+import System.Exit
+import System.Process (system)
 
-default (Text)
-
 main :: IO ()
 main = do
   putStrLn "Creating Git repository..."
-
   _ <- system "git init smoke.git"
 
   putStrLn "Accessing directly..."
-
   alloca $ \ptr -> do
     withCString "smoke.git/.git" $ \str -> do
       r <- c'git_repository_open ptr str
       when (r < 0) $ exitWith (ExitFailure 1)
       peek ptr >>= c'git_repository_free
-
-  putStrLn "Accessing via higher-level types..."
-
-  repo <- openRepository (fromText "smoke.git/.git")
-  update_ $ createBlob repo (E.encodeUtf8 "Hello, world!\n")
-
-  putStrLn "Looking up Blob by its full SHA..."
-  catBlob repo "af5626b4a114abcb82d63db7c8082c3c4756e51b"
-
-  putStrLn "Looking up Blob by its short SHA..."
-  catBlob repo "af5626b"
-
-catBlob :: Repository -> Text -> IO ()
-catBlob repo sha = do
-  hash <- stringToOid sha
-  print hash
-  for_ hash $ \hash' -> do
-    obj <- lookupObject repo hash'
-    case obj of
-      Just (BlobObj b) -> do
-        putStrLn "Found a blob, contents: "
-        (_, contents) <- getBlobContents b
-        putStr (E.decodeUtf8 contents)
-
-      Just _  -> error "Found something else..."
-      Nothing -> error "Didn't find anything :("
 
 -- Main.hs ends here
