diff --git a/jni/pjproject-android/.svn/pristine/d1/d1d9d4c3b55fcc55aedbd551ccf7ad4e099ef56f.svn-base b/jni/pjproject-android/.svn/pristine/d1/d1d9d4c3b55fcc55aedbd551ccf7ad4e099ef56f.svn-base
new file mode 100644
index 0000000..5797d93
--- /dev/null
+++ b/jni/pjproject-android/.svn/pristine/d1/d1d9d4c3b55fcc55aedbd551ccf7ad4e099ef56f.svn-base
@@ -0,0 +1,97 @@
+# $Id$
+import imp
+import sys
+import inc_sip as sip
+import inc_const as const
+import re
+from inc_cfg import *
+
+# Read configuration
+cfg_file = imp.load_source("cfg_file", ARGS[1])
+
+# Default server port (should we randomize?)
+srv_port = 50070
+
+def test_func(test):
+	pjsua = test.process[0]
+	dlg = sip.Dialog("127.0.0.1", pjsua.inst_param.sip_port, 
+			 local_port=srv_port, 
+			 tcp=cfg_file.recvfrom_cfg.tcp)
+
+	last_cseq = 0
+	last_method = ""
+	last_call_id = ""
+	for t in cfg_file.recvfrom_cfg.transaction:
+		# Print transaction title
+		if t.title != "":
+			dlg.trace(t.title)
+		# Run command and expect patterns
+		for c in t.cmds:
+			if c[0] and c[0] != "":
+				pjsua.send(c[0])
+			if len(c)>1 and c[1] and c[1] != "":
+				pjsua.expect(c[1])
+		# Wait for request
+		if t.check_cseq:
+			# Absorbs retransmissions
+			cseq = 0
+			method = last_method
+			call_id = last_call_id
+			while cseq <= last_cseq and method == last_method and call_id == last_call_id:
+				request, src_addr = dlg.wait_msg_from(30)
+				if request==None or request=="":
+					raise TestError("Timeout waiting for request")
+				method = request.split(" ", 1)[0]
+				cseq_hval = sip.get_header(request, "CSeq")
+				cseq_hval = cseq_hval.split(" ")[0]
+				cseq = int(cseq_hval)
+				call_id = sip.get_header(request, "Call-ID")
+			last_cseq = cseq
+			last_method = method
+		else:
+			request, src_addr = dlg.wait_msg_from(30)
+			if request==None or request=="":
+				raise TestError("Timeout waiting for request")
+
+		# Check for include patterns
+		for pat in t.include:
+			if re.search(pat, request, re.M | re.I)==None:
+				if t.title:
+					tname = " in " + t.title + " transaction"
+				else:
+					tname = ""
+				raise TestError("Pattern " + pat + " not found" + tname)
+		# Check for exclude patterns
+		for pat in t.exclude:
+			if re.search(pat, request, re.M | re.I)!=None:
+				if t.title:
+					tname = " in " + t.title + " transaction"
+				else:
+					tname = ""
+				raise TestError("Excluded pattern " + pat + " found" + tname)
+		# Create response
+		if t.resp_code!=0:
+			response = dlg.create_response(request, t.resp_code, "Status reason")
+			# Add headers to response
+			for h in t.resp_hdr:
+				response = response + h + "\r\n"
+			# Add message body if required
+			if t.body:
+				response = response + t.body
+			# Send response
+			dlg.send_msg(response, src_addr)
+
+		# Expect something to happen in pjsua
+		if t.expect != "":
+			pjsua.expect(t.expect)
+		# Sync
+		pjsua.sync_stdout()
+
+# Replace "$PORT" with server port in pjsua args
+cfg_file.recvfrom_cfg.inst_param.arg = cfg_file.recvfrom_cfg.inst_param.arg.replace("$PORT", str(srv_port))
+
+# Here where it all comes together
+test = TestParam(cfg_file.recvfrom_cfg.name, 
+		 [cfg_file.recvfrom_cfg.inst_param], 
+		 test_func)
+
