Index: pjproject/trunk/pjsip-apps/build/Samples-vc.mak
===================================================================
--- pjproject/trunk/pjsip-apps/build/Samples-vc.mak	(revision 447)
+++ pjproject/trunk/pjsip-apps/build/Samples-vc.mak	(revision 448)
@@ -36,8 +36,14 @@
 
 
-SAMPLES = $(BINDIR)\simpleua.exe $(BINDIR)\playfile.exe $(BINDIR)\playsine.exe\
-	  $(BINDIR)\confsample.exe $(BINDIR)\sndinfo.exe \
-	  $(BINDIR)\level.exe $(BINDIR)\recfile.exe  \
-	  $(BINDIR)\resampleplay.exe $(BINDIR)\siprtp.exe \
+SAMPLES = $(BINDIR)\confsample.exe \
+	  $(BINDIR)\level.exe \
+	  $(BINDIR)\playfile.exe \
+	  $(BINDIR)\playsine.exe\
+	  $(BINDIR)\recfile.exe  \
+	  $(BINDIR)\resampleplay.exe \
+	  $(BINDIR)\simpleua.exe \
+	  $(BINDIR)\siprtp.exe \
+	  $(BINDIR)\sipstateless.exe \
+	  $(BINDIR)\sndinfo.exe \
 	  $(BINDIR)\streamutil.exe
 
Index: pjproject/trunk/pjsip-apps/build/Samples.mak
===================================================================
--- pjproject/trunk/pjsip-apps/build/Samples.mak	(revision 447)
+++ pjproject/trunk/pjsip-apps/build/Samples.mak	(revision 448)
@@ -39,6 +39,15 @@
 BINDIR := ../bin/samples
 
-SAMPLES := simpleua playfile playsine confsample sndinfo level recfile resampleplay \
-	   siprtp streamutil
+SAMPLES := confsample \
+	   level \
+	   playfile \
+	   playsine \
+	   recfile \
+	   resampleplay \
+	   simpleua \
+	   siprtp \
+	   sipstateless \
+	   sndinfo \
+	   streamutil
 
 EXES := $(foreach file, $(SAMPLES), $(BINDIR)/$(file)-$(TARGET)$(HOST_EXE))
Index: pjproject/trunk/pjsip-apps/build/samples.dsp
===================================================================
--- pjproject/trunk/pjsip-apps/build/samples.dsp	(revision 447)
+++ pjproject/trunk/pjsip-apps/build/samples.dsp	(revision 448)
@@ -123,4 +123,8 @@
 # Begin Source File
 
+SOURCE=..\src\samples\sipstateless.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\src\samples\sndinfo.c
 # End Source File
