diff --git a/onos.sh b/onos.sh
new file mode 100755
index 0000000..775ea06
--- /dev/null
+++ b/onos.sh
@@ -0,0 +1,441 @@
+#!/bin/bash
+# Set paths
+
+ONOS_HOME=`dirname $0`
+LOGDIR=${ONOS_LOGDIR:-${ONOS_HOME}/onos-logs}
+
+ZK_DIR=${HOME}/zookeeper-3.4.5
+#ZK_CONF=${ONOS_HOME}/conf/zoo.cfg
+ZOO_LOG_DIR=${ONOS_HOME}/onos-logs
+
+RAMCLOUD_DIR=${HOME}/ramcloud
+RAMCLOUD_HOME=${RAMCLOUD_HOME:-~/ramcloud}
+RAMCLOUD_COORD_LOG=${LOGDIR}/ramcloud.coordinator.`hostname`.log
+RAMCLOUD_SERVER_LOG=${LOGDIR}/ramcloud.server.`hostname`.log
+coordinatorip=`grep coordinatorIp ${ONOS_HOME}/conf/ramcloud.conf | cut -d "=" -f 2,3`
+coordinatorport=`grep coordinatorPort ${ONOS_HOME}/conf/ramcloud.conf | cut -d "=" -f 2,3`
+serverip=`grep serverIp ${ONOS_HOME}/conf/ramcloud.conf | cut -d "=" -f 2,3`
+serverport=`grep serverPort ${ONOS_HOME}/conf/ramcloud.conf | cut -d "=" -f 2,3`
+RAMCLOUD_COORDINATOR=`echo $coordinatorip","$coordinatorport`
+RAMCLOUD_SERVER=`echo $serverip","$serverport`
+RAMCLOUD_BRANCH=${RAMCLOUD_BRANCH:-master}
+
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${ONOS_HOME}/lib:${RAMCLOUD_HOME}/obj.${RAMCLOUD_BRANCH}
+
+## Because the script change dir to $ONOS_HOME, we can set ONOS_LOGBACK and LOGDIR relative to $ONOS_HOME
+ONOS_LOGBACK=${ONOS_LOGBACK:-${ONOS_HOME}/conf/logback.`hostname`.xml}
+ONOS_LOGBACK_TEMPLATE=${ONOS_HOME}/conf/logback.xml.template
+LOGDIR=${ONOS_LOGDIR:-${ONOS_HOME}/onos-logs}
+LOGBASE=${ONOS_LOGBASE:-onos.`hostname`}
+ONOS_LOG="${LOGDIR}/${LOGBASE}.log"
+PCAP_LOG="${LOGDIR}/${LOGBASE}.pcap"
+LOGS="$ONOS_LOG $PCAP_LOG"
+
+ONOS_PROPS=${ONOS_PROPS:-${ONOS_HOME}/conf/onos.properties}
+JMX_PORT=${JMX_PORT:-7189}
+
+# Set JVM options
+JVM_OPTS="${JVM_OPTS:-}"
+## If you want JaCoCo Code Coverage reports... uncomment line below
+#JVM_OPTS="$JVM_OPTS -javaagent:${ONOS_HOME}/lib/jacocoagent.jar=dumponexit=true,output=file,destfile=${LOGDIR}/jacoco.exec"
+JVM_OPTS="$JVM_OPTS -server -d64"
+#JVM_OPTS="$JVM_OPTS -XX:+TieredCompilation -XX:InitialCodeCacheSize=512m -XX:ReservedCodeCacheSize=512m"
+JVM_OPTS="$JVM_OPTS -Xmx4g -Xms4g -Xmn800m"
+#JVM_OPTS="$JVM_OPTS -Xmx2g -Xms2g -Xmn800m"
+#JVM_OPTS="$JVM_OPTS -Xmx1g -Xms1g -Xmn800m"
+#JVM_OPTS="$JVM_OPTS -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods"
+JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC -XX:+UseAdaptiveSizePolicy -XX:+AggressiveOpts -XX:+UseFastAccessorMethods"
+JVM_OPTS="$JVM_OPTS -XX:MaxInlineSize=8192 -XX:FreqInlineSize=8192"
+JVM_OPTS="$JVM_OPTS -XX:CompileThreshold=1500 -XX:PreBlockSpin=8"
+JVM_OPTS="$JVM_OPTS -XX:OnError=crash-logger" ;# For dumping core
+#JVM_OPTS="$JVM_OPTS -Dpython.security.respectJavaAccessibility=false"
+JVM_OPTS="$JVM_OPTS -XX:CompileThreshold=1500 -XX:PreBlockSpin=8 \
+		-XX:+UseThreadPriorities \
+		-XX:ThreadPriorityPolicy=42 \
+		-XX:+UseCompressedOops \
+		-Dcom.sun.management.jmxremote.port=$JMX_PORT \
+		-Dcom.sun.management.jmxremote.ssl=false \
+                -Dbenchmark.measureBP=0 \
+                -Dbenchmark.measureRc=0 \
+                -Dbenchmark.measureONOS=0 \
+		-Dcom.sun.management.jmxremote.authenticate=false"
+JVM_OPTS="$JVM_OPTS -Dhazelcast.logging.type=slf4j"
+
+# Set ONOS core main class
+MAIN_CLASS="net.onrc.onos.ofcontroller.core.Main"
+
+MVN=${MVN:-mvn -o}
+
+function usage {
+  echo "Usage"
+  echo "  $0 start {single-node|coord-node|server-node}"
+  echo "            single-node: start ONOS with RAMCloud coordinator/server"
+  echo "            coord-node : start ONOS with RAMCloud coordinator"
+  echo "            server-node: start ONOS with RAMCloud server"
+  echo "  $0 stop"
+  echo "  $0 restart"
+  echo "  $0 status"
+  echo "  $0 {zk|rc-coord|rc-server|core} {start|stop|restart|status}"
+}
+
+function rotate-log {
+    local logfile=$1
+    local nr_max=${2:-10}
+    if [ -f $logfile ]; then
+	for i in `seq $(expr $nr_max - 1) -1 1`; do
+	    if [ -f ${logfile}.${i} ]; then
+		mv -f ${logfile}.${i} ${logfile}.`expr $i + 1`
+	    fi
+	done
+	mv $logfile $logfile.1
+    fi
+}
+
+# kill-processes {module-name} {array of pids}
+function kill-processes {
+  # Kill the existing processes
+  local pids=$2
+  local n=${#pids[*]}
+  if [ $n != 0 ]; then
+    echo -n "Stopping $1 ... "
+  fi
+  for p in ${pids}; do
+    if [ x$p != "x" ]; then
+      kill -KILL $p
+      echo "Killed existing process (pid: $p)"
+    fi
+  done
+}
+
+
+### Functions related to ZooKeeper
+function zk {
+  case "$1" in
+    start)
+      start-zk
+      ;;
+    stop)
+      stop-zk
+      ;;
+    stat*) # <- status
+      status-zk
+      ;;
+    re*)   # <- restart
+      stop-zk
+      start-zk
+      ;;
+    *)
+      usage
+      exit 1
+  esac
+}
+
+function start-zk {
+  # Run Zookeeper with our configuration
+  echo -n "Starting Zookeeper ... "
+  $ZK_DIR/bin/zkServer.sh start
+}
+
+function stop-zk {
+  kill-processes "ZooKeeper" `jps -l | grep org.apache.zookeeper.server | awk '{print $1}'`
+}
+
+function status-zk {
+  $ZK_DIR/bin/zkServer.sh status
+}
+
+
+### Functions related to RAMCloud coordinator
+function rc-coord {
+  case "$1" in
+    start)
+      deldb
+      cp $ONOS_HOME/conf/ramcloud.conf /tmp
+      stop-coord
+      start-coord
+      ;;
+    startifdown)
+      local n=`pgrep coordinator | wc -l`
+      if [ $n == 0 ]; then
+        start-coord
+      else
+        echo "$n instance of RAMCloud coordinator running"
+      fi
+      ;;
+    stop)
+      stop-coord
+      ;;
+    stat*) # <- status
+      local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/coordinator | wc -l`
+      echo "$n RAMCloud coordinator running"
+      ;;
+    *)
+      usage
+      exit 1
+  esac
+}
+
+function start-coord {
+  if [ ! -d ${LOGDIR} ]; then
+    mkdir -p ${LOGDIR}
+  fi
+  if [ -f $RAMCLOUD_COORD_LOG ]; then
+    rotate-log $RAMCLOUD_COORD_LOG
+  fi
+
+  # Run ramcloud 
+  echo -n "Starting RAMCloud coordinator ... "
+  $RAMCLOUD_DIR/obj.${RAMCLOUD_BRANCH}/coordinator -L $RAMCLOUD_COORDINATOR > $RAMCLOUD_COORD_LOG 2>&1 &
+  echo "STARTED"
+}
+
+
+function stop-coord {
+  kill-processes "RAMCloud coordinator" `pgrep coordinator | awk '{print $1}'`
+}
+
+function deldb {
+# TODO: implement
+  return
+}
+
+### Functions related to RAMCloud server
+function rc-server {
+  case "$1" in
+    start)
+      deldb
+      cp $ONOS_HOME/conf/ramcloud.conf /tmp
+      stop-server
+      start-server
+      ;;
+    startifdown)
+      local n=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
+      if [ $n == 0 ]; then
+        start-server
+      else
+        echo "$n instance of RAMCloud server running"
+      fi
+      ;;
+    stop)
+      stop-server
+      ;;
+#    deldb)
+#      deldb
+#      ;;
+    stat*) # <- status
+      n=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
+      echo "$n RAMCloud server running"
+      ;;
+    *)
+      usage
+      exit 1
+  esac
+}
+
+function start-server {
+  if [ ! -d ${LOGDIR} ]; then
+    mkdir -p ${LOGDIR}
+  fi
+  if [ -f $RAMCLOUD_SERVER_LOG ]; then
+    rotate-log $RAMCLOUD_SERVER_LOG
+  fi
+
+  # Run ramcloud
+  echo -n "Starting RAMCloud server ... "
+  $RAMCLOUD_DIR/obj.${RAMCLOUD_BRANCH}/server -M -L $RAMCLOUD_SERVER -C $RAMCLOUD_COORDINATOR --masterServiceThreads 1 --logCleanerThreads 1 --detectFailures 0 > $RAMCLOUD_SERVER_LOG 2>&1 &
+  echo "STARTED"
+}
+
+function stop-server {
+  kill-processes "RAMCloud server" `pgrep -f obj.${RAMCLOUD_BRANCH}/server | awk '{print $1}'`
+}
+
+
+### Functions related to ONOS core process
+function onos {
+  CPFILE=${ONOS_HOME}/.javacp.`hostname`
+  if [ ! -f ${CPFILE} ]; then
+    ${MVN} -f ${ONOS_HOME}/pom.xml compile
+  fi
+  JAVA_CP=`cat ${CPFILE}`
+  JAVA_CP="${JAVA_CP}:${ONOS_HOME}/target/classes"
+
+  case "$1" in
+    start)
+      stop-onos
+      start-onos
+      ;;
+    startnokill)
+      start-onos
+      ;;
+    startifdown)
+      n=`jps -l | grep "${MAIN_CLASS}" | wc -l`
+      if [ $n == 0 ]; then
+        start-onos
+      else
+        echo "$n instance of onos running"
+      fi
+      ;;
+    stop)
+      stop-onos
+      ;;
+    stat*) # <- status
+      n=`jps -l | grep "${MAIN_CLASS}" | wc -l`
+      echo "$n instance of onos running"
+      ;;
+    *)
+      usage
+      exit 1
+  esac
+}
+
+function start-onos {
+  if [ ! -d ${LOGDIR} ]; then
+    mkdir -p ${LOGDIR}
+  fi
+  # Backup log files
+  for log in ${LOGS}; do
+    if [ -f ${log} ]; then
+      rotate-log ${log}
+    fi
+  done
+
+  # Run ONOS
+  echo -n "Starting ONOS controller ..."
+# Create default logback config file using template
+  if [ ! -f ${ONOS_LOGBACK} ]; then
+    sed -e "s|__FILENAME__|${ONOS_LOG}|" ${ONOS_LOGBACK_TEMPLATE} > ${ONOS_LOGBACK}
+  fi
+  java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${JAVA_CP} ${MAIN_CLASS} -cf ${ONOS_PROPS} > ${LOGDIR}/${LOGBASE}.stdout 2>${LOGDIR}/${LOGBASE}.stderr &
+  
+  # We need to wait a bit to find out whether starting the ONOS process succeeded
+  sleep 1
+  
+  n=`jps -l |grep "${MAIN_CLASS}" | wc -l`
+  if [ "$n" -ge "1" ]; then
+    echo " STARTED"
+  else
+    echo " FAILED"
+  fi
+
+#  echo "java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -jar ${ONOS_JAR} -cf ./onos.properties > /dev/null 2>&1 &"
+#  sudo -b /usr/sbin/tcpdump -n -i eth0 -s0 -w ${PCAP_LOG} 'tcp port 6633' > /dev/null  2>&1
+}
+
+function stop-onos {
+  kill-processes "ONOS controller" `jps -l | grep ${MAIN_CLASS} | awk '{print $1}'`
+#  kill-processes "tcpdump" `ps -edalf |grep tcpdump |grep ${PCAP_LOG} | awk '{print $4}'`
+}
+
+
+case "$1" in
+  start)
+    case $2 in
+      single-node)
+        zk start
+        rc-coord startifdown
+        rc-server startifdown
+        onos startifdown
+        ;;
+      coord-node)
+        zk start
+        rc-coord startifdown
+        onos startifdown
+        ;;
+      server-node)
+        zk start
+        rc-server startifdown
+        onos startifdown
+        ;;
+      *)
+        usage
+        ;;
+      esac
+    echo
+    ;;
+  stop)
+    on=`jps -l | grep "${MAIN_CLASS}" | wc -l`
+    if [ $on != 0 ]; then
+      onos stop
+    fi
+    
+    rcsn=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
+    if [ $rcsn != 0 ]; then
+      rc-server stop
+    fi
+    
+    rccn=`pgrep coordinator | wc -l`
+    if [ $rccn != 0 ]; then
+      rc-coord stop
+    fi
+    
+    zkn=`jps -l | grep org.apache.zookeeper.server | wc -l`
+    if [ $zkn != 0 ]; then
+      zk stop
+    fi
+    echo
+    ;;
+  restart)
+    on=`jps -l | grep "${MAIN_CLASS}" | wc -l`
+    if [ $on != 0 ]; then
+      onos stop
+    fi
+    
+    rcsn=`pgrep -f obj.${RAMCLOUD_BRANCH}/server | wc -l`
+    if [ $rcsn != 0 ]; then
+      rc-server stop
+    fi
+    
+    rccn=`pgrep coordinator | wc -l`
+    if [ $rccn != 0 ]; then
+      rc-coord stop
+    fi
+    
+    zkn=`jps -l | grep org.apache.zookeeper.server | wc -l`
+    if [ $zkn != 0 ]; then
+      zk restart
+    fi
+    
+    if [ $rccn != 0 ]; then
+      rc-coord startifdown
+    fi
+    
+    if [ $rcsn != 0 ]; then
+      rc-server startifdown
+    fi
+    
+    if [ $on != 0 ]; then
+      onos startifdown
+    fi
+    echo
+    ;;
+  stat*) # <- status
+    echo '[ZooKeeper]'
+    zk status
+    echo
+    echo '[RAMCloud coordinator]'
+    rc-coord status
+    echo
+    echo '[RAMCloud server]'
+    rc-server status
+    echo
+    echo '[ONOS core]'
+    onos status
+    echo
+    ;;
+  zk)
+    zk $2
+    ;;
+  rc-c*) # <- rc-coordinator
+    rc-coord $2
+    ;;
+  rc-s*) # <- rc-server
+    rc-server $2
+    ;;
+  core)
+    onos $2
+    ;;
+  *)
+    usage
+    exit 1
+esac
