Piers' new version (but I unfolded a few doc strings).
diff --git a/Lib/imaplib.py b/Lib/imaplib.py
index e6754ef..0ec6f03 100644
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -12,7 +12,7 @@
 			Time2Internaldate
 """
 
-import os, re, socket, string, time
+import re, socket, string, time, whrandom
 
 #	Globals
 
@@ -87,7 +87,6 @@
 
 	class error(Exception): pass	# Logical errors - debug required
 	class abort(error): pass	# Service errors - close and retry
-	COUNT = [0]			# Count instantiations
 
 
 	def __init__(self, host = '', port = IMAP4_PORT):
@@ -109,8 +108,7 @@
 		# Create unique tag for this session,
 		# and compile tagged response matcher.
 
-		self.COUNT[0] = self.COUNT[0] + 1
-		self.tagpre = Int2AP((os.getpid()<<8)+self.COUNT[0])
+		self.tagpre = Int2AP(whrandom.random()*32000)
 		self.tagre = re.compile(r'(?P<tag>'
 				+ self.tagpre
 				+ r'\d+) (?P<type>[A-Z]+) (?P<data>.*)')
@@ -188,6 +186,7 @@
 
 	def close(self):
 		"""Close currently selected mailbox.
+
 		Deleted messages are removed from writable mailbox.
 		This is the recommended command before 'LOGOUT'.
 
@@ -227,6 +226,7 @@
 
 	def expunge(self):
 		"""Permanently remove deleted items from selected mailbox.
+
 		Generates 'EXPUNGE' response for each deleted message.
 
 		(typ, [data]) = <instance>.expunge()
@@ -406,8 +406,7 @@
 
 
 	def uid(self, command, args):
-		"""Execute "command args" with messages identified by UID,
-		rather than message number.
+		"""Execute "command args" with messages identified by UID, rather than message number.
 
 		(typ, [data]) = <instance>.uid(command, args)
 
@@ -433,8 +432,7 @@
 
 
 	def xatom(self, name, arg1=None, arg2=None):
-		"""Allow simple extension commands
-		notified by server in CAPABILITY response.
+		"""Allow simple extension commands notified by server in CAPABILITY response.
 
 		(typ, [data]) = <instance>.xatom(name, arg1=None, arg2=None)
 		"""
@@ -650,10 +648,9 @@
 
 def Internaldate2tuple(resp):
 
-	"""
-		Convert IMAP4 INTERNALDATE to UT.
+	"""Convert IMAP4 INTERNALDATE to UT.
 
-		Returns Python time module tuple.
+	Returns Python time module tuple.
 	"""
 
 	mo = InternalDate.match(resp)
@@ -691,9 +688,10 @@
 
 def Int2AP(num):
 
-	"""Convert integer to A-P string representation. """
+	"""Convert integer to A-P string representation."""
 
 	val = ''; AP = 'ABCDEFGHIJKLMNOP'
+	num = int(abs(num))
 	while num:
 		num, mod = divmod(num, 16)
 		val = AP[mod] + val
@@ -703,7 +701,7 @@
 
 def ParseFlags(resp):
 
-	"""Convert IMAP4 flags response to python tuple. """
+	"""Convert IMAP4 flags response to python tuple."""
 
 	mo = Flags.match(resp)
 	if not mo: