diff --git a/.gitignore b/.gitignore
index 2e70064..3c5748b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,6 @@
 *.class
 .classpath
 .project
-target
\ No newline at end of file
+target
+onos-logs
+onos.log
\ No newline at end of file
diff --git a/build.xml b/build.xml
index aa8b593..2bd1343 100644
--- a/build.xml
+++ b/build.xml
@@ -62,7 +62,7 @@
         <include name="simple-4.1.21.jar"/>
         <include name="netty-3.2.6.Final.jar"/>
         <include name="args4j-2.0.16.jar"/>
-        <include name="concurrentlinkedhashmap-lru-1.2.jar"/>
+        <include name="concurrentlinkedhashmap-lru-1.3.jar"/>
         <include name="jython-2.5.2.jar"/>
         <include name="libthrift-0.7.0.jar"/>
     </patternset>
diff --git a/onos-embedded.sh b/onos-embedded.sh
new file mode 100755
index 0000000..b5cfed6
--- /dev/null
+++ b/onos-embedded.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+
+# Set paths
+FL_HOME=`dirname $0`
+FL_JAR="${FL_HOME}/target/floodlight.jar"
+FL_LOGBACK="${FL_HOME}/logback.xml"
+TITAN_CONFIG="/tmp/cassandra.titan"
+CASSANDRA_CONFIG="/home/`whoami`/apache-cassandra-1.1.4/conf/cassandra.yaml"
+
+# Set JVM options
+JVM_OPTS=""
+#JVM_OPTS="$JVM_OPTS -server -d64"
+#JVM_OPTS="$JVM_OPTS -Xmx2g -Xms2g -Xmn800m"
+#JVM_OPTS="$JVM_OPTS -XX:+UseParallelGC -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 -Dpython.security.respectJavaAccessibility=false"
+
+# Set classpath to include titan libs
+#CLASSPATH=`echo ${FL_HOME}/lib/*.jar ${FL_HOME}/lib/titan/*.jar | sed 's/ /:/g'`
+CLASSPATH="${FL_HOME}/lib/*.jar:${FL_HOME}/lib/titan/*.jar"
+
+CASSANDRA_OPTS="-Dcom.sun.management.jmxremote.port=7199"
+CASSANDRA_OPTS="$CASSANDRA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
+CASSANDRA_OPTS="$CASSANDRA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
+
+# Create a logback file if required
+cat <<EOF_LOGBACK >${FL_LOGBACK}
+<configuration scan="true" debug="true">
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%level [%logger:%thread] %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+    <file>onos.log</file>
+    <encoder>
+      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <logger name="org" level="WARN"/>
+  <logger name="LogService" level="WARN"/> <!-- Restlet access logging -->
+  <logger name="net.floodlightcontroller.logging" level="WARN"/>
+
+  <root level="DEBUG">
+    <appender-ref ref="STDOUT" />
+    <appender-ref ref="FILE" />
+  </root>
+</configuration>
+EOF_LOGBACK
+
+cat <<EOF_TITAN >${TITAN_CONFIG}
+storage.backend=embeddedcassandra
+storage.hostname=127.0.0.1
+storage.keyspace=onos
+storage.cassandra-config-dir=file://${CASSANDRA_CONFIG}
+EOF_TITAN
+
+# Clear logs
+rm onos.log
+
+# Run floodlight
+echo "Starting ONOS controller ..."
+echo 
+#java ${JVM_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -Xbootclasspath/a:$CLASSPATH -jar ${FL_JAR} -cf ./onos.properties
+java ${JVM_OPTS} ${CASSANDRA_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -jar ${FL_JAR}
diff --git a/onos.sh b/onos.sh
index e7a1651..5667114 100755
--- a/onos.sh
+++ b/onos.sh
@@ -46,8 +46,8 @@
 EOF_LOGBACK
 
 # Delete and recreate /tmp/netmap
-rm -rf /tmp/cassandra.titan
-mkdir /tmp/cassandra.titan
+#rm -rf /tmp/cassandra.titan
+#mkdir /tmp/cassandra.titan
 
 # Clear logs
 rm onos.log
@@ -55,4 +55,5 @@
 # Run floodlight
 echo "Starting ONOS controller ..."
 echo 
-java ${JVM_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -Xbootclasspath/a:$CLASSPATH -jar ${FL_JAR} -cf ./onos.properties
+#java ${JVM_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -Xbootclasspath/a:$CLASSPATH -jar ${FL_JAR} -cf ./onos.properties
+java ${JVM_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -jar ${FL_JAR} -cf ./onos.properties
diff --git a/scripts/onos-nodetool.py b/scripts/onos-nodetool.py
new file mode 100644
index 0000000..51a4ca4
--- /dev/null
+++ b/scripts/onos-nodetool.py
@@ -0,0 +1,241 @@
+#!/usr/bin/python
+
+import os
+import sys
+import time
+import socket
+import argparse
+import paramiko
+import subprocess
+
+CASSANDRA_DIR = "/home/ubuntu/apache-cassandra-1.1.4"
+CASSANDRA_NODETOOL = CASSANDRA_DIR + "/bin/nodetool"
+CASSANDRA_CMD = CASSANDRA_DIR + "/bin/cassandra"
+
+class RemoteOnosNode:
+
+    def __init__(self, ip):
+        #self.hostname = hostname
+        self.ip = ip
+
+        self.ssh = paramiko.SSHClient()
+        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        self.ssh.connect(self.ip, key_filename='/home/ubuntu/.ssh/onlabkey.pem')
+
+    def get_pids(self, process_search_string):
+        stdin, stdout, stderr = self.ssh.exec_command('pgrep -f %s' % process_search_string)
+        pid_list = stdout.readlines()
+
+        return ([x.strip() for x in pid_list])
+
+    #takes a list of pids to kill
+    def kill_all(self, pid_list):
+        for pid in pid_list:
+            stdin, stdout, stderr = self.ssh.exec_command('kill %s' % pid)
+
+            if stderr.read() != '':
+                print "Killing %s failed" % pid
+            else:
+                print "%s killed" % pid
+
+    def clean(self):
+        processes = ['floodlight.jar', 'CassandraDaemon']
+
+        for process in processes:
+            self.kill_all(self.get_pids(process))
+
+    def start_onos(self, embedded=False):
+        print "*** Starting ONOS:"
+        
+        if embedded:
+            onos_script = ('nohup /home/ubuntu/ONOS/onos-embedded.sh > '
+                           '/dev/null 2>&1 &')
+        else:
+            onos_script = 'nohup /home/ubuntu/ONOS/onos.sh > /dev/null 2>&1 &'
+        
+        self.ssh.exec_command(onos_script)
+
+        
+    def start_cassandra(self):
+
+        print "*** Starting Cassandra:"
+
+        stdin, stdout, stderr = self.ssh.exec_command(CASSANDRA_CMD)
+        if stderr.read() != '':
+            print "Error starting Casssanda"
+            return
+
+        print "*** Waiting while Cassandra bootstaps:"
+
+        node_bootstrapped = False
+        while not node_bootstrapped:
+            stdin, stdout, stderr = self.ssh.exec_command(CASSANDRA_NODETOOL + ' ring')
+            for line in stdout.readlines():
+                if (self.ip in line) and ('Up' in line):
+                    node_bootstrapped = True
+
+            time.sleep(1)
+
+    def check_status(self):
+        #self.check_process('floodlight.jar')
+        
+        onos_pids = self.get_pids('floodlight.jar')
+        onos_ok = len(onos_pids) == 1
+
+        cassandra_pids = self.get_pids('CassandraDaemon')
+        cassandra_ok = len(cassandra_pids) == 1
+
+        controller_port = self.check_port_listening(self.ip, '6633')
+        
+        in_ring = self.check_in_ring()
+
+        if onos_ok and (not cassandra_ok) and in_ring:
+            print "ONOS and Cassandra running in EMBEDDED mode"
+        elif onos_ok and cassandra_ok and in_ring and controller_port:
+            print "ONOS and Cassandra running in SEPARATE mode"
+        elif not (onos_ok or cassandra_ok or in_ring or controller_port):
+            print "Node is DOWN"
+        else:
+            print "Node is not fully operational:"
+            print "ONOS process pid %s" % onos_pids
+            print "Cassandra process pids %s" % cassandra_pids
+            print "Controller port open: %s" % controller_port
+            print "Node in Cassandra ring: %s" % in_ring
+
+    def check_in_ring(self):
+        stdin, stdout, stderr = self.ssh.exec_command(CASSANDRA_NODETOOL + ' ring')
+
+        for line in stdout.readlines():
+            if (self.ip in line) and ('Up' in line):
+                return True
+
+        return False
+
+    def check_port_listening(self, host, port):
+        command = 'telnet -e A %s %s' % (host, port)
+        process = subprocess.Popen(command.split(), stdin=subprocess.PIPE, 
+                                   stdout=subprocess.PIPE, 
+                                   stderr=subprocess.STDOUT)
+        output = process.communicate(input='A quit')[0]
+
+        if 'Unable' in output:
+            return False
+
+        return True
+
+def start_mininet(mn_host):
+    ssh = paramiko.SSHClient()
+    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+    
+    ssh.connect(mn_host, key_filename='/home/ubuntu/.ssh/onlabkey.pem')
+
+    stdin, stdout, stderr = ssh.exec_command('sudo mn -c')
+
+    #print (stdout.read())
+    #print (stderr.read())
+    if not '*** Cleanup complete.' in stderr.read():
+        print ("Mininet didn't clean up properly")
+
+    network_file = '/home/ubuntu/sdn2/onos-nw.py'
+    stdin, stdout, stderr = ssh.exec_command('sudo python %s > /dev/null 2>&1 &' % network_file)
+
+    print "OUT\n"
+    print stdout.read()
+    print "ERR\n"
+    print stderr.read()
+
+    ssh.close()
+
+def add(args):
+    (onos_ip, onos_hostname) = get_ip_hostname(args.hostname)
+
+    pr_hostname = "" if onos_ip == onos_hostname else onos_hostname
+    print "Starting up ONOS node %s with IP %s" % (pr_hostname, onos_ip)
+    
+    remote_node = RemoteOnosNode(onos_ip)
+    remote_node.clean()
+
+    #wait a few seconds to let cassandra fully shutdown
+    time.sleep(2)
+
+    if args.embedded:
+        remote_node.start_onos(embedded=True)
+    else:
+        remote_node.start_cassandra()
+        remote_node.start_onos()
+
+
+def get_ip_hostname(node):
+    """ Takes in either a hostname or an IP address and returns
+    (ip, hostname).
+    Note if IP is given both values will be the same, i.e. we don't
+    actually care about finding the hostname if user specified an IP"""
+
+    if '.' in node:
+        return (node, node)
+    else:
+        return (socket.gethostbyname(node), node)
+
+
+def status(args):
+    for node in args.cluster_nodes.split(','):
+        (ip, hostname) = get_ip_hostname(node)
+
+        print "Status of %s:" % hostname
+
+        remote_node = RemoteOnosNode(ip)
+        remote_node.check_status()
+
+        print
+        
+def remove(args):
+    remote_node = RemoteOnosNode(args.hostname)
+    remote_node.clean()
+
+def parse_args():
+    commands = ['add', 'remove', 'status']
+
+    parser = argparse.ArgumentParser(description='Add node to ONOS cluster')
+    ##add command
+    subparsers = parser.add_subparsers(help='command')
+    parser_add = subparsers.add_parser('add', 
+                                       help='Add a node to ONOS cluster')
+    parser_add.add_argument('hostname',
+                            help='hostname of new ONOS node')
+    parser_add.add_argument('-e', '--embedded', action='store_true',
+                            help='run Cassandra in embedded mode in the same '
+                            'JVM as ONOS')
+    parser_add.set_defaults(func=add)
+
+    ##status command
+    parser_status = subparsers.add_parser('status',
+                                          help='Check status of ONOS nodes')
+    parser_status.add_argument('cluster_nodes',
+                               help='comma-delimited list IP addresses for '
+                               'existing cluster nodes')
+    parser_status.set_defaults(func=status)
+
+    ##remove command
+    parser_remove = subparsers.add_parser('remove', help='Remove an ONOS node '
+                                          'from the cluster')
+    parser_remove.add_argument('hostname', help='ONOS node to remove')
+    parser_remove.set_defaults(func=remove)
+                               
+    
+    return parser.parse_args()
+
+
+if __name__ == '__main__':
+    args = parse_args()
+
+    args.func(args)
+    """
+    if args.mininet:
+        start_mininet(args.mininet)
+    else:
+        print('Assuming mininet host is the same as ONOS host')
+        start_mininet(args.onos)
+    """
+
+    
+    sys.exit(0)
diff --git a/src/main/java/net/floodlightcontroller/core/INetMapStorage.java b/src/main/java/net/floodlightcontroller/core/INetMapStorage.java
index 642bf4d..67c6631 100644
--- a/src/main/java/net/floodlightcontroller/core/INetMapStorage.java
+++ b/src/main/java/net/floodlightcontroller/core/INetMapStorage.java
@@ -15,4 +15,5 @@
 		UPDATE  // Update the object if exists or CREATE/INSERT if does not exist
 	}
 	public void init(String conf);
+	public void close();
 }
diff --git a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
index 1e14b05..72c6b50 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
@@ -262,5 +262,16 @@
 		return inactiveSwitches;
 	}
 
