diff --git a/doc/CHANGES.txt b/doc/CHANGES.txt
index adb96c56e43772ebe048ed60e5e6f40f2ebafbe3..b7bc3deb2dced888e4681067c59327fc3710aaab 100644
--- a/doc/CHANGES.txt
+++ b/doc/CHANGES.txt
@@ -8,7 +8,10 @@ Zope Changes
 
     Bugs fixed
 
-      - fixed outdated transaction.commit(1) call in 
+      - Launchpad #245649:  the Products package is now a proper
+        "namespace package" under the rules specified by setuptools.
+
+      - Fixed outdated transaction.commit(1) call in 
         ZODBMountPoint.SimpleTrailblazer
 
       - Launchpad #239636:  Ensure that HEAD requests lock an empty body
diff --git a/lib/python/AccessControl/Permission.py b/lib/python/AccessControl/Permission.py
index 9a2d32b06bc7e719091642b7e727fe87e80acaa9..8f812197b9add4076bf250175d7725e51703e6e2 100644
--- a/lib/python/AccessControl/Permission.py
+++ b/lib/python/AccessControl/Permission.py
@@ -129,8 +129,9 @@ def registerPermissions(permissions, defaultDefault=('Manager',)):
         else:
             perm, methods, default = setting
         _registeredPermissions[perm]=1
+        Products_permissions = getattr(Products, '__ac_permissions__', ())
         Products.__ac_permissions__=(
-            Products.__ac_permissions__+((perm,(),default),))
+            Products_permissions + ((perm, (), default),))
         mangled=pname(perm) # get mangled permission name
         if not hasattr(Globals.ApplicationDefaultPermissions, mangled):
             setattr(Globals.ApplicationDefaultPermissions,
diff --git a/lib/python/OFS/ObjectManager.py b/lib/python/OFS/ObjectManager.py
index 7c52d3328c735dd3f1010f969fb613e854265019..41fb4f81636ff638f156022a01f85b011c86b561 100644
--- a/lib/python/OFS/ObjectManager.py
+++ b/lib/python/OFS/ObjectManager.py
@@ -250,7 +250,8 @@ class ObjectManager(
         return meta_types
 
     def _subobject_permissions(self):
-        return (Products.__ac_permissions__+
+        Products_permissions = getattr(Products, '__ac_permissions__', ())
+        return (Products_permissions +
                 self.aq_acquire('_getProductRegistryData')('ac_permissions')
                 )
 
diff --git a/lib/python/Products/__init__.py b/lib/python/Products/__init__.py
index 5910d2442eb2ad8b3763fc94fa8b538ce86cc242..6fad949723aabc2a51d3cb9f0654591f2982c030 100644
--- a/lib/python/Products/__init__.py
+++ b/lib/python/Products/__init__.py
@@ -10,8 +10,6 @@
 # FOR A PARTICULAR PURPOSE
 #
 ##############################################################################
-__ac_permissions__=()
-
 # See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
 try:
     __import__('pkg_resources').declare_namespace(__name__)
diff --git a/lib/python/ZClasses/Basic.py b/lib/python/ZClasses/Basic.py
index aae8153eecc2d807fbffe643c9706547fa57c2d7..99fbc7234e4ca2168e0651ad812b92f5f575cbc6 100644
--- a/lib/python/ZClasses/Basic.py
+++ b/lib/python/ZClasses/Basic.py
@@ -189,9 +189,10 @@ class ZClassPermissionsSheet(OFS.PropertySheets.PropertySheet,
     manage=Globals.DTMLFile('dtml/classPermissions', globals())
 
     def possible_permissions(self):
+        Products_permissions = getattr(Products, '__ac_permissions__', ())
         r=map(
             lambda p: p[0],
-            Products.__ac_permissions__+
+            Products_permissions +
             self.aq_acquire('_getProductRegistryData')('ac_permissions')
             )
         r.sort()
@@ -199,9 +200,10 @@ class ZClassPermissionsSheet(OFS.PropertySheets.PropertySheet,
 
     def manage_edit(self, selected=[], REQUEST=None):
         "Remove some permissions"
+        Products_permissions = getattr(Products, '__ac_permissions__', ())
         r=[]
         for p in (
-            Products.__ac_permissions__+
+            Products_permissions +
             self.aq_acquire('_getProductRegistryData')('ac_permissions')):
             if p[0] in selected:
                 r.append(p)