diff --git a/hggit/overlay.py b/hggit/overlay.py
index d0ce6eaebe7b5279d16c1aab7f9bd4aefb471681_aGdnaXQvb3ZlcmxheS5weQ==..fa23c454c528766ae1ff3cdda50b999c58f28305_aGdnaXQvb3ZlcmxheS5weQ== 100644
--- a/hggit/overlay.py
+++ b/hggit/overlay.py
@@ -9,6 +9,7 @@
     changelog,
     manifest,
     context,
+    util,
 )
 from mercurial.node import bin, hex, nullid
 
@@ -308,10 +309,10 @@
     def __len__(self):
         return len(self.repo.handler.repo) + len(self.repo.revmap)
 
-class overlaymanifestlog(overlayrevlog):
+class overlayoldmanifestlog(overlayrevlog):
     def read(self, sha):
         if sha == nullid:
             return manifest.manifestdict()
         return overlaymanifest(self.repo, sha)
 
     def __getitem__(self, sha):
@@ -312,10 +313,41 @@
     def read(self, sha):
         if sha == nullid:
             return manifest.manifestdict()
         return overlaymanifest(self.repo, sha)
 
     def __getitem__(self, sha):
-        return self.read(sha)
+        return overlaymanifestctx(self.repo, sha)
+
+class overlaymanifestrevlog(overlayrevlog):
+    pass
+
+class overlaymanifestctx(object):
+    def __init__(self, repo, node):
+        self._repo = repo
+        self._node = node
+
+    def read(self):
+        return overlaymanifest(self._repo, self._node)
+
+try:
+    class overlaymanifestlog(manifest.manifestlog):
+        def __init__(self, repo):
+            self._repo = repo
+
+        # Needed for 4.0, since __getitem__ did not redirect to get() in that
+        # release.
+        def __getitem__(self, node):
+            return self.get('', node)
+
+        def get(self, dir, node):
+            if dir:
+                raise RuntimeError("hggit doesn't support treemanifests")
+            if node == nullid:
+                return manifest.manifestctx()
+            return overlaymanifestctx(self._repo, node)
+except AttributeError:
+    # manifestlog did not exist prior to 4.0
+    pass
 
 class overlaychangelog(overlayrevlog):
     def read(self, sha):
@@ -336,9 +368,13 @@
         self.handler = handler
 
         self.changelog = overlaychangelog(self, handler.repo.changelog)
-        self.manifest = overlaymanifestlog(self, handler.repo.manifest)
-        # new as of mercurial 3.9+
-        self.manifestlog = self.manifest
+        if util.safehasattr(handler.repo, 'manifest'):
+            self.manifest = overlayoldmanifestlog(self, handler.repo.manifest)
+            # new as of mercurial 3.9+
+            self.manifestlog = self.manifest
+        else:
+            # no more manifest class as of 4.1
+            self.manifestlog = overlaymanifestlog(self)
 
         # for incoming -p
         self.root = handler.repo.root
@@ -360,6 +396,10 @@
         except (AttributeError, ImportError):
             pass
 
+    def _constructmanifest(self):
+        return overlaymanifestrevlog(self,
+                self.handler.repo._constructmanifest())
+
     def __getitem__(self, n):
         if n not in self.revmap:
             return self.handler.repo[n]