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 13:31:33 2000
@@ -92,6 +92,8 @@
 import ZClassOwner
 from AccessControl.PermissionMapping import aqwrap, PermissionMapper
 
+import marshal
+
 _marker=[]
 class ZClassMethodsSheet(
     OFS.PropertySheets.PropertySheet,
@@ -104,6 +106,13 @@
     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))
 
     ######################################################################
     # 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 13:31:59 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=()
@@ -281,6 +282,28 @@
          ('', '__call__', 'index_html', 'createInObjectManager')),
         )
 
+    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
 
@@ -640,6 +663,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')
