diff --git a/cassandra.titan b/cassandra.titan
new file mode 100644
index 0000000..ef6f3ae
--- /dev/null
+++ b/cassandra.titan
@@ -0,0 +1,3 @@
+storage.backend=cassandra
+storage.hostname=localhost
+storage.keyspace=onos
diff --git a/start-cassandra.sh b/start-cassandra.sh
index 011c09d..d670511 100755
--- a/start-cassandra.sh
+++ b/start-cassandra.sh
@@ -1,5 +1,7 @@
 #!/bin/bash
 
+# Set paths
+FL_HOME=`dirname $0`
 CASSANDRA_DIR=${HOME}/apache-cassandra-1.1.4
 LOGDIR=${HOME}/ONOS/onos-logs
 CASSANDRA_LOG=$LOGDIR/cassandara.`hostname`.log
@@ -43,16 +45,18 @@
   done
 }
 
-#function deldb {
+function deldb {
 #   # Delete the berkeley db database
-#   if [ -d "/tmp/cassandra.titan" ]; then
-#      rm -rf /tmp/cassandra.titan
-#      mkdir /tmp/cassandra.titan
-#   fi
-#}
+   if [ -d "/tmp/cassandra.titan" ]; then
+      echo "deleting berkeley db dir"
+      sudo rm -rf /tmp/cassandra.titan
+   fi
+}
 
 case "$1" in
   start)
+    deldb
+    cp $FL_HOME/cassandra.titan /tmp
     stop
     start 
     ;;
diff --git a/start-onos.sh b/start-onos.sh
index 19834af..0ef6ecd 100755
--- a/start-onos.sh
+++ b/start-onos.sh
@@ -103,10 +103,22 @@
       mkdir /tmp/cassandra.titan
    fi
 }
+function check_db {
+   if [ -d "/tmp/cassandra.titan" ]; then
+      echo "Cassandra is running on local berkely db. Exitting"
+      exit
+   fi
+   n=`ps -edalf |grep java |grep apache-cassandra | wc -l`
+   if [ x$n != "x1" ]; then
+      echo "Cassandra is not running. Exitting"
+      exit
+   fi
+}
 
 case "$1" in
   start)
     stop
+    check_db
     start 
     ;;
   stop)