Index: pjproject/trunk/pjsip-apps/src/samples/sipstateless.c
===================================================================
--- pjproject/trunk/pjsip-apps/src/samples/sipstateless.c	(revision 448)
+++ pjproject/trunk/pjsip-apps/src/samples/sipstateless.c	(revision 448)
@@ -0,0 +1,157 @@
+/* $Id$ */
+/* 
+ * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
+ */
+
+/**
+ * sipcore.c
+ *
+ * This program is only used to measure the footprint of the SIP core.
+ * When UDP transport is included (with HAS_UDP_TRANSPORT macro), the
+ * executable will respond any incoming requests with 501 (Not Implemented)
+ * response statelessly.
+ */
+
+
+/* Include all headers. */
+#include <pjsip.h>
+#include <pjlib-util.h>
+#include <pjlib.h>
+
+
+/* If this macro is set, UDP transport will be initialized at port 5060 */
+#define HAS_UDP_TRANSPORT
+
+
+/* Log identification */
+#define THIS_FILE	"sipstateless.c"
+
+
+/* Global SIP endpoint */
+static pjsip_endpoint *sip_endpt;
+
+
+/* Callback to handle incoming requests. */
+static pj_bool_t on_rx_request( pjsip_rx_data *rdata )
+{
+    /* Respond (statelessly) all incoming requests (except ACK!) 
+     * with 501 (Not Implemented)
+     */
+    if (rdata->msg_info.msg->line.req.method.id != PJSIP_ACK_METHOD) {
+	pjsip_endpt_respond_stateless( sip_endpt, rdata, 
+				       PJSIP_SC_NOT_IMPLEMENTED, NULL,
+				       NULL, NULL);
+    }
+    return PJ_TRUE;
+}
+
+
+
+/*
+ * main()
+ *
+ */
+int main()
+{
+    pj_caching_pool cp;
+    pjsip_module mod_app =
+    {
+	NULL, NULL,		    /* prev, next.		*/
+	{ "mod-app", 7 },	    /* Name.			*/
+	-1,				    /* Id		*/
+	PJSIP_MOD_PRIORITY_APPLICATION, /* Priority		*/
+	NULL,			    /* load()			*/
+	NULL,			    /* start()			*/
+	NULL,			    /* stop()			*/
+	NULL,			    /* unload()			*/
+	&on_rx_request,		    /* on_rx_request()		*/
+	NULL,			    /* on_rx_response()		*/
+	NULL,			    /* on_tx_request.		*/
+	NULL,			    /* on_tx_response()		*/
+	NULL,			    /* on_tsx_state()		*/
+    };
+
+
+    pj_status_t status;
+    
+    /* Must init PJLIB first: */
+    status = pj_init();
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+
+    /* Then init PJLIB-UTIL: */
+    status = pjlib_util_init();
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+    /* Must create a pool factory before we can allocate any memory. */
+    pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);
+
+
+    /* Create global endpoint: */
+    {
+	const pj_str_t *hostname;
+	const char *endpt_name;
+
+	/* Endpoint MUST be assigned a globally unique name.
+	 * The name will be used as the hostname in Warning header.
+	 */
+
+	/* For this implementation, we'll use hostname for simplicity */
+	hostname = pj_gethostname();
+	endpt_name = hostname->ptr;
+
+	/* Create the endpoint: */
+
+	status = pjsip_endpt_create(&cp.factory, endpt_name, 
+				    &sip_endpt);
+	PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+    }
+
+    /* 
+     * Add UDP transport, with hard-coded port 
+     */
+#ifdef HAS_UDP_TRANSPORT
+    {
+	pj_sockaddr_in addr;
+
+	addr.sin_family = PJ_AF_INET;
+	addr.sin_addr.s_addr = 0;
+	addr.sin_port = pj_htons(5060);
+
+	status = pjsip_udp_transport_start( sip_endpt, &addr, NULL, 1, NULL);
+	if (status != PJ_SUCCESS) {
+	    PJ_LOG(3,(THIS_FILE, 
+		      "Error starting UDP transport (port in use?)"));
+	    return 1;
+	}
+    }
+#endif
+
+    /*
+     * Register our module to receive incoming requests.
+     */
+    status = pjsip_endpt_register_module( sip_endpt, &mod_app);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+
+    /* Done. Loop forever to handle incoming events. */
+    PJ_LOG(3,(THIS_FILE, "Press Ctrl-C to quit.."));
+
+    for (;;) {
+	pjsip_endpt_handle_events(sip_endpt, NULL);
+    }
+}
Index: pjproject/trunk/pjsip-apps/src/samples/streamutil.c
===================================================================
--- pjproject/trunk/pjsip-apps/src/samples/streamutil.c	(revision 447)
+++ pjproject/trunk/pjsip-apps/src/samples/streamutil.c	(revision 448)
@@ -75,15 +75,23 @@
     pj_status_t status;
 
+#if defined(PJMEDIA_HAS_G711_CODEC) && PJMEDIA_HAS_G711_CODEC!=0
     status = pjmedia_codec_g711_init(med_endpt);
     PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
-
+#endif
+
+#if defined(PJMEDIA_HAS_GSM_CODEC) && PJMEDIA_HAS_GSM_CODEC!=0
     status = pjmedia_codec_gsm_init(med_endpt);
     PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