+	public void finalize() {
+		close();
+	}
+	
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+		graph.shutdown();
+		
+	}
+
 	
 }
diff --git a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
index 0edc35e..cb2eb46 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
@@ -27,7 +27,7 @@
 
 	@Override
 	public Iterable<ISwitchObject> GetAllSwitches() {
-		// TODO Auto-generated method stub
+		// TODO Auto-generated method stub		
 		return swStore.getAllSwitches();
 	}
 
@@ -41,6 +41,5 @@
 	public List<String> GetPortsOnSwitch(String dpid) {
 		// TODO Auto-generated method stub
 		return null;
-	}
-    
+	}	
 }
diff --git a/src/main/java/net/floodlightcontroller/core/web/TopoSwitchesResource.java b/src/main/java/net/floodlightcontroller/core/web/TopoSwitchesResource.java
index 11dbcb1..e75d26a 100644
--- a/src/main/java/net/floodlightcontroller/core/web/TopoSwitchesResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/TopoSwitchesResource.java
@@ -21,8 +21,9 @@
 		}
 		if (filter.equals("inactive")) {
 			return (Iterator<ISwitchObject>) impl.GetInactiveSwitches().iterator();
+		} else {
+		    return (Iterator<ISwitchObject>) impl.GetAllSwitches().iterator();
 		}
