Zope container objects can't multitask. If you try and add more than one item to a folder at a time -- even if they have different ids -- a Z2 CONFLICT error occurs. To add insult to injury, the error message sent to the user seems to be almost random. I've seen both of these: Missing doc string at: http://BEETLEJUICE:8080/folder1 The parameter, <em>id</em>, was omitted from the request. To reproduce the problem, create a folder named /folder1 on your server and run the following code (don't forget to edit the defaults!): # test Zope's ability to add more than one item to a folder simultaneously import httplib, sys, time, urllib, base64, thread, string __defaultServer = '127.0.0.1' __defaultPath = '/folder1' __defaultPort = 8080 __defaultUsername = 'zopeadmin' __defaultPassword = '<your password>' def httpPOST(dict, server, port, path, username, password): """I blame section 4.61 of the Python FAQ.""" postings = [] for key in dict.keys(): postings.append('%s=%s' % (key, urllib.quote(dict[key]))) qs = string.join(postings, '&') userpass = '%s:%s' % (username, password) httpobj = httplib.HTTP(server, port) httpobj.putrequest('POST', path) httpobj.putheader('Accept', '*/*') httpobj.putheader('Connection', 'Keep-Alive') httpobj.putheader('Content-type', 'application/x-www-form-urlencoded') httpobj.putheader('Content-length', '%d' % len(qs)) httpobj.putheader('Authorization', 'Basic %s' % base64.encodestring(userpass)) httpobj.endheaders() httpobj.send(qs) reply, msg, headers = httpobj.getreply() return reply, msg, headers, httpobj.getfile().read() def createDTMLDocument( id, title='', server=__defaultServer, port=__defaultPort, path=__defaultPath, username=__defaultUsername, password=__defaultPassword ): """Create a DTML document""" dict = { 'id': id, 'title': title } return httpPOST(dict, server, port, path + '/manage_addProduct/OFSP/addDTMLDocument', username, password) def Test(numDocs): for intId in range(numDocs): ident = thread.get_ident() id = '%d.%d' % (intId, ident) title = 'concurrency' print 'creating document %s' % id reply, msg, headers, body = createDTMLDocument(id, title) if reply != 302: # I'm expecting a redirect print 'reply status:', reply print headers print body def MultiThreadedTest(numThreads, numDocs): for threadnum in range(numThreads): thread.start_new_thread(Test, (numDocs,) ) # Test(5) MultiThreadedTest(3,3) Regards, Garth. -- <gtk@well.com>