-
+#endif
+
+#if defined(PJMEDIA_HAS_SPEEX_CODEC) && PJMEDIA_HAS_SPEEX_CODEC!=0
     status = pjmedia_codec_speex_init(med_endpt, 0, -1, -1);
     PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
-
+#endif
+
+#if defined(PJMEDIA_HAS_L16_CODEC) && PJMEDIA_HAS_L16_CODEC!=0
     status = pjmedia_codec_l16_init(med_endpt, 0);
     PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
+#endif
 
     return PJ_SUCCESS;
Index: pjproject/trunk/pjsip/src/pjsip/sip_endpoint.c
===================================================================
--- pjproject/trunk/pjsip/src/pjsip/sip_endpoint.c	(revision 447)
+++ pjproject/trunk/pjsip/src/pjsip/sip_endpoint.c	(revision 448)
@@ -104,7 +104,4 @@
 pj_status_t pjsip_tel_uri_subsys_init(void);
 
-/* Defined in sip_util_statefull.c */
-extern pjsip_module mod_stateful_util;
-
 
 /* Specifies whether error subsystem has been registered to pjlib. */
@@ -487,8 +484,4 @@
     pj_list_init(&endpt->cap_hdr);
 
-    /* Register mod_stateful_util module (sip_util_statefull.c) */
-    status = pjsip_endpt_register_module(endpt, &mod_stateful_util);
-    if (status != PJ_SUCCESS)
-	goto on_error;
 
     /* Done. */
Index: pjproject/trunk/pjsip/src/pjsip/sip_transaction.c
===================================================================
--- pjproject/trunk/pjsip/src/pjsip/sip_transaction.c	(revision 447)
+++ pjproject/trunk/pjsip/src/pjsip/sip_transaction.c	(revision 448)
@@ -38,4 +38,8 @@
 #define TSX_TRACE_(expr)
 #endif
+
+
+/* Defined in sip_util_statefull.c */
+extern pjsip_module mod_stateful_util;
 
 
@@ -466,4 +470,10 @@
     }
 
+    /* Register mod_stateful_util module (sip_util_statefull.c) */
+    status = pjsip_endpt_register_module(endpt, &mod_stateful_util);
+    if (status != PJ_SUCCESS) {
+	return status;
+    }
+
     return PJ_SUCCESS;
 }
Index: pjproject/trunk/pjsip/src/pjsip/sip_util.c
===================================================================
--- pjproject/trunk/pjsip/src/pjsip/sip_util.c	(revision 447)
+++ pjproject/trunk/pjsip/src/pjsip/sip_util.c	(revision 448)
@@ -1258,71 +1258,4 @@
 
 /*
- * Send response statefully.
- */
-PJ_DEF(pj_status_t) pjsip_endpt_respond(  pjsip_endpoint *endpt,
-					  pjsip_module *tsx_user,
-					  pjsip_rx_data *rdata,
-					  int st_code,
-					  const pj_str_t *st_text,
-					  const pjsip_hdr *hdr_list,
-					  const pjsip_msg_body *body,
-					  pjsip_transaction **p_tsx )
-{
-    pj_status_t status;
-    pjsip_tx_data *tdata;
-    pjsip_transaction *tsx;
-
-    /* Validate arguments. */
-    PJ_ASSERT_RETURN(endpt && rdata, PJ_EINVAL);
-
-    if (p_tsx) *p_tsx = NULL;
-
-    /* Create response message */
-    status = pjsip_endpt_create_response( endpt, rdata, st_code, st_text, 
-					  &tdata);
-    if (status != PJ_SUCCESS)
-	return status;
-
-    /* Add the message headers, if any */
-    if (hdr_list) {
-	const pjsip_hdr *hdr = hdr_list->next;
-	while (hdr != hdr_list) {
-	    pjsip_msg_add_hdr( tdata->msg, pjsip_hdr_clone(tdata->pool, hdr) );
-	    hdr = hdr->next;
-	}
-    }
-
-    /* Add the message body, if any. */
-    if (body) {
-	tdata->msg->body = pjsip_msg_body_clone( tdata->pool, body );
-	if (tdata->msg->body == NULL) {
-	    pjsip_tx_data_dec_ref(tdata);
-	    return status;
-	}
-    }
-
-    /* Create UAS transaction. */
-    status = pjsip_tsx_create_uas(tsx_user, rdata, &tsx);
-    if (status != PJ_SUCCESS) {
-	pjsip_tx_data_dec_ref(tdata);
-	return status;
-    }
-
-    /* Feed the request to the transaction. */
-    pjsip_tsx_recv_msg(tsx, rdata);
-
-    /* Send the message. */
-    status = pjsip_tsx_send_msg(tsx, tdata);
-    if (status != PJ_SUCCESS) {
-	pjsip_tx_data_dec_ref(tdata);
-    } else if (p_tsx) {
-	*p_tsx = tsx;
-    }
-
-    return status;
-}
-
-
-/*
  * Get the event string from the event ID.
  */
