diff -ur /root/Zope-2.2.4-linux2-x86/lib/python/ZClasses/Method.py Zope/lib/python/ZClasses/Method.py
--- /root/Zope-2.2.4-linux2-x86/lib/python/ZClasses/Method.py	Mon Aug 14 10:47:51 2000
+++ Zope/lib/python/ZClasses/Method.py	Thu Dec  7 22:26:10 2000
@@ -92,6 +92,8 @@
 import ZClassOwner
 from AccessControl.PermissionMapping import aqwrap, PermissionMapper
 
+import marshal
+
 _marker=[]
 class ZClassMethodsSheet(
     OFS.PropertySheets.PropertySheet,
@@ -100,10 +102,37 @@
     App.ProductRegistry.ProductRegistryMixin,
     ZClassOwner.ZClassOwner):
     "Manage instance methods"
+
+    __ac_permissions__=(
+	('FTP access',         ('manage_FTPstat','manage_FTPlist')),
+    )
+
     id='contents'
     icon='p_/Methods_icon'
 
     def tpURL(self): return 'propertysheets/methods'
+
+    def manage_FTPstat(self,REQUEST):
+        "Psuedo stat used for FTP listings"
+        mode=0040000|0770
+        mtime=self.bobobase_modification_time().timeTime()
+        owner=group='Zope'
+        return marshal.dumps((mode,0,0,1,owner,group,0,mtime,mtime,mtime))
+
+    def manage_FTPlist(self,REQUEST):
+        "Directory listing for FTP"
+        out=()
+        files=self.objectItems()
+        if not (hasattr(self,'isTopLevelPrincipiaApplicationObject') and
+                self.isTopLevelPrincipiaApplicationObject):
+             files.insert(0,('..',self.aq_parent))
+        for k,v in files:
+            try:    stat=marshal.loads(v.manage_FTPstat(REQUEST))
+            except:
+                stat=None
+            if stat is not None:
+                out=out+((k,stat),)
+        return marshal.dumps(out)
 
     ######################################################################
     # Hijinks to let us create factories and classes within classes.
diff -ur /root/Zope-2.2.4-linux2-x86/lib/python/ZClasses/ZClass.py Zope/lib/python/ZClasses/ZClass.py
--- /root/Zope-2.2.4-linux2-x86/lib/python/ZClasses/ZClass.py	Wed Nov  1 15:11:24 2000
+++ Zope/lib/python/ZClasses/ZClass.py	Thu Dec  7 22:24:47 2000
@@ -91,7 +91,8 @@
 from ExtensionClass import Base
 from App.FactoryDispatcher import FactoryDispatcher
 from ComputedAttribute import ComputedAttribute
-import OFS.PropertySheets
+
+import marshal
 
 if not hasattr(Products, 'meta_types'):
     Products.meta_types=()
@@ -279,8 +280,31 @@
     __ac_permissions__=(
         ('Create class instances',
          ('', '__call__', 'index_html', 'createInObjectManager')),
+	 ('FTP access',         ('manage_FTPstat','manage_FTPlist')),
         )
 
+    def manage_FTPlist(self,REQUEST):
+        "Directory listing for FTP"
+        out=()
+	files=self.__dict__.items()
+        if not (hasattr(self,'isTopLevelPrincipiaApplicationObject') and
+                self.isTopLevelPrincipiaApplicationObject):
+             files.insert(0,('..',self.aq_parent))
+        for k,v in files:
+            try:    stat=marshal.loads(v.manage_FTPstat(REQUEST))
+            except:
+                stat=None
+            if stat is not None:
+                out=out+((k,stat),)
+        return marshal.dumps(out)
+
+    def manage_FTPstat(self,REQUEST):
+        "Psuedo stat used for FTP listings"
+        mode=0040000|0770
+        mtime=self.bobobase_modification_time().timeTime()
+        owner=group='Zope'
+        return marshal.dumps((mode,0,0,1,owner,group,0,mtime,mtime,mtime))
+
     def __init__(self, id, title, bases, zope_object=1):
         """Build a Zope class
 
@@ -630,6 +654,10 @@
 class ZClassSheets(OFS.PropertySheets.PropertySheets):
     "Manage a collection of property sheets that provide ZClass management"
 
+    __ac_permissions__=(
+	('FTP access',         ('manage_FTPstat','manage_FTPlist')),
+    )
+
     #isPrincipiaFolderish=1
     #def tpValues(self): return self.methods, self.common
     #def tpURL(self): return 'propertysheets'
@@ -640,6 +668,28 @@
     views       = Basic.ZClassViewsSheet('views')
     basic       = Basic.ZClassBasicSheet('basic')
     permissions = Basic.ZClassPermissionsSheet('permissions')
+
+    def manage_FTPlist(self,REQUEST):
+        "Directory listing for FTP"
+        out=()
+        files=self.__dict__.items()
+        if not (hasattr(self,'isTopLevelPrincipiaApplicationObject') and
+                self.isTopLevelPrincipiaApplicationObject):
+             files.insert(0,('..',self.aq_parent))
+        for k,v in files:
+            try:    stat=marshal.loads(v.manage_FTPstat(REQUEST))
+            except:
+                stat=None
+            if stat is not None:
+                out=out+((k,stat),)
+        return marshal.dumps(out)
+
+    def manage_FTPstat(self,REQUEST):
+        "Psuedo stat used for FTP listings"
+        mode=0040000|0770
+        mtime=self.bobobase_modification_time().timeTime()
+        owner=group='Zope'
+        return marshal.dumps((mode,0,0,1,owner,group,0,mtime,mtime,mtime))
 
     def __init__(self):
         self.methods=Method.ZClassMethodsSheet('methods')
