#include "slapi.h"
 #endif
 
+static ldap_pvt_thread_mutex_t slap_op_mutex;
+static LDAP_STAILQ_HEAD(s_o, slap_op)  slap_free_ops;
+
+void slap_op_init()
+{
+       ldap_pvt_thread_mutex_init( &slap_op_mutex );
+       LDAP_STAILQ_INIT(&slap_free_ops);
+}
+
+void slap_op_destroy()
+{
+       Operation *o;
+
+       while ( (o = LDAP_STAILQ_FIRST( &slap_free_ops )) != NULL) {
+               LDAP_STAILQ_REMOVE_HEAD( &slap_free_ops, o_next );
+               LDAP_STAILQ_NEXT(o, o_next) = NULL;
+               ch_free( o );
+       }
+       ldap_pvt_thread_mutex_destroy( &slap_op_mutex );
+}
 
 void
 slap_op_free( Operation *op )
        }
 #endif /* defined( LDAP_SLAPI ) */
 
-       free( (char *) op );
+       memset( op, 0, sizeof(Operation) );
+       ldap_pvt_thread_mutex_lock( &slap_op_mutex );
+       LDAP_STAILQ_INSERT_HEAD( &slap_free_ops, op, o_next );
+       ldap_pvt_thread_mutex_unlock( &slap_op_mutex );
 }
 
 Operation *
 {
        Operation       *op;
 
-       op = (Operation *) ch_calloc( 1, sizeof(Operation) );
+       ldap_pvt_thread_mutex_lock( &slap_op_mutex );
+       if (op = LDAP_STAILQ_FIRST( &slap_free_ops )) {
+               LDAP_STAILQ_REMOVE_HEAD( &slap_free_ops, o_next );
+       }
+       ldap_pvt_thread_mutex_unlock( &slap_op_mutex );
+
+       if (!op)
+               op = (Operation *) ch_calloc( 1, sizeof(Operation) );
 
        op->o_ber = ber;
        op->o_msgid = msgid;