diff --git a/CHANGES.rst b/CHANGES.rst
index 039cc6ec..f3f7d1cd 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -9,6 +9,8 @@
 
 - Drop support for Python 3.3.
 
+- Ensure that the ``HistoricalStorageAdapter`` forwards the ``release`` method to
+  its base instance. See `issue 78 <https://github.com/zopefoundation/ZODB/issues/788>`_.
 
 5.2.4 (2017-05-17)
 ==================
diff --git a/src/ZODB/mvccadapter.py b/src/ZODB/mvccadapter.py
index cacb6584..121e579b 100644
--- a/src/ZODB/mvccadapter.py
+++ b/src/ZODB/mvccadapter.py
@@ -27,10 +27,9 @@ class Base(object):
 
     def __getattr__(self, name):
         if name in self._copy_methods:
-            if hasattr(self._storage, name):
-                m = getattr(self._storage, name)
-                setattr(self, name, m)
-                return m
+            m = getattr(self._storage, name)
+            setattr(self, name, m)
+            return m
 
         raise AttributeError(name)
 
@@ -204,7 +203,12 @@ class HistoricalStorageAdapter(Base):
         return False
 
     def release(self):
-        pass
+        try:
+            release = self._storage.release
+        except AttributeError:
+            pass
+        else:
+            release()
 
     close = release
 

diff --git a/src/ZODB/tests/test_mvccadapter.py b/src/ZODB/tests/test_mvccadapter.py
new file mode 100644
index 00000000..9b1f28cf
--- /dev/null
+++ b/src/ZODB/tests/test_mvccadapter.py
@@ -0,0 +1,60 @@
+##############################################################################
+#
+# Copyright (c) 2017 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+import unittest
+
+from ZODB import mvccadapter
+
+
+class TestBase(unittest.TestCase):
+
+    def test_getattr_does_not_hide_exceptions(self):
+        class TheException(Exception):
+            pass
+
+        class RaisesOnAccess(object):
+
+            @property
+            def thing(self):
+                raise TheException()
+
+        base = mvccadapter.Base(RaisesOnAccess())
+        base._copy_methods = ('thing',)
+
+        with self.assertRaises(TheException):
+            getattr(base, 'thing')
+
+    def test_getattr_raises_if_missing(self):
+        base = mvccadapter.Base(self)
+        base._copy_methods = ('thing',)
+
+        with self.assertRaises(AttributeError):
+            getattr(base, 'thing')
+
+
+class TestHistoricalStorageAdapter(unittest.TestCase):
+
+    def test_forwards_release(self):
+        class Base(object):
+            released = False
+
+            def release(self):
+                self.released = True
+
+        base = Base()
+        adapter = mvccadapter.HistoricalStorageAdapter(base, None)
+
+        adapter.release()
+
+        self.assertTrue(base.released)

HistoricalStorageAdapter does not forward release to its base
This causes a connection leak on RelStorage.

src/ZODB/tests/test_mvccadapter.py::TestHistoricalStorageAdapter::test_forwards_release
src/ZODB/tests/test_mvccadapter.py::TestBase::test_getattr_does_not_hide_exceptions src/ZODB/tests/test_mvccadapter.py::TestBase::test_getattr_raises_if_missing