diff --git a/CREDITS b/CREDITS
index 283c4f2274c62300d0b3350a9c6e1f7c85592797..05c694a6cb05b870d720fd2d1e90eb5f2765a58d 100644
--- a/CREDITS
+++ b/CREDITS
@@ -7,6 +7,10 @@ real, usable Python extension.
 
 Other contributors (in random order):
 
+arkanes@irc.freenode.net
+  for suggesting a class method to compute and cache protocol masks
+habnabit@habnabit.org
+  for suggesting function attributes and decorators for protocol negotiation
 Dwayne Litzenberger, B.A.Sc.
   for library_dirs patch to compile on Debian 
 Dave MacQuigg 
diff --git a/Milter/__init__.py b/Milter/__init__.py
index 58ebdf03616900034c9d80a6347512073083b97a..fbd1d2b3ef81c2ab41426662a7d7911731e1f73e 100755
--- a/Milter/__init__.py
+++ b/Milter/__init__.py
@@ -101,8 +101,8 @@ class Base(object):
         ca = getattr(func,'milter_protocol',0)
         #print func,hex(nr),hex(nc),hex(ca)
         p |= (nr|nc) & ~ca
-    klass._protocol_mask = p
-    return p
+      klass._protocol_mask = p
+      return p
     
   # Default negotiation sets P_NO* and P_NR* for callbacks
   # marked @nocallback and @noreply respectively
diff --git a/pymilter.spec b/pymilter.spec
index e0d2dac4f50ab678ea2c3e02cf3546dceca8f3a9..7db3348aa8141009c1c7da2247d22dd4f5b1590a 100644
--- a/pymilter.spec
+++ b/pymilter.spec
@@ -83,6 +83,9 @@ chmod a+x $RPM_BUILD_ROOT%{libdir}/start.sh
 rm -rf $RPM_BUILD_ROOT
 
 %changelog
+* Tue Jun 02 2009 Stuart Gathman <stuart@bmsi.com> 0.9.2-2
+- Cache callback negotiation
+
 * Thu May 28 2009 Stuart Gathman <stuart@bmsi.com> 0.9.2-1
 - Add new callback support: data,negotiate,unknown
 - Auto-negotiate protocol steps