Issue #20637: Key-sharing now also works for instance dictionaries of subclasses.  Patch by Peter Ingebretson.
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index ec10752..18e6b0a 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -1,6 +1,6 @@
 # Python test set -- part 6, built-in types
 
-from test.support import run_unittest, run_with_locale
+from test.support import run_unittest, run_with_locale, cpython_only
 import collections
 import pickle
 import locale
@@ -1170,9 +1170,31 @@
             self.assertEqual(ns, ns_roundtrip, pname)
 
 
+class SharedKeyTests(unittest.TestCase):
+
+    @cpython_only
+    def test_subclasses(self):
+        # Verify that subclasses can share keys (per PEP 412)
+        class A:
+            pass
+        class B(A):
+            pass
+
+        a, b = A(), B()
+        self.assertEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(b)))
+        self.assertLess(sys.getsizeof(vars(a)), sys.getsizeof({}))
+        a.x, a.y, a.z, a.w = range(4)
+        self.assertNotEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(b)))
+        a2 = A()
+        self.assertEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(a2)))
+        self.assertLess(sys.getsizeof(vars(a)), sys.getsizeof({}))
+        b.u, b.v, b.w, b.t = range(4)
+        self.assertLess(sys.getsizeof(vars(b)), sys.getsizeof({}))
+
+
 def test_main():
     run_unittest(TypesTests, MappingProxyTests, ClassCreationTests,
-                 SimpleNamespaceTests)
+                 SimpleNamespaceTests, SharedKeyTests)
 
 if __name__ == '__main__':
     test_main()
diff --git a/Misc/ACKS b/Misc/ACKS
index 12b5ab5..14a8cb8 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -585,6 +585,7 @@
 Lars Immisch
 Bobby Impollonia
 Meador Inge
+Peter Ingebretson
 Tony Ingraldi
 John Interrante
 Bob Ippolito
diff --git a/Misc/NEWS b/Misc/NEWS
index 306a8d6..cfb05c2 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -5,6 +5,12 @@
 What's New in Python 3.4.1?
 ===========================
 
+Core and Builtins
+-----------------
+
+- Issue #20637: Key-sharing now also works for instance dictionaries of
+  subclasses.  Patch by Peter Ingebretson.
+
 Library
 -------
 
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index f58960d..5a41387 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -2472,6 +2472,9 @@
             type->tp_dictoffset = slotoffset;
         slotoffset += sizeof(PyObject *);
     }
+    else if (!type->tp_dictoffset) {
+        type->tp_dictoffset = base->tp_dictoffset;
+    }
     if (type->tp_dictoffset) {
         et->ht_cached_keys = _PyDict_NewKeysForClass();
     }