diff --git a/caladan.config b/caladan.config
new file mode 100644
index 0000000000000000000000000000000000000000..dec39571364ce2246f5e649604737fcf1906a192
--- /dev/null
+++ b/caladan.config
@@ -0,0 +1,7 @@
+# an example runtime config file
+host_addr 192.168.199.1
+host_netmask 255.255.255.0
+host_gateway 192.168.199.1
+runtime_kthreads {threads}
+runtime_guaranteed_kthreads {threads}
+runtime_priority lc
diff --git a/configs/base.sh b/configs/base.sh
index 9e1de6c1e0e3fb098ed7b2a88459674e615165a4..05a0da510e145f744b90861bb2288abd51f5b169 100644
--- a/configs/base.sh
+++ b/configs/base.sh
@@ -3,6 +3,7 @@ CPUPOWER=cpupower
 X86_ENERGY_PERF_POLICY=x86_energy_perf_policy
 PERF=perf
 FSTACK_SRC=/home/p5cai/workspace/f-stack
+CALADAN_SRC=/home/p5cai/workspace/caladan
 
 # Execute all SSH commands under this user
 # so that we don't need ssh keys for root
diff --git a/configs/memcached.sh b/configs/memcached.sh
index fdb8e0d6d20a9351dfa103c277c2b07fb167f2c9..0b84614725475ed03259db1cfb84fcc4aa4a9a10 100644
--- a/configs/memcached.sh
+++ b/configs/memcached.sh
@@ -1,2 +1,3 @@
 MEMCACHED=/home/p5cai/workspace/memcached/memcached
 MEMCACHED_FSTACK=/home/p5cai/workspace/memcached-fstack/memcached
+MEMCACHED_CALADAN=/home/p5cai/workspace/memcached-caladan/memcached
diff --git a/experiments/memcached.shared.sh b/experiments/memcached.shared.sh
index 56f30e816d67754bd3c14e66ced3fdf0184c661e..bff6da45f8b10ae356accf665ac654cf67a49591 100644
--- a/experiments/memcached.shared.sh
+++ b/experiments/memcached.shared.sh
@@ -25,7 +25,8 @@ cleanup_memcached() {
 
 start_memcached() {
     echo "Starting memcached"
-    taskset -c 0-$((THREADS - 1)) $MEMCACHED -u root -t $THREADS -b 16384 -c 32768 -m 10240 -o hashpower=24,no_lru_maintainer,no_lru_crawler $MEMCACHED_ARGS 2>&1 > /tmp/memcached.lastexp.log &
+    echo "taskset -c 0-$((THREADS - 1)) $MEMCACHED $MEMCACHED_ARGS -u root -t $THREADS -b 16384 -c 32768 -m 10240 -o hashpower=24,no_lru_maintainer,no_lru_crawler" 
+    taskset -c 0-$((THREADS - 1)) $MEMCACHED $MEMCACHED_ARGS -u root -t $THREADS -b 16384 -c 32768 -m 10240 -o hashpower=24,no_lru_maintainer,no_lru_crawler &
     MEMCACHED_PID=$!
 }
 
@@ -65,6 +66,10 @@ memcached_pre_start() {
 
     if [ "$FSTACK" == "true" ]; then
         MEMCACHED="$MEMCACHED_FSTACK"
+    elif [ "$CALADAN" == "true" ]; then
+        MEMCACHED="$MEMCACHED_CALADAN"
+        MEMCACHED_ARGS="$MEMCACHED_ARGS $CALADAN_CONFIG -p 11211"
+        REINIT_RUNS=9999 # Caladan does not support restarting the application process properly
     fi
 
     EXPERIMENT_NAME_EXT="t$THREADS.c$CONNS"
diff --git a/experiments/memcached_qps_scan.sh b/experiments/memcached_qps_scan.sh
index 5f16937e44a4f928ebf6a9bb8fec4fd2aafb9d74..511841fdf43190a53604436de6aeec031cb17847 100644
--- a/experiments/memcached_qps_scan.sh
+++ b/experiments/memcached_qps_scan.sh
@@ -6,6 +6,11 @@ QPS_STEP_PER_THREAD=5000
 
 pre_start() {
     memcached_pre_start
+
+    if [ "$CALADAN" == "true" ]; then
+        QPS_STEP_PER_THREAD=20000
+        QPS_END_PER_THREAD=330000
+    fi
 }
 
 run_exp() {
diff --git a/run.sh b/run.sh
index db897271f319194f87bb104f82e9e9b059242022..47c2facd387ad8630710e24980e9f59c60bcd8b7 100755
--- a/run.sh
+++ b/run.sh
@@ -41,6 +41,11 @@ while [[ $# -gt 0 ]]; do
             USERSTACK=true
             shift
             ;;
+        --caladan)
+            CALADAN=true
+            USERSTACK=true
+            shift
+            ;;
         *)
             echo "Unknown option $1"
             exit 1
@@ -80,6 +85,23 @@ if [ "$USERSTACK" == "true" ]; then
     mount -t hugetlbfs nodev /mnt/huge || true
 fi
 
+if [ "$CALADAN" == "true" ]; then
+    pkill iokerneld || true
+    pkill memcached || true
+    if [ "$THREADS" -le 1 ]; then
+        echo "Must allocate one thread for IOKernel"
+        exit 1
+    fi
+    CALADAN_CONFIG=/tmp/caladan.config
+    sed "s/{threads}/$((THREADS - 1))/g" ./caladan.config > $CALADAN_CONFIG
+    $CALADAN_SRC/scripts/setup_machine.sh || true
+    sleep 5
+    echo "Starting up Caladan iokernel"
+    $CALADAN_SRC/iokerneld simple noht &
+    CALADAN_PID=$!
+    sleep 5
+fi
+
 source "./experiments/$EXPERIMENT.sh"
 
 pre_start $@
@@ -91,6 +113,9 @@ fi
 if [ "$FSTACK" == "true" ]; then
     EXPERIMENT_NAME="$EXPERIMENT_NAME.fstack"
 fi
+if [ "$CALADAN" == "true" ]; then
+    EXPERIMENT_NAME="$EXPERIMENT_NAME.caladan"
+fi
 if [ ! -z "$EXPERIMENT_NAME_EXT" ]; then
     EXPERIMENT_NAME="$EXPERIMENT_NAME.$EXPERIMENT_NAME_EXT"
 fi
@@ -103,3 +128,7 @@ mkdir -p "$DATA_OUT"
 run_exp
 
 post_start
+
+if [ "$CALADAN" == "true" ]; then
+    kill -KILL "$CALADAN_PID"
+fi