diff --git a/test-network/mininet/fat_tree.py b/test-network/mininet/fat_tree.py
new file mode 100755
index 0000000..c7e4178
--- /dev/null
+++ b/test-network/mininet/fat_tree.py
@@ -0,0 +1,163 @@
+#!/usr/bin/python
+
+NWID="a"
+CONTROLLER_IP='127.0.0.1'
+
+"""
+Start up a Simple topology
+"""
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info, error, warn, debug
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+from mininet.link import Link, TCLink
+
+from sys import exit
+import os.path
+from subprocess import Popen, STDOUT, PIPE
+
+import sys
+
+#import argparse
+
+class MyController( Controller ):
+    def __init__( self, name, ip=CONTROLLER_IP, port=6633, **kwargs):
+        """Init.
+           name: name to give controller
+           ip: the IP address where the remote controller is
+           listening
+           port: the port where the remote controller is listening"""
+        Controller.__init__( self, name, ip=ip, port=port, **kwargs )
+
+    def start( self ):
+        "Overridden to do nothing."
+        return
+
+    def stop( self ):
+        "Overridden to do nothing."
+        return
+
+    def checkListening( self ):
+        "Warn if remote controller is not accessible"
+        listening = self.cmd( "echo A | telnet -e A %s %d" %
+                              ( self.ip, self.port ) )
+        if 'Unable' in listening:
+            warn( "Unable to contact the remote controller"
+                  " at %s:%d\n" % ( self.ip, self.port ) )
+
+class SDNTopo( Topo ):
+    "SDN Topology"
+
+    def __init__( self, *args, **kwargs ):
+        Topo.__init__( self, *args, **kwargs )
+
+        dist_sw = []
+        aggr_sw = []
+        core_sw = []
+        host = []
+        root = []
+
+        for i in range (4):
+            name_suffix = '%s' % NWID + '0d' + '%02d' % i
+            dpid = '0000' + '0000' + '000' + name_suffix
+            sw = self.addSwitch('sw'+name_suffix, dpid=dpid)
+            dist_sw.append(sw)
+
+        for i in range (4):
+            name_suffix = '%s' % NWID + '0a' + '%02d' % i
+            dpid = '0000' + '0000' + '000' + name_suffix
+            sw = self.addSwitch('sw'+name_suffix, dpid=dpid)
+            aggr_sw.append(sw)
+
+        for i in range (2):
+            name_suffix = '%s' % NWID + '0c' + '%02d' % i
+            dpid = '0000' + '0000' + '000' + name_suffix
+            sw = self.addSwitch('sw' + name_suffix, dpid=dpid)
+            core_sw.append(sw)
+
+        for i in range (8):
+            host.append(self.addHost( 'host%d' % i ))
+
+        for i in range (8):
+            root.append(self.addHost( 'root%d' % i, inNamespace=False ))
+
+        for i in range (8):
+            self.addLink(host[i], dist_sw[int(i/2)])
+
+        for i in range (4):
+            for j in range (int(i/2) * 2, (int(i/2) * 2 + 2)):
+                print 'add link btween dist_sw[%d] -> aggr_sw[%d]' % (i, j)
+                self.addLink(dist_sw[i], aggr_sw[j])
+
+        for i in range (4):
+            for j in range (int(i/4) * 4, int(i/4) * 4 + 2):
+                print 'add link btween aggr_sw[%d] -> core_sw[%d]' % (i, j)
+                self.addLink(aggr_sw[i], core_sw[j])
+
+        for i in range (8):
+            self.addLink(root[i], host[i])
+
+def startsshd( host ):
+    "Start sshd on host"
+    info( '*** Starting sshd\n' )
+    name, intf, ip = host.name, host.defaultIntf(), host.IP()
+    banner = '/tmp/%s.banner' % name
+    host.cmd( 'echo "Welcome to %s at %s" >  %s' % ( name, ip, banner ) )
+    host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+    info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+    for h in hosts:
+        startsshd( h )
+
+def stopsshd( ):
+    "Stop *all* sshd processes with a custom banner"
+    info( '*** Shutting down stale sshd/Banner processes ',
+          quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def sdnnet(opt):
+    topo = SDNTopo()
+    info( '*** Creating network\n' )
+    net = Mininet( topo=topo, controller=MyController, link=TCLink)
+
+    host = []
+    for i in range (8):
+      host.append(net.get( 'host%d' % i ))
+
+    net.start()
+
+    core_sw = []
+    for i in range (2):
+        name_suffix = '%s' % NWID + '0c' + '%02d' % i
+        net.get('sw' + name_suffix).attach('tap%s0' % NWID)
+
+    for i in range (8):
+        host[i].defaultIntf().setIP('192.168.10.10%d/24' % i) 
+
+    root = []
+    for i in range (8):
+        root.append(net.get( 'root%d' % i ))
+
+    for i in range (8):
+        host[i].intf('host%d-eth1' % i).setIP('1.1.%d.1/24' % i)
+        root[i].intf('root%d-eth0' % i).setIP('1.1.%d.2/24' % i)
+
+    stopsshd ()
+    startsshds ( host )
+
+    if opt=="cli":
+        CLI(net)
+        stopsshd()
+        net.stop()
+
+if __name__ == '__main__':
+    setLogLevel( 'info' )
+    if len(sys.argv) == 1:
+      sdnnet("cli")
+    elif len(sys.argv) == 2 and sys.argv[1] == "-n":
+      sdnnet("nocli")
+    else:
+      print "%s [-n]" % sys.argv[0]
