diff --git a/analyze/memcached_conn_scan.py b/analyze/memcached_conn_scan.py
index 196ca5e231def821b7f8e3e02f4bec5fca556d9d..c6ab6041fbf72a010cdaa6662c77fc62789b97ce 100644
--- a/analyze/memcached_conn_scan.py
+++ b/analyze/memcached_conn_scan.py
@@ -1,6 +1,7 @@
 import os
 import matplotlib.pyplot as plt
 from config import markers, colors
+import util
 
 experiments = [f for f in os.listdir('../data')
     if f.startswith('memcached_conn_scan') and len(os.listdir(os.path.join('../data', f))) > 0]
@@ -17,16 +18,23 @@ def parse_perf_stat(s):
     return llc_misses_u + llc_misses_k
 
 def extract_conn_qps_exp(exp):
-    ret = ([10, 20, 40, 80, 160, 240, 320], [], [])
+    ret = ([10, 20, 40, 80, 160, 240, 320], [], [], [], [])
 
     for f in ret[0]:
-        with open(os.path.join('../data/', exp, 'c%d.txt' % (f,)), 'r') as fi:
-            qps = parse_memcached_output(fi.read())
-            ret[1].append(qps)
-
-        with open(os.path.join('../data/', exp, 'stat_c%d.txt' % (f,)), 'r') as fi:
-            misses = parse_perf_stat(fi.read()) / (qps * 30)
-            ret[2].append(misses)
+        (qps_avg, qps_stddev) = util.extract_exp_avg_stddev(exp, 'c%d' % (f,), parse_memcached_output)
+        ret[1].append(qps_avg)
+        ret[2].append(qps_stddev)
+        
+        #with open(os.path.join('../data/', exp, 'c%d.txt' % (f,)), 'r') as fi:
+        #    qps = parse_memcached_output(fi.read())
+        #    ret[1].append(qps)
+
+        #with open(os.path.join('../data/', exp, 'stat_c%d.txt' % (f,)), 'r') as fi:
+        #    misses = parse_perf_stat(fi.read()) / (qps * 30)
+        #    ret[2].append(misses)
+        (misses_avg, misses_stddev) = util.extract_exp_avg_stddev(exp, 'stat_c%d' % (f,), parse_perf_stat)
+        ret[3].append(misses_avg / (qps_avg * 30))
+        ret[4].append(misses_stddev / (qps_avg * 30))
 
     return ret
 
@@ -63,10 +71,10 @@ def show_plot(threads, include_caladan = False):
         # but we half the QPS
         name = 'caladan'
         data[name] = extract_conn_qps_exp('memcached_conn_scan.5.4.0-136-generic.caladan.t2')
-        data[name] = (data[name][0], [qps / 2 for qps in data[name][1]], data[name][2])
+        data[name] = (data[name][0], [qps / 2 for qps in data[name][1]], [qps / 2 for qps in data[name][2]], data[name][3], data[name][4])
 
     for k in data:
-       plt.plot(data[k][0], data[k][1], label = k, marker = markers[k], color = colors[k])
+       plt.errorbar(data[k][0], data[k][1], yerr = data[k][2], capsize = 4, label = k, marker = markers[k], color = colors[k])
 
     plt.ticklabel_format(axis = 'both', style = 'sci', scilimits = (0, 4))
     plt.xlabel('Connections (per client w/ 7 * 8 clients)')
@@ -89,7 +97,7 @@ def show_plot(threads, include_caladan = False):
         plt.title('Memcached connections vs LLC misses, %d threads' % (threads,))
 
     for k in data:
-        plt.plot(data[k][0], data[k][2], label = k, marker = markers[k], color = colors[k])
+        plt.errorbar(data[k][0], data[k][3], yerr=data[k][4], capsize = 4, label = k, marker = markers[k], color = colors[k])
 
     plt.xlabel('Connections (per client w/ 7 * 8 clients)')
     plt.ylabel('LLC misses per request')