diff --git a/CHANGES.rst b/CHANGES.rst
index 8dcf866..874cf62 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -6,7 +6,8 @@ For changes before version 3.0, see ``HISTORY.rst``.
 4.1 (unreleased)
 ----------------
 
-- Nothing changed yet.
+- PY3: allow iteration over the result of ``dict.{keys,values,items}``
+  (`#89 <https://github.com/zopefoundation/AccessControl/issues/89>`_).
 
 
 4.0 (2019-05-08)
diff --git a/src/AccessControl/ZopeGuards.py b/src/AccessControl/ZopeGuards.py
index 5cf0e4c..34643af 100644
--- a/src/AccessControl/ZopeGuards.py
+++ b/src/AccessControl/ZopeGuards.py
@@ -34,6 +34,7 @@ from AccessControl.SecurityInfo import secureModule
 from AccessControl.SecurityManagement import getSecurityManager
 from AccessControl.SimpleObjectPolicies import ContainerAssertions
 from AccessControl.SimpleObjectPolicies import Containers
+from AccessControl.SimpleObjectPolicies import allow_type
 
 
 _marker = []  # Create a new marker object.
@@ -196,6 +197,13 @@ def _check_dict_access(name, value):
 ContainerAssertions[type({})] = _check_dict_access
 
 
+if six.PY3:
+    # Allow iteration over the result of `dict.{keys, values, items}`
+    d = {}
+    for attr in ("keys", "values", "items"):
+        allow_type(type(getattr(d, attr)()))
+
+
 _list_white_list = {
     'append': 1,
     'count': 1,

diff --git a/src/AccessControl/tests/testZopeGuards.py b/src/AccessControl/tests/testZopeGuards.py
index 20bd41f..24c933c 100644
--- a/src/AccessControl/tests/testZopeGuards.py
+++ b/src/AccessControl/tests/testZopeGuards.py
@@ -355,6 +355,14 @@ class TestDictGuards(GuardTestCase):
             self.setSecurityManager(old)
         self.assertTrue(sm.calls)
 
+    def test_kvi_iteration(self):
+        from AccessControl.ZopeGuards import SafeIter
+        d = dict(a=1, b=2)
+        for attr in ("keys", "values", "items"):
+            v = getattr(d, attr)()
+            si = SafeIter(v)
+            self.assertEqual(next(si), next(iter(v)))
+
 
 class TestListGuards(GuardTestCase):
 

PY3: "ZopeGuards" forgets to allow iteration over the result of "dict.{keys,values,items}"
Under Python 3, the `next`s in the following code all result in an `AccessControl.unauthorized.Unauthorized: You are not allowed to access 'a particular tuple' in this context`:
```
from AccessControl.ZopeGuards import SafeIter, Containers

d={1:1, 2:2}
i=SafeIter(d.items())
next(i)
ik=SafeIter(d.keys())
next(ik)
iv=SafeIter(d.values())
next(iv)
```
This is the cause of https://github.com/zopefoundation/Products.PythonScripts/issues/35.
src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_kvi_iteration
src/AccessControl/tests/testZopeGuards.py::TestGuardedGetattr::test_attr_handler_table src/AccessControl/tests/testZopeGuards.py::TestGuardedGetattr::test_calls_validate_for_unknown_type src/AccessControl/tests/testZopeGuards.py::TestGuardedGetattr::test_miss src/AccessControl/tests/testZopeGuards.py::TestGuardedGetattr::test_simple_object_policies src/AccessControl/tests/testZopeGuards.py::TestGuardedGetattr::test_unauthorized src/AccessControl/tests/testZopeGuards.py::TestGuardedGetattr::test_unhashable_key src/AccessControl/tests/testZopeGuards.py::TestGuardedHasattr::test_hit src/AccessControl/tests/testZopeGuards.py::TestGuardedHasattr::test_miss src/AccessControl/tests/testZopeGuards.py::TestGuardedHasattr::test_unauthorized src/AccessControl/tests/testZopeGuards.py::TestGuardedHasattr::test_unhashable_key src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_get_default src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_get_simple src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_get_validates src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_keys_empty src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_keys_validates src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_pop_default src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_pop_raises src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_pop_simple src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_pop_validates src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_values_empty src/AccessControl/tests/testZopeGuards.py::TestDictGuards::test_values_validates src/AccessControl/tests/testZopeGuards.py::TestListGuards::test_pop_raises src/AccessControl/tests/testZopeGuards.py::TestListGuards::test_pop_simple src/AccessControl/tests/testZopeGuards.py::TestListGuards::test_pop_validates src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_all_fails src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_all_succeeds src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_any_fails src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_any_succeeds src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_apply src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_enumerate_fails src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_enumerate_succeeds src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_map_fails src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_map_succeeds src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_max_fails src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_max_succeeds src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_min_fails src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_min_succeeds src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_sum_fails src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_sum_succeeds src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_zip_fails src/AccessControl/tests/testZopeGuards.py::TestBuiltinFunctionGuards::test_zip_succeeds src/AccessControl/tests/testZopeGuards.py::TestGuardedDictListTypes::testDictCreation src/AccessControl/tests/testZopeGuards.py::TestGuardedDictListTypes::testListCreation src/AccessControl/tests/testZopeGuards.py::TestRestrictedPythonApply::test_apply src/AccessControl/tests/testZopeGuards.py::TestActualPython::testPython src/AccessControl/tests/testZopeGuards.py::TestActualPython::testPythonRealAC src/AccessControl/tests/testZopeGuards.py::TestActualPython::test_derived_class_normal src/AccessControl/tests/testZopeGuards.py::TestActualPython::test_derived_class_sneaky_en_suite src/AccessControl/tests/testZopeGuards.py::TestActualPython::test_derived_sneaky_instance src/AccessControl/tests/testZopeGuards.py::TestActualPython::test_derived_sneaky_post_facto src/AccessControl/tests/testZopeGuards.py::TestActualPython::test_dict_access src/AccessControl/tests/testZopeGuards.py::TestActualPython::test_guarded_next__1 src/AccessControl/tests/testZopeGuards.py::TestActualPython::test_guarded_next__2 src/AccessControl/tests/testZopeGuards.py::TestActualPython::test_guarded_next__3 src/AccessControl/tests/testZopeGuards.py::test_inplacevar src/AccessControl/tests/testZopeGuards.py::test_inplacevar_for_py24 src/AccessControl/tests/testZopeGuards.py::test_suite