diff -ur orig/meta1-1.0.PreAlpha28.0/include/sm/das.h meta1-1.0.PreAlpha28.0/include/sm/das.h
--- orig/meta1-1.0.PreAlpha28.0/include/sm/das.h	2005-08-15 20:06:46.000000000 +0300
+++ meta1-1.0.PreAlpha28.0/include/sm/das.h	2009-06-09 18:45:05.000000000 +0300
@@ -29,6 +29,7 @@
 #define DA_IDX_ESMTP		0	/* MUST be 0: default */
 #define DA_IDX_LMTP_UNIX	1	/* lmtp over UNIX domain socket */
 #define DA_IDX_LMTP_INET	2	/* lmtp over inet(v4) socket */
+#define DA_IDX_DISCARD          3       /* Bitbucket mailer */
 
 #if DA_IDX_ESMTP != 0
  ERROR: DA_IDX_ESMTP_ != 0
diff -ur orig/meta1-1.0.PreAlpha28.0/include/sm/mta.h meta1-1.0.PreAlpha28.0/include/sm/mta.h
--- orig/meta1-1.0.PreAlpha28.0/include/sm/mta.h	2007-06-02 07:11:39.000000000 +0300
+++ meta1-1.0.PreAlpha28.0/include/sm/mta.h	2009-06-09 18:45:21.000000000 +0300
@@ -227,6 +227,7 @@
 #endif
 #define LMTP_IPV4_S2	"[127.0.0.255]"
 #define LMTP_MT		"lmtp:"
+#define DISCARD_MT      "discard:"
 
 /* default log level */
 #define SM_LOG_LEVEL	99999
diff -ur orig/meta1-1.0.PreAlpha28.0/qmgr/sched.c meta1-1.0.PreAlpha28.0/qmgr/sched.c
--- orig/meta1-1.0.PreAlpha28.0/qmgr/sched.c	2007-06-24 05:52:57.000000000 +0300
+++ meta1-1.0.PreAlpha28.0/qmgr/sched.c	2009-06-12 09:47:25.000000000 +0300
@@ -1545,6 +1545,9 @@
 
 			max_rcpts_ta = qmgr_rpcts_ta(qmgr_ctx, aq_rcpt);
 
+			/* FIXME: See below */
+			if (aq_rcpt->aqr_da_idx == DA_IDX_DISCARD)
+				AQR_SET_FLAG(aq_rcpt, AQR_FL_SCHED);
 			/* Add more recipients to this DA transaction? */
 			for (aq_rcpt_nxt = AQR_SS_SUCC(aq_rcpt), nrcpts = 1;
 			     aq_rcpt_nxt != aq_rcpt && nrcpts < max_rcpts_ta
@@ -1617,8 +1620,28 @@
 				aq_rcpt_nxt->aqr_last_try = time_now;
 			}
 
-			/* Send task to DA */
-			ret = sm_rcbcom_endrep(&qsc_ctx->qsc_com, qsc_ctx->qsc_com.rcbcom_tsk, true /* XXX HACK */, &rcbe);
+			/* NOTE: The SAME_TRANSACTION macro used in the
+			   above loop ensures that all recipients within a
+			   single transaction have the same aqr_da_idx. */
+			if (aq_rcpt->aqr_da_idx == DA_IDX_DISCARD) {
+				sm_log_write(qmgr_ctx->qmgr_lctx,
+					     QM_LCAT_SCHED, QM_LMOD_SCHED,
+					     SM_LOG_INFO, 9,
+					     "func=qmgr_sched_dlvry, ss_ta=%s, da_sess=%s, da_ta=%s, rcpt=%@S, status=discarded"
+				, aq_rcpt->aqr_ss_ta_id
+				, dadb_entry->dadbe_da_se_id
+				, dadb_entry->dadbe_da_ta_id
+			        , aq_rcpt->aqr_pa);
+
+				ret = qda_update_ta_stat(
+					qmgr_ctx, dadb_entry->dadbe_da_ta_id,
+					SM_SUCCESS,
+					0, qsc_ctx->qsc_dadb_ctx,
+					dadb_entry, aq_ta, NULL,
+					NULL, THR_NO_LOCK);
+			} else
+				/* Send task to DA */
+				ret = sm_rcbcom_endrep(&qsc_ctx->qsc_com, qsc_ctx->qsc_com.rcbcom_tsk, true /* XXX HACK */, &rcbe);
 			if (sm_is_err(ret)) {
 				aq_rcpt_P aq_rcpt_r;
 
diff -ur orig/meta1-1.0.PreAlpha28.0/smar/rcpt.c meta1-1.0.PreAlpha28.0/smar/rcpt.c
--- orig/meta1-1.0.PreAlpha28.0/smar/rcpt.c	2008-11-07 05:44:26.000000000 +0200
+++ meta1-1.0.PreAlpha28.0/smar/rcpt.c	2009-06-09 18:46:00.000000000 +0300
@@ -1505,6 +1505,34 @@
 		}
 		gotport = false;
 
+#define DISCARD_MT_LEN     (sizeof(DISCARD_MT) - 1)
+		if (ipv4s != NULL
+		    && strncmp(ipv4s, DISCARD_MT, DISCARD_MT_LEN) == 0) {
+			sm_rcb_P rcb;
+			
+			smar_rcpt->arr_da = DA_IDX_DISCARD;
+			SMARR_SET_FLAG(smar_rcpt, SMARR_FL_GOTMT);
+			sm_log_write(smar_ctx->smar_lctx,
+				AR_LCAT_RESOLVER, AR_LMOD_RESOLVER,
+				SM_LOG_INFO, 10,
+				"sev=INFO, func=smar_rcpt_rslv, status=resolved, pa=%S, mailer=discard",
+				smar_rcpt->arr_pa);
+
+			ret = smar_rcpt_re_ipv4(smar_rcpt, 1,
+						smar_rcpts->arrs_resolved == 0);
+			if (sm_is_err(ret)) {
+				sm_log_write(smar_ctx->smar_lctx,
+					AR_LCAT_RESOLVER, AR_LMOD_RESOLVER,
+					     SM_LOG_ERROR, 0,
+					     "sev=ERROR, func=smar_rcpt_rslv, called=resolved, pa=%S, mailer=discard, ret=%m",
+					     smar_rcpt->arr_pa, ret);
+				SMARRS_SET_FLAG(smar_rcpts, SMARRS_FL_ERCB);
+				/* XXX need more cleanup? */
+				goto error;
+			}
+			goto endcom;
+		}
+		
 		if (ipv4s != NULL && '{' == *ipv4s && sm_str_getlen(mtstr) > 2) {
 			ar_mtcnf_T ar_mtcnf;
 			uint u;
