diff --git a/include/pygit2/repository.h b/include/pygit2/repository.h
index 35cf7c0..1a18353 100644
--- a/include/pygit2/repository.h
+++ b/include/pygit2/repository.h
@@ -13,6 +13,7 @@ int  Repository_contains(Repository *self, PyObject *value);
 
 git_odb_object* Repository_read_raw(git_repository *repo, const git_oid *oid, size_t len);
 
+PyObject* Repository_head(Repository *self);
 PyObject* Repository_getitem(Repository *self, PyObject *value);
 PyObject* Repository_read(Repository *self, PyObject *py_hex);
 PyObject* Repository_write(Repository *self, PyObject *args);
diff --git a/src/pygit2/repository.c b/src/pygit2/repository.c
index 00de0d9..7c288e0 100644
--- a/src/pygit2/repository.c
+++ b/src/pygit2/repository.c
@@ -7,6 +7,8 @@
 #include <pygit2/oid.h>
 #include <pygit2/repository.h>
 
+extern PyObject *GitError;
+
 extern PyTypeObject IndexType;
 extern PyTypeObject WalkerType;
 extern PyTypeObject SignatureType;
@@ -155,6 +157,29 @@ Repository_contains(Repository *self, PyObject *value)
     return exists;
 }
 
+PyObject *
+Repository_head(Repository *self)
+{
+    git_reference *head;
+    const git_oid *oid;
+    int err, len;
+    
+    err = git_repository_head(&head, self->repo);
+    if(err < 0) {
+      if(err == GIT_ENOTFOUND)
+        PyErr_SetString(GitError, "head reference does not exist");
+      else
+        Error_set(err);
+
+      return NULL;
+    }
+
+    oid = git_reference_oid(head);
+
+    return lookup_object(self, oid, GIT_OBJ_COMMIT);
+}
+
+
 PyObject *
 Repository_getitem(Repository *self, PyObject *value)
 {
@@ -740,6 +765,8 @@ PyGetSetDef Repository_getseters[] = {
     {"index", (getter)Repository_get_index, NULL, "index file. ", NULL},
     {"path", (getter)Repository_get_path, NULL,
      "The normalized path to the git repository.", NULL},
+    {"head", (getter)Repository_head, NULL,
+      "Current head reference of the repository.", NULL},
     {"workdir", (getter)Repository_get_workdir, NULL,
      "The normalized path to the working directory of the repository. "
      "If the repository is bare, None will be returned.", NULL},
diff --git a/test/test_refs.py b/test/test_refs.py
index c28609b..d3a7378 100644
--- a/test/test_refs.py
+++ b/test/test_refs.py
@@ -61,6 +61,9 @@ class ReferencesTest(utils.RepoTestCase):
         self.assertEqual(repo.listall_references(GIT_REF_SYMBOLIC),
                          ('refs/tags/version1', ))
 
+    def test_head(self):
+        head = self.repo.head
+        self.assertEqual(LAST_COMMIT, self.repo[head.oid].hex)
 
     def test_lookup_reference(self):
         repo = self.repo