-		return (Iterator<ISwitchObject>) impl.GetAllSwitches().iterator();				
 	}
 
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
index c432987..f5ad9ac 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -551,7 +551,7 @@
         	remoteport.setConfig(0); 
         	remoteport.setState(0);
         	remotesw.setPort(remoteport);
-        	log.debug("addRemoteSwitch(): added fake remote port {} to sw {}", remoteport, remotesw);
+        	log.debug("addRemoteSwitch(): added fake remote port {} to sw {}", remoteport, remotesw.getId());
         }
         
         return remotesw;
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
index 43c6c94..3aa1fc0 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
@@ -47,6 +47,7 @@
 	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
 		switch (op) {
 		case UPDATE:
+			break;
 		case CREATE:
 		case INSERT:
 			addOrUpdateLink(link, linkinfo, op);
@@ -191,7 +192,7 @@
 	
 	@Override
 	public void init(String conf) {
-		//TODO extract the DB location from conf
+		//TODO extract the DB location from properties
 	
         graph = TitanFactory.open(conf);
         
@@ -232,10 +233,9 @@
 
 			pipe.start(sw.asVertex());
 			pipe.enablePath(true);
-			pipe.out("on").out("link").in("on").path().getCurrentPath();
-			pipe.step(extractor);
+			pipe.out("on").out("link").in("on").path().step(extractor);
 					
-			if (pipe.hasNext() ) {
+			while (pipe.hasNext() ) {
 				Link l = pipe.next();
 				links.add(l);
 			}
@@ -246,7 +246,6 @@
 	
 	static class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {
 	
-
 		@Override
 		public Link compute(PathPipe<Vertex> pipe ) {
 			// TODO Auto-generated method stub
@@ -270,6 +269,16 @@
 			return l;
 		}
 	}
+	
+	public void finalize() {
+		close();
+	}
+
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+		graph.shutdown();		
+	}
 
 
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/TopoLinkServiceImpl.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/TopoLinkServiceImpl.java
index b73224e..2dbb338 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/TopoLinkServiceImpl.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/TopoLinkServiceImpl.java
@@ -21,7 +21,8 @@
 	@Override
 	public List<Link> GetActiveLinks() {
 		// TODO Auto-generated method stub
-		return linkStore.getActiveLinks();
+		List<Link> retval = linkStore.getActiveLinks();
+		return retval;
 	}
 
 	@Override
@@ -29,5 +30,4 @@
 		// TODO Auto-generated method stub
 		return linkStore.getLinks(dpid);
 	}
-
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/web/TopoLinksResource.java b/src/main/java/net/floodlightcontroller/linkdiscovery/web/TopoLinksResource.java
index 323708e..a0770cb 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/web/TopoLinksResource.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/web/TopoLinksResource.java
@@ -13,8 +13,8 @@
     public List<Link> retrieve() {
 		TopoLinkServiceImpl impl = new TopoLinkServiceImpl();
 		
-		return impl.GetActiveLinks();
-		
+		List<Link> retval = impl.GetActiveLinks();
+		return retval;
 	}
 
 }
