.hy 0
 .B retcode\-item <RDN> <errCode> [op=<oplist>] [text=<message>]
 .B [ref=<referral>] [sleeptime=<sec>] [matched=<DN>]
-.B [unsolicited=<OID>[:<data>]] [flags=disconnect[,...]]
+.B [unsolicited=<OID>[:<data>]] [flags=[{pre|post}-]disconnect[,...]]
 .RS
 A dynamically generated entry, located below \fBretcode\-parent\fP.
 The \fBerrCode\fP is the number of the response code;
 of an RFC 4511 unsolicited response message; if \fBOID\fP
 is not "0", an extended response is generated, with the optional
 \fBdata\fP appended.
-If \fBflags\fP contains \fBdisconnect\fP, 
+If \fBflags\fP contains \fBdisconnect\fP, or \fBpre-disconnect\fP,
 .BR slapd (8)
-disconnects abruptly, without notice.
+disconnects abruptly, without notice; \fBpost-disconnect\fP
+causes disconnection right after sending response as appropriate.
 .RE
 .TP
 .B retcode\-indir
 .LP
 If TRUE,
 .BR slapd (8)
-disconnects abruptly without notice:
+disconnects abruptly without notice; if FALSE, it disconnects
+after sending response as appropriate:
 .RS 4
 ( 1.3.6.1.4.1.4203.666.11.4.1.8
     NAME ( 'errDisconnect' )
 
        struct berval           rdi_unsolicited_data;
 
        unsigned                rdi_flags;
-#define        RDI_DISCONNECT          (0x1U)
+#define        RDI_PRE_DISCONNECT      (0x1U)
+#define        RDI_POST_DISCONNECT     (0x2U)
 
        struct retcode_item_t   *rdi_next;
 } retcode_item_t;
                rs->sr_text = "retcode not found";
 
        } else {
-               if ( rdi->rdi_flags & RDI_DISCONNECT ) {
+               if ( rdi->rdi_flags & RDI_PRE_DISCONNECT ) {
                        return rs->sr_err = SLAPD_DISCONNECT;
                }
 
                }
                rs->sr_matched = NULL;
                rs->sr_text = NULL;
+
+               if ( rdi && rdi->rdi_flags & RDI_POST_DISCONNECT ) {
+                       return rs->sr_err = SLAPD_DISCONNECT;
+               }
                break;
        }
 
        Attribute       *a;
        int             err;
        char            *next;
+       int             disconnect = 0;
 
        if ( get_manageDSAit( op ) ) {
                return SLAP_CB_CONTINUE;
 
        /* disconnect */
        a = attr_find( e->e_attrs, ad_errDisconnect );
-       if ( a != NULL && bvmatch( &a->a_nvals[ 0 ], &slap_true_bv ) ) {
-               return rs->sr_err = SLAPD_DISCONNECT;
+       if ( a != NULL ) {
+               if ( bvmatch( &a->a_nvals[ 0 ], &slap_true_bv ) ) {
+                       return rs->sr_err = SLAPD_DISCONNECT;
+               }
+               disconnect = 1;
        }
 
        /* error code */
                op->o_bd = o_bd;
                op->o_callback = o_callback;
        }
-       
+
        if ( rs->sr_err != LDAP_SUCCESS ) {
+               if ( disconnect ) {
+                       return rs->sr_err = SLAPD_DISCONNECT;
+               }
+       
                op->o_abandon = 1;
                return rs->sr_err;
        }
 
                                } else if ( strncasecmp( argv[ i ], "flags=", STRLENOF( "flags=" ) ) == 0 )
                                {
-                                       if ( strcasecmp( &argv[ i ][ STRLENOF( "flags=" ) ], "disconnect" ) == 0 ) {
-                                               rdi.rdi_flags |= RDI_DISCONNECT;
+                                       char *arg = &argv[ i ][ STRLENOF( "flags=" ) ];
+                                       if ( strcasecmp( arg, "disconnect" ) == 0 ) {
+                                               rdi.rdi_flags |= RDI_PRE_DISCONNECT;
+
+                                       } else if ( strcasecmp( arg, "pre-disconnect" ) == 0 ) {
+                                               rdi.rdi_flags |= RDI_PRE_DISCONNECT;
+
+                                       } else if ( strcasecmp( arg, "post-disconnect" ) == 0 ) {
+                                               rdi.rdi_flags |= RDI_POST_DISCONNECT;
 
                                        } else {
                                                fprintf( stderr, "%s: line %d: retcode: "
                                                        "unknown flag \"%s\".\n",
-                                                       fname, lineno, &argv[ i ][ STRLENOF( "flags=" ) ] );
+                                                       fname, lineno, arg );
                                                return 1;
                                        }
 
 
 retcode-parent "ou=RetCodes,dc=example,dc=com"
 include                @DATADIR@/retcode.conf
 
+retcode-item   "cn=Unsolicited"                0x00 unsolicited="0"
+retcode-item   "cn=Notice of Disconnect"       0x00 unsolicited="1.3.6.1.4.1.1466.20036"
+retcode-item   "cn=Pre-disconnect"             0x34 flags="pre-disconnect"
+retcode-item   "cn=Post-disconnect"            0x34 flags="post-disconnect"
+
 #monitor#database      monitor