diff --git a/TODO.txt b/TODO.txt
index cc74b66..d4b8ab2 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -7,6 +7,8 @@ References
 ==========
 - Wrap missing functions: git_reference_foreach, git_reference_is_packed,
   git_reference_reload
+- Write more twisted tests. Like accessing a reference deleted by someone
+  else.
 
 Other
 =========
diff --git a/pygit2.c b/pygit2.c
index ae1fcb1..e3c3327 100644
--- a/pygit2.c
+++ b/pygit2.c
@@ -2416,12 +2416,22 @@ Reference_resolve(Reference *self, PyObject *args)
 
     CHECK_REFERENCE(self);
 
-    /* Resolve */
+    /* Direct: reload */
+    if (git_reference_type(self->reference) == GIT_REF_OID) {
+        err = git_reference_reload(self->reference);
+        if (err < 0) {
+            self->reference = NULL;
+            return Error_set(err);
+        }
+        Py_INCREF(self);
+        return (PyObject *)self;
+    }
+
+    /* Symbolic: resolve */
     err = git_reference_resolve(&c_reference, self->reference);
     if (err < 0)
         return Error_set(err);
 
-    /* Make an instance of Reference and return it */
     return wrap_reference(c_reference);
 }
 
diff --git a/test/test_refs.py b/test/test_refs.py
index de4c054..46a6ac9 100644
--- a/test/test_refs.py
+++ b/test/test_refs.py
@@ -143,6 +143,12 @@ class ReferencesTest(utils.RepoTestCase):
         self.assertEqual(reference.hex, LAST_COMMIT)
 
 
+    def test_reference_resolve_identity(self):
+        head = self.repo.lookup_reference('HEAD')
+        ref = head.resolve()
+        self.assertTrue(ref.resolve() is ref)
+
+
     def test_create_reference(self):
         # We add a tag as a new reference that points to "origin/master"
         reference = self.repo.create_reference('refs/tags/version1',