diff --git a/start-cassandra.sh b/start-cassandra.sh
new file mode 100755
index 0000000..3f92779
--- /dev/null
+++ b/start-cassandra.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+
+CASSANDRA_DIR=${HOME}/apache-cassandra-1.1.4
+LOGDIR=${HOME}/ONOS/onos-logs
+CASSANDRA_LOG=$LOGDIR/cassandara.onos1vpc.log
+
+function lotate {
+logfile=$1
+nr_max=$2
+if [ -f $logfile ]; then
+  for i in `seq $(expr 10 - 1) -1 1`; do
+    if [ -f ${logfile}.${i} ]; then
+      mv -f ${logfile}.${i} ${logfile}.`expr $i + 1`
+    fi
+  done
+  mv $logfile $logfile.1
+fi
+}
+
+function start {
+  if [ ! -d ${LOGDIR} ]; then
+    mkdir -p ${LOGDIR}
+  fi
+  echo "rotate log: $log"
+  if [ -f $CASSANDRA_LOG ]; then
+    lotate $CASSANDRA_LOG
+  fi
+
+  # Run cassandra 
+  echo "Starting cassandra"
+  $CASSANDRA_DIR/bin/cassandra > $CASSANDRA_LOG 2>&1 
+}
+
+function stop {
+  # Kill the existing processes
+  capid=`ps -edalf |grep java |grep apache-cassandra | awk '{print $4}'`
+  pids="$capid"
+  for p in ${pids}; do
+    if [ x$p != "x" ]; then
+      sudo kill -KILL $p
+      echo "Killed existing prosess (pid: $p)"
+    fi
+  done
+}
+
+#function deldb {
+#   # Delete the berkeley db database
+#   if [ -d "/tmp/cassandra.titan" ]; then
+#      rm -rf /tmp/cassandra.titan
+#      mkdir /tmp/cassandra.titan
+#   fi
+#}
+
+case "$1" in
+  start)
+    stop
+    start 
+    ;;
+  stop)
+    stop
+    ;;
+#  deldb)
+#    deldb
+#    ;;
+  status)
+    n=`ps -edalf |grep java |grep apache-cassandra | wc -l`
+    echo "$n instance of cassandra running"
+    $CASSANDRA_DIR/bin/nodetool ring 
+    ;;
+  *)
+    echo "Usage: $0 {start|stop|restart|status}"
+    exit 1
+esac
diff --git a/start-onos.sh b/start-onos.sh
index 9c1cf77..9f70527 100755
--- a/start-onos.sh
+++ b/start-onos.sh
@@ -40,7 +40,6 @@
 <logger name="org" level="WARN"/>
 <logger name="LogService" level="WARN"/> <!-- Restlet access logging -->
 <logger name="net.floodlightcontroller.logging" level="WARN"/>
