diff --git a/extensions/rt_busypeers/rtbusy.c b/extensions/rt_busypeers/rtbusy.c
new file mode 100644
index 0000000..e554a44
--- /dev/null
+++ b/extensions/rt_busypeers/rtbusy.c
@@ -0,0 +1,281 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Sebastien Decugis <sdecugis@freediameter.net>							 *
+*													 *
+* Copyright (c) 2015, WIDE Project and NICT								 *
+* All rights reserved.											 *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/* See doc/rt_busypeers.conf.sample for more details about the features of this extension */
+#include "rtbusy.h"
+
+/* The configuration structure */
+struct rtbusy_conf rtbusy_conf;
+
+static struct fd_rt_fwd_hdl * rt_busy_hdl = NULL;
+
+static void rtbusy_expirecb(void * data, DiamId_t sentto, size_t senttolen, struct msg ** req);
+
+/* The function that does the actual work */
+int rt_busy_process_busy(struct msg ** pmsg, int is_req, DiamId_t sentto, size_t senttolen, union avp_value *oh)
+{
+	struct msg * qry = NULL;
+	struct rt_data * rtd = NULL;
+	struct fd_list * candidates = NULL;
+	int sendingattempts;
+	int resend = 1;
+	
+	
+	TRACE_ENTRY("%p(%p) %d %p %p", pmsg, pmsg?*pmsg:NULL, is_req, sentto, oh);
+	
+	if (is_req) {
+		qry = *pmsg;
+	} else {
+		CHECK_FCT( fd_msg_answ_getq( *pmsg, &qry ) );
+	}
+	
+	CHECK_FCT( fd_msg_rt_get ( qry, &rtd ) );
+	ASSERT(rtd);
+	
+	/* rtd is the routing data associated with the query that was sent */
+	
+	/* Store the error in this routing data, this avoids sending the message to the same peer again */
+	CHECK_FCT( fd_rtd_error_add(rtd, 
+				    sentto, senttolen, 
+				    (uint8_t *)(oh ? (DiamId_t)oh->os.data : fd_g_config->cnf_diamid), oh ? oh->os.len : fd_g_config->cnf_diamid_len , 
+	                            ER_DIAMETER_TOO_BUSY, 
+	                            &candidates, 
+	                            &sendingattempts) );
+	
+	/* Now we need to decide if we re-send this query to a different peer or return an error to upstream */
+	
+	/* First, are we exceeding the allowed attempts? */
+	if (rtbusy_conf.RetryMaxPeers != 0) {
+		if (sendingattempts >= rtbusy_conf.RetryMaxPeers) {
+			TRACE_DEBUG(FULL, "Maximum number of sending attempts reached for message %p, returning an error upstream", qry);
+			resend = 0;
+		}
+	}
+	
+	if (resend) {
+		/* Check if we have any valid candidate left for sending the message. This may not be 100% accurate but there should not be
+		any situation where this is actually an issue. */
+		if (FD_IS_LIST_EMPTY(candidates)) {
+			resend = 0;
+		} else {
+			struct rtd_candidate * first = candidates->next->o;
+			if (first->score < 0) /* No more candidate available */
+				resend = 0;
+		}
+	}
+	
+	/* Ok, now act on the message, we know what to do */
+	if (resend) {
+		if (!is_req) {
+			/* We must free the answer we received, and send the query again */
+			CHECK_FCT( fd_msg_answ_detach(*pmsg) );
+			CHECK_FCT( fd_msg_free(*pmsg) );
+			*pmsg = qry;
+		}
+		/* Send the query again. We  need to re-associate the expirecb which was cleaned, if it is used */
+		if (rtbusy_conf.RelayTimeout) {
+			char *buf = NULL;
+			size_t len;
+			struct timespec expire;
+			CHECK_SYS(  clock_gettime(CLOCK_REALTIME, &expire)  );
+			expire.tv_sec += rtbusy_conf.RelayTimeout/1000 + ((expire.tv_nsec + (1000000LL * (rtbusy_conf.RelayTimeout % 1000))) / 1000000000LL);
+			expire.tv_nsec = (expire.tv_nsec + (1000000LL * (rtbusy_conf.RelayTimeout % 1000))) % 1000000000LL;
+			CHECK_MALLOC_DO( fd_msg_dump_full(&buf, &len, NULL, *pmsg, fd_g_config->cnf_dict, 0, 1), /* nothing */);
+			TRACE_ERROR( "No answer received for message from peer '%.*s' before timeout (%dms), re-sending: %s", (int)senttolen, sentto,
+				     rtbusy_conf.RelayTimeout, buf);
+			free(buf);
+			CHECK_FCT( fd_msg_send_timeout( pmsg, NULL, NULL, rtbusy_expirecb, &expire ) );
+		} else {
+			CHECK_FCT( fd_msg_send(pmsg, NULL, NULL) );
+		}
+	
+	} else {
+		if (is_req) {
+			char *buf = NULL;
+			size_t len;
+
+			CHECK_MALLOC_DO( fd_msg_dump_full(&buf, &len, NULL, *pmsg, fd_g_config->cnf_dict, 0, 1), /* nothing */);
+			TRACE_ERROR( "No answer received for message from peer '%.*s' before timeout (%dms), giving up and sending error reply: %s", (int)senttolen, sentto,
+				     rtbusy_conf.RelayTimeout, buf);
+			free(buf);
+			/* We must create an answer */
+			CHECK_FCT( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, pmsg, MSGFL_ANSW_ERROR ) );
+			
+			CHECK_FCT( fd_msg_rescode_set(*pmsg, "DIAMETER_TOO_BUSY", "[rt_busypeers] Timeout reached while waiting for an answer", NULL, 1 ) );
+		
+			CHECK_FCT( fd_msg_send(pmsg, NULL, NULL) );
+		}
+		/* Otherwise, we have nothing to do at all, the answer will be forwarded upstream as part of the normal processing */
+	
+	}
+	
+	return 0;
+}
+
+/* Callback called on expiry of the timeout timer */
+static void rtbusy_expirecb(void * data, DiamId_t sentto, size_t senttolen, struct msg ** preq)
+{
+	CHECK_FCT_DO( rt_busy_process_busy(preq, 1, sentto, senttolen, NULL), /* continue */ );
+}
+
+/* the routing callback that handles all the tasks of this extension */
+static int rtbusy_fwd_cb(void * cbdata, struct msg ** pmsg)
+{
+	struct msg_hdr * hdr;
+	struct avp * avp;
+	union avp_value *a_rc = NULL, *a_oh = NULL;
+	DiamId_t sentto = NULL;
+	size_t senttolen;
+	
+	/* Get the header of the message */
+	CHECK_FCT( fd_msg_hdr(*pmsg, &hdr) );
+	
+	/* If the message is a request, we only associate the timeout */
+	if (hdr->msg_flags & CMD_FLAG_REQUEST) {
+		struct timespec expire;
+		CHECK_SYS(  clock_gettime(CLOCK_REALTIME, &expire)  );
+		expire.tv_sec += rtbusy_conf.RelayTimeout/1000 + ((expire.tv_nsec + (1000000LL * (rtbusy_conf.RelayTimeout % 1000))) / 1000000000LL);
+		expire.tv_nsec = (expire.tv_nsec + (1000000LL * (rtbusy_conf.RelayTimeout % 1000))) % 1000000000LL;
+		CHECK_FCT( fd_msg_anscb_associate( *pmsg, NULL, NULL, rtbusy_expirecb, &expire ) );
+		return 0;
+	}
+	
+	/* From this point, the message is an answer; we need to check if the E flag is set and if the Result-Code is DIAMETER_TOO_BUSY */
+	
+	if (!(hdr->msg_flags & CMD_FLAG_ERROR)) {
+		/* This answer does not have the E flag, no need to process further */
+		return 0;
+	}
+	
+	CHECK_FCT( fd_msg_source_get( *pmsg, &sentto, &senttolen ) );
+	
+	/* Now get the AVPs we are interested in */
+	CHECK_FCT(  fd_msg_browse(*pmsg, MSG_BRW_FIRST_CHILD, &avp, NULL)  );
+	while (avp) {
+		struct avp_hdr * ahdr;
+			
+		CHECK_FCT(  fd_msg_avp_hdr( avp, &ahdr )  );
+		if (! (ahdr->avp_flags & AVP_FLAG_VENDOR)) {
+			switch (ahdr->avp_code) {
+				case AC_ORIGIN_HOST:
+					/* Parse this AVP */
+					CHECK_FCT( fd_msg_parse_dict ( avp, fd_g_config->cnf_dict, NULL ) );
+					ASSERT( ahdr->avp_value );
+					a_oh = ahdr->avp_value;
+					break;
+					
+				case AC_RESULT_CODE:
+					/* Parse this AVP */
+					CHECK_FCT( fd_msg_parse_dict ( avp, fd_g_config->cnf_dict, NULL ) );
+					ASSERT( ahdr->avp_value );
+					a_rc = ahdr->avp_value;
+					
+					if (a_rc->u32 != ER_DIAMETER_TOO_BUSY) {
+						/* It is not a TOO_BUSY error, we don't do anything */
+						goto out;
+					}
+					break;
+			}
+			
+			if (a_rc && a_oh)
+				break;
+		}
+
+		/* Go to next AVP */
+		CHECK_FCT(  fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)  );
+	}
+	
+	/* Check we have received the necessary information */
+	if (!a_rc) {
+		TRACE_ERROR( "Invalid Diameter answer without a Result-Code AVP, rt_busypeer module gave up processing");
+		goto out;
+	}
+	
+	if (!a_oh) {
+		TRACE_ERROR( "Invalid Diameter answer without an Origin-Host AVP, rt_busypeer module gave up processing");
+		goto out;
+	}
+	
+	/* Pass this error to the function that processes BUSY status */
+	CHECK_FCT( rt_busy_process_busy(pmsg, 0, sentto, senttolen, a_oh) );
+	
+out:
+	return 0;
+}
+
+
+/* entry point */
+static int rtbusy_entry(char * conffile)
+{
+	enum fd_rt_fwd_dir dir = RT_FWD_ANS;
+	TRACE_ENTRY("%p", conffile);
+	
+	/* Initialize the configuration */
+	memset(&rtbusy_conf, 0, sizeof(rtbusy_conf));
+	
+	/* Parse the configuration file */
+	CHECK_FCT( rtbusy_conf_handle(conffile) );
+	
+	if (rtbusy_conf.SkipTooBusyErrors && !rtbusy_conf.RelayTimeout) {
+		TRACE_NOTICE("[rt_busypeers] Configuration file does not specify any behavior (no effect)!");
+		return 0;
+	}
+	
+	if (rtbusy_conf.SkipTooBusyErrors)
+		dir = RT_FWD_REQ; /* in this case, RelayTimeout is not 0 */
+	else if (rtbusy_conf.RelayTimeout)
+		dir = RT_FWD_ALL;
+	
+	/* Register the callback */
+	CHECK_FCT( fd_rt_fwd_register ( rtbusy_fwd_cb, NULL, dir, &rt_busy_hdl ) );
+	
+	/* We're done */
+	return 0;
+}
+
+/* Unload */
+void fd_ext_fini(void)
+{
+	TRACE_ENTRY();
+	
+	/* Unregister the cb */
+	if (rt_busy_hdl) 
+		CHECK_FCT_DO( fd_rt_fwd_unregister ( rt_busy_hdl, NULL), /* continue */);
+	
+	/* Done */
+	return ;
+}
+
+EXTENSION_ENTRY("rt_busypeers", rtbusy_entry);
