diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/include/srtp.h srtp/include/srtp.h
--- srtp-ws/include/srtp.h	2009-04-22 19:06:22.000000000 -0400
+++ srtp/include/srtp.h	2009-04-23 15:17:49.000000000 -0400
@@ -225,6 +225,12 @@ typedef struct srtp_policy_t {
                                 *   for this stream (if any)             */ 
   unsigned long  window_size;  /**< The window size to use for replay
 				*   protection. */
+  int        allow_repeat_tx;  /**< Whether retransmissions of
+				*   packets with the same sequence number
+				*   are allowed.  (Note that such repeated
+				*   transmissions must have the same RTP
+				*   payload, or a severe security weakness
+				*   is introduced!)                      */
   struct srtp_policy_t *next;  /**< Pointer to next stream policy.       */
 } srtp_policy_t;
 
diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/include/srtp_priv.h srtp/include/srtp_priv.h
--- srtp-ws/include/srtp_priv.h	2007-06-15 14:17:40.000000000 -0400
+++ srtp/include/srtp_priv.h	2009-04-22 19:27:10.000000000 -0400
@@ -218,6 +218,7 @@ typedef struct srtp_stream_ctx_t {
   sec_serv_t rtcp_services;
   key_limit_ctx_t *limit;
   direction_t direction;
+  int        allow_repeat_tx;
   ekt_stream_t ekt; 
   struct srtp_stream_ctx_t *next;   /* linked list of streams */
 } srtp_stream_ctx_t;
diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/srtp/srtp.c srtp/srtp/srtp.c
--- srtp-ws/srtp/srtp.c	2009-04-22 19:18:43.000000000 -0400
+++ srtp/srtp/srtp.c	2009-04-22 19:30:23.000000000 -0400
@@ -280,6 +280,7 @@ srtp_stream_clone(const srtp_stream_ctx_
   if (status)
     return status;
   rdb_init(&str->rtcp_rdb);
+  str->allow_repeat_tx = stream_template->allow_repeat_tx;
   
   /* set ssrc to that provided */
   str->ssrc = ssrc;
@@ -525,6 +526,9 @@ srtp_stream_init(srtp_stream_ctx_t *srtp
    /* initialize SRTCP replay database */
    rdb_init(&srtp->rtcp_rdb);
 
+   /* initialize allow_repeat_tx */
+   srtp->allow_repeat_tx = p->allow_repeat_tx;
+
    /* DAM - no RTCP key limit at present */
 
    /* initialize keys */
@@ -732,9 +736,12 @@ srtp_stream_init(srtp_stream_ctx_t *srtp
     */
    delta = rdbx_estimate_index(&stream->rtp_rdbx, &est, ntohs(hdr->seq));
    status = rdbx_check(&stream->rtp_rdbx, delta);
-   if (status)
-     return status;  /* we've been asked to reuse an index */
-   rdbx_add_index(&stream->rtp_rdbx, delta);
+   if (status) {
+     if (status != err_status_replay_fail || !stream->allow_repeat_tx)
+       return status;  /* we've been asked to reuse an index */
+   }
+   else
+     rdbx_add_index(&stream->rtp_rdbx, delta);
 
 #ifdef NO_64BIT_MATH
    debug_print2(mod_srtp, "estimated packet index: %08x%08x", 
diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/test/dtls_srtp_driver.c srtp/test/dtls_srtp_driver.c
--- srtp-ws/test/dtls_srtp_driver.c	2009-04-23 15:50:48.000000000 -0400
+++ srtp/test/dtls_srtp_driver.c	2009-04-23 15:51:11.000000000 -0400
@@ -185,6 +185,7 @@ test_dtls_srtp() {
   policy.ssrc.type  = ssrc_any_inbound;
   policy.ekt = NULL;
   policy.window_size = 128;
+  policy.allow_repeat_tx = 0;
   policy.next = NULL;
     
   err = srtp_add_stream(s, &policy);
diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/test/rtpw.c srtp/test/rtpw.c
--- srtp-ws/test/rtpw.c	2009-04-22 19:16:52.000000000 -0400
+++ srtp/test/rtpw.c	2009-04-23 15:16:18.000000000 -0400
@@ -331,6 +331,7 @@ main (int argc, char *argv[]) {
     policy.key  = (uint8_t *) key;
     policy.next = NULL;
     policy.window_size = 128;
+    policy.allow_repeat_tx = 0;
     policy.rtp.sec_serv = sec_servs;
     policy.rtcp.sec_serv = sec_serv_none;  /* we don't do RTCP anyway */
 
@@ -384,6 +385,7 @@ main (int argc, char *argv[]) {
     policy.rtcp.auth_tag_len   = 0;
     policy.rtcp.sec_serv       = sec_serv_none;   
     policy.window_size         = 0;
+    policy.allow_repeat_tx     = 0;
     policy.next                = NULL;
   }
 
diff -purN -x CVS -x '*~' -x '.*' -x 'obj-*' srtp-ws/test/srtp_driver.c srtp/test/srtp_driver.c
--- srtp-ws/test/srtp_driver.c	2009-04-22 19:16:52.000000000 -0400
+++ srtp/test/srtp_driver.c	2009-04-23 15:16:18.000000000 -0400
@@ -323,6 +323,7 @@ main (int argc, char *argv[]) {
     policy.key  = test_key;
     policy.ekt = NULL;
     policy.window_size = 128;
+    policy.allow_repeat_tx = 0;
     policy.next = NULL;
 
     printf("mips estimate: %e\n", mips);
@@ -992,7 +993,8 @@ srtp_session_print_policy(srtp_t srtp) {
            "# rtcp cipher:   %s\r\n"
 	   "# rtcp auth:     %s\r\n"
 	   "# rtcp services: %s\r\n"
-	   "# window size:   %lu\r\n",
+	   "# window size:   %lu\r\n"
+	   "# tx rtx allowed:%s\r\n",
 	   direction[stream->direction],
 	   stream->rtp_cipher->type->description,
 	   stream->rtp_auth->type->description,
@@ -1000,7 +1002,8 @@ srtp_session_print_policy(srtp_t srtp) {
 	   stream->rtcp_cipher->type->description,
 	   stream->rtcp_auth->type->description,
 	   serv_descr[stream->rtcp_services],
-	   rdbx_get_window_size(&stream->rtp_rdbx));
+	   rdbx_get_window_size(&stream->rtp_rdbx),
+	   stream->allow_repeat_tx ? "true" : "false");
   }
 
   /* loop over streams in session, printing the policy of each */
@@ -1016,7 +1019,8 @@ srtp_session_print_policy(srtp_t srtp) {
            "# rtcp cipher:   %s\r\n"
 	   "# rtcp auth:     %s\r\n"
 	   "# rtcp services: %s\r\n"
-	   "# window size:   %lu\r\n",
+	   "# window size:   %lu\r\n"
+	   "# tx rtx allowed:%s\r\n",
 	   stream->ssrc,
 	   stream->rtp_cipher->type->description,
 	   stream->rtp_auth->type->description,
@@ -1024,7 +1028,8 @@ srtp_session_print_policy(srtp_t srtp) {
 	   stream->rtcp_cipher->type->description,
 	   stream->rtcp_auth->type->description,
 	   serv_descr[stream->rtcp_services],
-	   rdbx_get_window_size(&stream->rtp_rdbx));
+	   rdbx_get_window_size(&stream->rtp_rdbx),
+	   stream->allow_repeat_tx ? "true" : "false");
 
     /* advance to next stream in the list */
     stream = stream->next;
@@ -1180,6 +1185,7 @@ srtp_validate() {
   policy.key  = test_key;
   policy.ekt = NULL;
   policy.window_size = 128;
+  policy.allow_repeat_tx = 0;
   policy.next = NULL;
 
   status = srtp_create(&srtp_snd, &policy);
@@ -1337,6 +1343,7 @@ const srtp_policy_t default_policy = {
   test_key,
   NULL,        /* indicates that EKT is not in use */
   128,         /* replay window size */
+  0,           /* retransmission not allowed */
   NULL
 };
 
@@ -1361,6 +1368,7 @@ const srtp_policy_t aes_tmmh_policy = {
   test_key,
   NULL,        /* indicates that EKT is not in use */
   128,         /* replay window size */
+  0,           /* retransmission not allowed */
   NULL
 };
 
@@ -1385,6 +1393,7 @@ const srtp_policy_t tmmh_only_policy = {
   test_key,
   NULL,        /* indicates that EKT is not in use */
   128,         /* replay window size */
+  0,           /* retransmission not allowed */
   NULL
 };
 
@@ -1409,6 +1418,7 @@ const srtp_policy_t aes_only_policy = {
   test_key,
   NULL,        /* indicates that EKT is not in use */
   128,         /* replay window size */
+  0,           /* retransmission not allowed */
   NULL
 };
 
@@ -1433,6 +1443,7 @@ const srtp_policy_t hmac_only_policy = {
   test_key,
   NULL,        /* indicates that EKT is not in use */
   128,         /* replay window size */
+  0,           /* retransmission not allowed */
   NULL
 };
 
@@ -1457,6 +1468,7 @@ const srtp_policy_t null_policy = {
   test_key,
   NULL,        /* indicates that EKT is not in use */
   128,         /* replay window size */
+  0,           /* retransmission not allowed */
   NULL
 };
 
@@ -1495,6 +1507,7 @@ const srtp_policy_t hmac_only_with_ekt_p
   test_key,
   &ekt_test_policy,        /* indicates that EKT is not in use */
   128,         /* replay window size */
+  0,           /* retransmission not allowed */
   NULL
 };
 
@@ -1548,5 +1561,6 @@ const srtp_policy_t wildcard_policy = {
   test_key,
   NULL,
   128,         /* replay window size */
+  0,           /* retransmission not allowed */
   NULL
 };