-<logger name="net.floodlightcontroller.linkdiscovery.internal" level="TRACE"/>
 
 <root level="DEBUG">
 <appender-ref ref="FILE" />
@@ -48,6 +47,7 @@
 </configuration>
 EOF_LOGBACK
 
+#<logger name="net.floodlightcontroller.linkdiscovery.internal" level="TRACE"/>
 #<appender-ref ref="STDOUT" />
 
 function lotate {
@@ -78,7 +78,7 @@
   # Run floodlight
   echo "Starting ONOS controller ..."
   echo 
-  java ${JVM_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -Xbootclasspath/a:$CLASSPATH -jar ${FL_JAR} -cf ./onos.properties > /dev/null 2>&1 &
+  java ${JVM_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -jar ${FL_JAR} -cf ./onos.properties > /dev/null 2>&1 &
   sudo tcpdump -n -i eth0 'tcp port 6633' -s0 -w ${PCAP_LOG} &
 }
 
@@ -95,6 +95,14 @@
   done
 }
 
+function deldb {
+   # Delete the berkeley db database
+   if [ -d "/tmp/cassandra.titan" ]; then
+      rm -rf /tmp/cassandra.titan
+      mkdir /tmp/cassandra.titan
+   fi
+}
+
 case "$1" in
   start)
     stop
@@ -103,6 +111,9 @@
   stop)
     stop
     ;;
+  deldb)
+    deldb
+    ;;
   status)
     n=`ps -edalf |grep java |grep logback.xml | wc -l`
     echo "$n instance of onos running"
