diff --git a/CMakeLists.txt b/CMakeLists.txt
index 544b50a275a81d586d14c2bd48c299dd4416b376..e4180625fa8080f7a099a60a444c09ebf5c585f0 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,6 +28,9 @@ SET(PROJECT_NAME hpp-rbprm-corba)
 SET(PROJECT_DESCRIPTION "Corba server for reachability based planning")
 SET(PROJECT_URL "")
 
+# Set to 1 for profiling
+#~ add_definitions(-DPROFILE)
+
 SET(CUSTOM_HEADER_DIR hpp/corbaserver/rbprm)
 
 SETUP_PROJECT ()
diff --git a/profile/profile.py b/profile/profile.py
index df5678797d7a3309f86d4e28191b47cca6c9eb4c..89f98794eb5c2f6c03dd04f88fca5209ae38c099 100644
--- a/profile/profile.py
+++ b/profile/profile.py
@@ -2,58 +2,71 @@
 
 import subprocess as sp
 import os
+import datetime
 
-scenarios = ['stair_bauzil_hrp2']#,'standing_hrp2','darpa_hrp2']
-n_trials = 3
+scenarios = ['standing_hrp2']#'stair_bauzil_hrp2','standing_hrp2','darpa_hrp2']
+n_trials = 10
 
+stats = ['balance','collision','ik']
 
 python_script_extension = "_interp.py"
 analysis = {}
 lower = -100000
 higher = 100000000
 
-#~ 
-#~ *** PROFILING RESULTS [ms] (min - avg - max - lastTime - nSamples) ***
-#~ complete generation                     5110.09	5110.09	5110.09	5110.09	1
-#~ test balance                            0.09	0.22	0.60	0.54	1199
-#~ contact: 20
-#~ no contact: 8
-#~ planner succeeded: 1
-#~ unstable contact: 2
-#~ path computation 0.81
-#~ 
-#~ *** PROFILING RESULTS [ms] (min - avg - max - lastTime - nSamples) ***
-#~ complete generation                     7162.32	7162.32	7162.32	7162.32	1
-#~ test balance                            0.09	0.20	0.63	0.50	1431
-#~ contact: 21
-#~ no contact: 11
-#~ planner failed: 1
-#~ unstable contact: 3
-
 def avg(l):
+	if(len(l) == 0):
+		return -1
 	return reduce(lambda x, y: x + y, l) / len(l)
 
 
+def initdata(name, data):
+	n = name
+	data[n+'_min'] = higher
+	data[n+'_max'] = lower
+	data[n] = []
+	data['total_'+n+'_min'] = higher
+	data['total_'+n+'_max'] = lower
+	data['total_'+n] = []
+	data['minnum'+n] = higher
+	data['maxnum'+n] = lower
+	data['num'+n] = []
+
+def parseLine(sep, name, line, data):
+	if sep == 1:
+		_1, _min, _avg, _max, _totaltime, _numiter = line.split()
+	elif sep ==2:
+		_1, _2, _min, _avg, _max, _totaltime, _numiter = line.split()
+	data[name+'_min'] = min(data[name+'_min'],float(_min))
+	data[name+'_max'] = max(data[name+'_max'],float(_max))
+	data['minnum'+name] = min(data['minnum'+name],float(_numiter))
+	data['maxnum'+name] = max(data['maxnum'+name],float(_numiter))		
+	data['num'+name].append(float(_numiter))
+	for i in range(0,int(_numiter)):				
+		data[name].append(float(_avg))
+	total_time = float(_totaltime)
+	data['total_'+name+'_min'] = min(data['total_'+name+'_min'],total_time)
+	data['total_'+name+'_max'] = max(data['total_'+name+'_max'],total_time)
+	data['total_'+name].append(total_time)
+	
 def parseData(scenario):
 	filename = scenario+"_log.txt";
-	#~ os.rename("log.txt", filename)
+	os.rename("log.txt", filename)
 	analysis[scenario] = {}
 	data = analysis[scenario]
 	data['no contact'] = 0
 	data['contact'] = 0	
 	data['unstable contact'] = 0	
-	data['balance_min'] = higher
-	data['balance_max'] = lower
-	data['balance'] = []
-	data['minnumbalance'] = higher
-	data['maxnumbalance'] = lower
-	data['numbalance'] = []
 	data['mingen_time'] = higher
 	data['maxgen_time'] = lower
 	data['gen_time'] = []
 	data['failed'] = 0
 	data['success'] = 0
 	data['path_time'] = []
+	data['min_path_time'] = higher
+	data['max_path_time'] = lower
+	for stat in stats:
+		initdata(stat, data)	
 	file = open(filename,"r+");
 	for line in file.readlines():
 		if not (line.find('complete generation') == -1):
@@ -62,15 +75,11 @@ def parseData(scenario):
 			data['maxgen_time'] = max(data['maxgen_time'],float(time))
 			data['gen_time'].append(time);
 		elif not (line.find('test balance') == -1):
-			print line.split()
-			_1, _2, _min, _avg, _max, _last, _numiter = line.split()
-			data['balance_min'] = min(data['balance_min'],float(_min))
-			data['balance_max'] = max(data['balance_max'],float(_max))
-			data['minnumbalance'] = min(data['minnumbalance'],float(_numiter))
-			data['maxnumbalance'] = max(data['maxnumbalance'],float(_numiter))		
-			data['numbalance'].append(float(_numiter))
-			for i in range(0,1): #int(_numiter)):				
-				data['balance'].append(float(_avg))
+			parseLine(2, 'balance', line, data)
+		elif not (line.find('collision') == -1):
+			parseLine(1, 'collision', line, data)
+		elif not (line.find('ik') == -1):
+			parseLine(1, 'ik', line, data)
 		elif not (line.find('no contact:') == -1):
 			data['no contact'] = data['no contact'] + float(line.rstrip("\n").split()[2]);
 		elif not (line.find('unstable contact:') == -1):
@@ -82,23 +91,60 @@ def parseData(scenario):
 		elif not (line.find('planner succeeded') == -1):
 			data['success'] = data['success'] + 1;		
 		elif not (line.find('path computation') == -1):
-			data['path_time'].append(float(line.rstrip("\n").split()[2]));
+			time = float(line.rstrip("\n").split()[2])
+			data['path_time'].append(time);
+			data['min_path_time'] = min(data['min_path_time'],time)
+			data['max_path_time'] = max(data['max_path_time'],time)
+
 
+def printOneStat(f, name, data, g_time, tTime):
+	n = name
+	d = data
+	print(n, len(d[n]))
+	d[n] = avg(d[n])
+	d['num'+n] = avg(d['num'+n])
+	d['total_'+n] = avg(d['total_'+n])
+	f.write (n +" tests: \n")
+	f.write ("\t single operation time (min / avg / max):\n \t " + str(d[n+'_min']) +  "\t" + str(d[n]) + "\t" + str(d[n+'_max']) + "\t \n")
+	f.write ("\t total time (min / avg / max / % of total / % of total wtht path planning):\n \t " + str(d['total_'+n+'_min']) +  "\t" + str(d['total_'+n]) + "\t" + str(d['total_'+n+'_max']) + "\t" +  str(float(d['total_'+n]) / tTime * 100) + "%" + "\t" +  str(float(d['total_'+n]) / g_time * 100) + "%\n")
+	f.write ("\t number of tests (min / avg / max):\n \t " + str(d['minnum'+n]) +  "\t" + str(d['num'+n]) + "\t" + str(d['maxnum'+n]) + "\n")
+		
+		
 def analyzeData():
+	f = open("log_"+str(datetime.datetime.now())+".txt","w+")
+		
 	for scenario in scenarios:
-		data = analysis[scenario]
-		data['balance'] = avg(data['balance'])
-		data['numbalance'] = avg(data['numbalance'])
-		data['path_time'] = avg(data['path_time'])
-		data['gen_time'] = avg(data['gen_time'])
-	print(analysis)
+		d = analysis[scenario]
+		d['path_time'] = avg(d['path_time'])
+		d['gen_time'] = avg(d['gen_time'])
+		g_time = d['gen_time']
+		tTime = d['gen_time'] + d['path_time']
+		f.write (scenario +":\n")
+		
+		f.write ("total computation time (min / avg / max): " + str(d['mingen_time'] + d['min_path_time']) + "\t" + str(tTime) + "\t" + str(d['maxgen_time'] + d['max_path_time']) + "\n")
+		
+		f.write ("generation time (without RRT) (min / avg / max / % of total):\n \t " + str(d['mingen_time']) + "\t" + str(d['gen_time']) + "\t" + str(d['maxgen_time']) + "\t"+ str(float(d['gen_time']) / tTime * 100) + "%\n")
+		
+		f.write ("path computation: \n")
+		f.write ("\t time (min / avg / max / % of total):\n \t " + str(d['min_path_time']) +  "\t" + str(d['path_time']) + "\t" + str(d['max_path_time']) + "\t" +  str(float(d['path_time']) / tTime * 100) + "%\n")
+		
+		for stat in stats:
+			printOneStat(f, stat, d, g_time, tTime)
+			
+		f.write ("number of successes / failures / ratio: " + str(d['success']) + "\t" + str(d['failed']) + "\t" + str(float(d['success']) / float(d['success']) * 100)  + "%\n")
+		
+		nc = float(d['no contact'])
+		c = float(d['contact'])
+		uc = float(d['unstable contact'])
+		tc = nc + c + uc 
+		f.write ("% of failed contact generation (no candidates found): " + str(nc / tc * 100)  + "%\n")
+		f.write ("% of unstable contact generation (no balanced candidates found): " + str(uc / tc * 100)  + "%\n")
+		f.write ("\n \n \n")
+	f.close()
 	
 for scenario in scenarios:
 	for i in range(0,n_trials):
 		var = scenario+python_script_extension;
-		#~ print(var);
-		#~ sp.check_call(["./profile.sh", str(var)]);
-	# move log
+		sp.check_call(["./profile.sh", str(var)]);
 	parseData(scenario)
 	analyzeData()
-	#~ os.rename("logpath.txt", scenario+"_log_path.txt")
diff --git a/script/scenarios/run.sh b/script/scenarios/run.sh
new file mode 100755
index 0000000000000000000000000000000000000000..288a6141e22288d58b8c1b3e84180449dd2d111d
--- /dev/null
+++ b/script/scenarios/run.sh
@@ -0,0 +1,8 @@
+#!/bin/bash         
+
+gepetto-viewer-server & 
+hpp-rbprm-server &
+ipython -i ./$1
+
+pkill -f  'gepetto-viewer-server'
+pkill -f  'hpp-rbprm-server'
diff --git a/script/scenarios/rund.sh b/script/scenarios/rund.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a8534fde0d7615e17af169035664706b333e9842
--- /dev/null
+++ b/script/scenarios/rund.sh
@@ -0,0 +1,6 @@
+#!/bin/bash         
+
+gepetto-viewer-server & 
+ipython -i ./$1
+
+pkill -f  'gepetto-viewer-server'