Index: pjproject/trunk/pjsip/src/pjsip/sip_util_statefull.c
===================================================================
--- pjproject/trunk/pjsip/src/pjsip/sip_util_statefull.c	(revision 447)
+++ pjproject/trunk/pjsip/src/pjsip/sip_util_statefull.c	(revision 448)
@@ -90,4 +90,8 @@
     PJ_ASSERT_RETURN(endpt && tdata && (timeout==-1 || timeout>0), PJ_EINVAL);
 
+    /* Check that transaction layer module is registered to endpoint */
+    PJ_ASSERT_RETURN(mod_stateful_util.id != -1, PJ_EINVALIDOP);
+
+
     status = pjsip_tsx_create_uac(&mod_stateful_util, tdata, &tsx);
     if (status != PJ_SUCCESS) {
@@ -106,2 +110,70 @@
 }
 
+
+/*
+ * Send response statefully.
+ */
+PJ_DEF(pj_status_t) pjsip_endpt_respond(  pjsip_endpoint *endpt,
+					  pjsip_module *tsx_user,
+					  pjsip_rx_data *rdata,
+					  int st_code,
+					  const pj_str_t *st_text,
+					  const pjsip_hdr *hdr_list,
+					  const pjsip_msg_body *body,
+					  pjsip_transaction **p_tsx )
+{
+    pj_status_t status;
+    pjsip_tx_data *tdata;
+    pjsip_transaction *tsx;
+
+    /* Validate arguments. */
+    PJ_ASSERT_RETURN(endpt && rdata, PJ_EINVAL);
+
+    if (p_tsx) *p_tsx = NULL;
+
+    /* Create response message */
+    status = pjsip_endpt_create_response( endpt, rdata, st_code, st_text, 
+					  &tdata);
+    if (status != PJ_SUCCESS)
+	return status;
+
+    /* Add the message headers, if any */
+    if (hdr_list) {
+	const pjsip_hdr *hdr = hdr_list->next;
+	while (hdr != hdr_list) {
+	    pjsip_msg_add_hdr( tdata->msg, pjsip_hdr_clone(tdata->pool, hdr) );
+	    hdr = hdr->next;
+	}
+    }
+
+    /* Add the message body, if any. */
+    if (body) {
+	tdata->msg->body = pjsip_msg_body_clone( tdata->pool, body );
+	if (tdata->msg->body == NULL) {
+	    pjsip_tx_data_dec_ref(tdata);
+	    return status;
+	}
+    }
+
+    /* Create UAS transaction. */
+    status = pjsip_tsx_create_uas(tsx_user, rdata, &tsx);
+    if (status != PJ_SUCCESS) {
+	pjsip_tx_data_dec_ref(tdata);
+	return status;
+    }
+
+    /* Feed the request to the transaction. */
+    pjsip_tsx_recv_msg(tsx, rdata);
+
+    /* Send the message. */
+    status = pjsip_tsx_send_msg(tsx, tdata);
+    if (status != PJ_SUCCESS) {
+	pjsip_tx_data_dec_ref(tdata);
+    } else if (p_tsx) {
+	*p_tsx = tsx;
+    }
+
+    return status;
+}
+
+
