diff --git a/web/js/controller-status.js b/web/js/controller-status.js
index 5c1ae30..3004ce8 100644
--- a/web/js/controller-status.js
+++ b/web/js/controller-status.js
@@ -18,11 +18,6 @@
 	attr("width", 1280).
 	attr("height", 50);
 
-    var CassandraStatus = d3.select("#cassandra-status").
-	append("svg:svg").
-	attr("width", 1280).
-	attr("height", 50);
-
     d3.json(data_source, draw);
     setInterval(function() {
         $.ajax({
@@ -35,17 +30,13 @@
     }, 3000); 
 
     function draw(json){
-//	var data = json.data;
 	var data = json;
 	var server = Servers.selectAll("text").data(data);
 	var controller_rect = ContStatus.selectAll("rect").data(data);
 	var controller_text = ContStatus.selectAll("text").data(data);
-	var cassandra_rect = CassandraStatus.selectAll("rect").data(data);
-	var cassandra_text = CassandraStatus.selectAll("text").data(data);
 
 	var x = d3.scale.linear().domain([0, data.length]).range([0, width]);
 	var y = d3.scale.linear().domain([0, d3.max(data, function(datum) { return datum.onos; })]).rangeRound([0, height]);
-	var y2 = d3.scale.linear().domain([0, d3.max(data, function(datum) { return datum.cassandra; })]).rangeRound([0, height]);
 
 	console.log(data)
 	server.
@@ -115,26 +106,6 @@
 	    attr("width", barWidth).
 	    attr('fill', 'white'); 
 
-	cassandra_rect.
-	    enter().
-	    append("svg:rect").
-	    attr("x", function(datum, index) { return x(index); }).
-	    attr("y", function(datum) { return height - y2(datum.cassandra); }).
-	    attr("height", function(datum) { return y2(datum.cassandra); }).
-	    attr("width", barWidth).
-	    attr("fill", "#aa0000");
-
-	cassandra_text.
-	    enter().
-	    append("svg:text").
-	    text(function(){return "Cassandra"}).
-	    attr("x", function(datum, index) { return x(index); }).
-	    attr("y", function(datum) { return 30 ; }).
-	    attr("height", function(datum) { return y(datum.onos); }).
-	    attr("width", barWidth).
-	    attr('fill', 'white'); 
-
-
 	controller_rect.
 	    attr("x", function(datum, index) { return x(index); }).
 	    attr("y", function(datum) { return height - y(datum.onos); }).
@@ -170,48 +141,9 @@
 	    attr("width", barWidth).
 	    attr('fill', 'white'); 
 
-	cassandra_rect.
-	    attr("x", function(datum, index) { return x(index); }).
-	    attr("y", function(datum) { return height - y2(datum.cassandra); }).
-	    attr("height", function(datum) { return y2(datum.cassandra); }).
-	    attr("width", barWidth).
-	    attr("fill", "#aa0000");
-
-	cassandra_text.
-	    text(function(){return "Cassandra"}).
-	    attr("x", function(datum, index) { return x(index); }).
-	    attr("y", function(datum) { return 30 ; }).
-	    attr("height", function(datum) { return y(datum.cassandra); }).
-	    attr("width", barWidth).
-	    attr('fill', 'white'); 
-
-
 	server.exit().remove();
 	controller_rect.exit().remove();
 	controller_text.exit().remove();
-	cassandra_rect.exit().remove();
-	cassandra_text.exit().remove();
-
     }
-/*
-    $("#more").click( function() {
-        $.ajax({
-	    url: 'http://gui.onlab.us:8080/controller_status1',
-	    success: function(json) {
-		draw(json);
-	    },
-	    dataType: "json"
-        });
-    });
-    $("#less").click( function() {
-        $.ajax({
-	    url: 'http://gui.onlab.us:8080/controller_status2',
-	    success: function(json) {
-		draw(json);
-	    },
-	    dataType: "json"
-        });
-    });
-*/
 }
 
diff --git a/web/onos-topology.html b/web/onos-topology.html
index b4e5097..6db7862 100644
--- a/web/onos-topology.html
+++ b/web/onos-topology.html
@@ -20,10 +20,6 @@
 <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
 </head>
 <body>
-<!--
-<button id="more">more</button>
-<button id="less">less</button>
---!>
 <svg width="0.1in" height="0.1in" 
      viewBox="0 0 4000 2000" version="1.1"
      xmlns="http://www.w3.org/2000/svg">
@@ -47,7 +43,6 @@
 <h2>Controller Status</h2>
 <div id="servers"></div>
 <div id="onos-status"></div>
-<div id="cassandra-status"></div>
 <h2>Topology View</h2>
 <div id="topology"></div>
 <script type="text/javascript" src="js/controller-status.js"></script>
diff --git a/web/topology_rest.py b/web/topology_rest.py
index 64f6275..703fddb 100755
--- a/web/topology_rest.py
+++ b/web/topology_rest.py
@@ -1,34 +1,23 @@
 #! /usr/bin/env python
-import pprint
 import os
-import sys
-import subprocess
 import json
-import argparse
-import io
-import time
-import random
-import re
 from urllib2 import Request, urlopen, URLError, HTTPError
-
 from flask import Flask, json, Response, render_template, make_response, request
 
-CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json"
-LINK_FILE=os.getenv("HOME") + "/ONOS/web/link.json"
-ONOSDIR=os.getenv("HOME") + "/ONOS"
+CONFIG_FILE="config.json"
 
 ## Global Var for this proxy script setting.
 # "0.0.0.0" means any interface
-ProxyIP="0.0.0.0"
-ProxyPort=9000
+GuiIp="0.0.0.0"
+GuiPort=9000
 
 ## Global Var for ON.Lab local REST ##
+# The GUI can be accessed at <this_host>:9000/onos-topology.html
 RestIP="localhost"
 RestPort=8080
 ONOS_DEFAULT_HOST="localhost" ;# Has to set if LB=False
 DEBUG=1
 
-pp = pprint.PrettyPrinter(indent=4)
 app = Flask(__name__)
 
 def read_config():
@@ -47,25 +36,15 @@
 def log_error(txt):
   print '%s' % (txt)
 
-def debug(txt):
-  if DEBUG:
-    print '%s' % (txt)
-
 ### File Fetch ###
 @app.route('/ui/img/<filename>', methods=['GET'])
-@app.route('/img/<filename>', methods=['GET'])
-@app.route('/css/<filename>', methods=['GET'])
-@app.route('/js/models/<filename>', methods=['GET'])
-@app.route('/js/views/<filename>', methods=['GET'])
 @app.route('/js/<filename>', methods=['GET'])
-@app.route('/lib/<filename>', methods=['GET'])
 @app.route('/log/<filename>', methods=['GET'])
 @app.route('/', methods=['GET'])
 @app.route('/<filename>', methods=['GET'])
-@app.route('/tpl/<filename>', methods=['GET'])
 def return_file(filename="index.html"):
   if request.path == "/":
-    fullpath = "./index.html"
+    fullpath = "./onos-topology.html"
   else:
     fullpath = str(request.path)[1:]
 
@@ -99,17 +78,15 @@
   try:
     response = urlopen(url)
   except URLError, e:
-    print "get_json: REST IF %s has issue. Reason: %s" % (url, e.reason)
+    log_error("get_json: REST IF %s has issue. Reason: %s" % (url, e.reason))
     result = ""
     return (500, result)
   except HTTPError, e:
-    print "get_json: REST IF %s has issue. Code %s" % (url, e.code)
+    log_error("get_json: REST IF %s has issue. Code %s" % (url, e.code))
     result = ""
     return (e.code, result)
 
-  print response
   result = response.read()
-#  parsedResult = json.loads(result)
   return (code, result)
 
 
@@ -176,7 +153,6 @@
     log_error("REST IF has issue: %s" % url)
     log_error("%s" % result)
     return
-#    sys.exit(0)
 
   for v in parsedResult:
     link = {}
@@ -189,13 +165,6 @@
     link['source'] = src_id
     link['target'] = dst_id
 
-    #onpath = 0
-    #for (s,d) in path:
-    #  if s == v['src-switch'] and d == v['dst-switch']:
-    #    onpath = 1
-    #    break
-    #link['type'] = onpath
-
     links.append(link)
 
   topo['nodes'] = switches
@@ -205,137 +174,6 @@
   resp = Response(js, status=200, mimetype='application/json')
   return resp
 
-@app.route("/wm/floodlight/topology/toporoute/<v1>/<p1>/<v2>/<p2>/json")
-def shortest_path(v1, p1, v2, p2):
-  try:
-    url = "http://%s:%s/wm/onos/topology/switches/json" % (RestIP, RestPort)
-    (code, result) = get_json(url)
-    parsedResult = json.loads(result)
-  except:
-    log_error("REST IF has issue: %s" % command)
-    log_error("%s" % result)
-    return
-
-  topo = {}
-  switches = []
-  links = []
-
-  for v in parsedResult:
-    if v.has_key('dpid'):
-      dpid = str(v['dpid'])
-      state = str(v['state'])
-      sw = {}
-      sw['name']=dpid
-      if str(v['state']) == "ACTIVE":
-        if dpid[-2:-1] == "a":
-         sw['group']=1
-        if dpid[-2:-1] == "b":
-         sw['group']=2
-        if dpid[-2:-1] == "c":
-         sw['group']=3
-      if str(v['state']) == "INACTIVE":
-         sw['group']=0
-
-      switches.append(sw)
-
-  try:
-    url = "http://%s:%s/wm/onos/topology/route/%s/%s/%s/%s/json" % (RestIP, RestPort, v1, p1, v2, p2)
-    (code, result) = get_json(url)
-    parsedResult = json.loads(result)
-  except:
-    log_error("No route")
-    parsedResult = []
-
-  path = [];
-  for i, v in enumerate(parsedResult):
-    if i < len(parsedResult) - 1:
-      sdpid= parsedResult['flowEntries'][i]['dpid']['value']
-      ddpid= parsedResult['flowEntries'][i+1]['dpid']['value']
-      path.append( (sdpid, ddpid))
-
-  try:
-    url = "http://%s:%s/wm/onos/topology/links/json" % (RestIP, RestPort)
-    (code, result) = get_json(url)
-    parsedResult = json.loads(result)
-  except:
-    log_error("REST IF has issue: %s" % command)
-    log_error("%s" % result)
-    return
-
-  for v in parsedResult:
-    link = {}
-    if v.has_key('dst-switch'):
-      dst_dpid = str(v['dst-switch'])
-      dst_id = node_id(switches, dst_dpid)
-    if v.has_key('src-switch'):
-      src_dpid = str(v['src-switch'])
-      src_id = node_id(switches, src_dpid)
-    link['source'] = src_id
-    link['target'] = dst_id
-    onpath = 0
-    for (s,d) in path:
-      if s == v['src-switch'] and d == v['dst-switch']:
-        onpath = 1
-        break
-
-    link['type'] = onpath
-    links.append(link)
-
-  topo['nodes'] = switches
-  topo['links'] = links
-
-  js = json.dumps(topo)
-  resp = Response(js, status=200, mimetype='application/json')
-  return resp
-
-@app.route("/wm/floodlight/core/controller/switches/json")
-def query_switch():
-  try:
-    url = "http://%s:%s/wm/onos/topology/switches/json" % (RestIP, RestPort)
-    (code, result) = get_json(url)
-    parsedResult = json.loads(result)
-  except:
-    log_error("REST IF has issue: %s" % url)
-    log_error("%s" % result)
-    return
-#    sys.exit(0)
-
-#  print command
-#  print result
-  switches_ = []
-  for v in parsedResult:
-    if v.has_key('dpid'):
-      if v.has_key('dpid') and str(v['state']) == "ACTIVE":#;if you want only ACTIVE nodes
-        dpid = str(v['dpid'])
-        state = str(v['state'])
-        sw = {}
-        sw['dpid']=dpid
-        sw['active']=state
-        switches_.append(sw)
-
-#  pp.pprint(switches_)
-  js = json.dumps(switches_)
-  resp = Response(js, status=200, mimetype='application/json')
-  return resp
-
-## return fake stat for now
-@app.route("/wm/floodlight/core/switch/<switchId>/<statType>/json")
-def switch_stat(switchId, statType):
-    if statType == "desc":
-        desc=[{"length":1056,"serialNumber":"None","manufacturerDescription":"Nicira Networks, Inc.","hardwareDescription":"Open vSwitch","softwareDescription":"1.4.0+build0","datapathDescription":"None"}]
-        ret = {}
-        ret[switchId]=desc
-    elif statType == "aggregate":
-        aggr = {"packetCount":0,"byteCount":0,"flowCount":0}
-        ret = {}
-        ret[switchId]=aggr
-    else:
-        ret = {}
-
-    js = json.dumps(ret)
-    resp = Response(js, status=200, mimetype='application/json')
-    return resp
-
 @app.route("/controller_status")
 def controller_status():
   url= "http://%s:%d/wm/onos/registry/controllers/json" % (RestIP, RestPort)
@@ -351,7 +189,6 @@
       onos=0
     status["name"]=i
     status["onos"]=onos
-    status["cassandra"]=0
     cont_status.append(status)
 
   js = json.dumps(cont_status)
@@ -359,27 +196,6 @@
   return resp
 
 if __name__ == "__main__":
-  random.seed()
   read_config()
-  if len(sys.argv) > 1 and sys.argv[1] == "-d":
-    # for debugging
-    #add_flow("00:00:00:00:00:00:02:02", 1, "00:00:00:00:00:00:03:02", 1, "00:00:00:00:02:02", "00:00:00:00:03:0c")
-    #proxy_link_change("up", "00:00:00:00:ba:5e:ba:11", 1, "00:00:00:00:00:00:00:00", 1)
-    #proxy_link_change("down", "00:00:20:4e:7f:51:8a:35", 1, "00:00:00:00:00:00:00:00", 1)
-    #proxy_link_change("up", "00:00:00:00:00:00:02:03", 1, "00:00:00:00:00:00:00:00", 1)
-    #proxy_link_change("down", "00:00:00:00:00:00:07:12", 1, "00:00:00:00:00:00:00:00", 1)
-    #print "-- query all switches --"
-    #query_switch()
-    #print "-- query topo --"
-    #topology_for_gui()
-    ##print "-- query all links --"
-    ##query_links()
-    #print "-- query all devices --"
-    #devices()
-    #links()
-    #switches()
-    #reset_demo()
-    pass
-  else:
-    app.debug = True
-    app.run(threaded=True, host=ProxyIP, port=ProxyPort)
\ No newline at end of file
+  app.debug = True
+  app.run(threaded=True, host=GuiIp, port=GuiPort)
diff --git a/web/topology_rest_napi.py b/web/topology_rest_napi.py
deleted file mode 100755
index 58c2de9..0000000
--- a/web/topology_rest_napi.py
+++ /dev/null
@@ -1,207 +0,0 @@
-#!/usr/bin/env python
-
-import json
-from urllib2 import Request, urlopen, URLError, HTTPError
-from flask import Flask, json, Response, render_template, make_response, request
-
-## Global Var for ON.Lab local REST ##
-# The GUI can be accessed at <this_host>:9000/onos-topology.html
-RestIP="localhost"
-RestPort=8080
-ONOS_DEFAULT_HOST="localhost" ;# Has to set if LB=False
-DEBUG=1
-controllers=["ubuntu1","ubuntu2","ubuntu3","ubuntu4"]
-
-app = Flask(__name__)
-
-## Worker Functions ##
-def log_error(txt):
-  print '%s' % (txt)
-
-def debug(txt):
-  if DEBUG:
-    print '%s' % (txt)
-
-def node_id(switch_array, dpid):
-  id = -1
-  for i, val in enumerate(switch_array):
-    if val['name'] == dpid:
-      id = i
-      break
-
-  return id
-
-###### ONOS REST API ##############################
-## Worker Func ###
-def get_json(url):
-  code = 200;
-  try:
-    response = urlopen(url)
-  except URLError, e:
-    print "get_json: REST IF %s has issue. Reason: %s" % (url, e.reason)
-    result = ""
-    return (500, result)
-  except HTTPError, e:
-    print "get_json: REST IF %s has issue. Code %s" % (url, e.code)
-    result = ""
-    return (e.code, result)
-
-  result = response.read()
-#  parsedResult = json.loads(result)
-  return (code, result)
-
-### File Fetch ###
-@app.route('/ui/img/<filename>', methods=['GET'])
-@app.route('/img/<filename>', methods=['GET'])
-@app.route('/css/<filename>', methods=['GET'])
-@app.route('/js/models/<filename>', methods=['GET'])
-@app.route('/js/views/<filename>', methods=['GET'])
-@app.route('/js/<filename>', methods=['GET'])
-@app.route('/lib/<filename>', methods=['GET'])
-@app.route('/log/<filename>', methods=['GET'])
-@app.route('/', methods=['GET'])
-@app.route('/<filename>', methods=['GET'])
-@app.route('/tpl/<filename>', methods=['GET'])
-@app.route('/ons-demo/<filename>', methods=['GET'])
-@app.route('/ons-demo/js/<filename>', methods=['GET'])
-@app.route('/ons-demo/d3/<filename>', methods=['GET'])
-@app.route('/ons-demo/css/<filename>', methods=['GET'])
-@app.route('/ons-demo/assets/<filename>', methods=['GET'])
-@app.route('/ons-demo/data/<filename>', methods=['GET'])
-def return_file(filename="index.html"):
-  if request.path == "/":
-    fullpath = "./index.html"
-  else:
-    fullpath = str(request.path)[1:]
-
-  try:
-    open(fullpath)
-  except:
-    response = make_response("Cannot find a file: %s" % (fullpath), 500)
-    response.headers["Content-type"] = "text/html"
-    return response
-
-  response = make_response(open(fullpath).read())
-  suffix = fullpath.split(".")[-1]
-
-  if suffix == "html" or suffix == "htm":
-    response.headers["Content-type"] = "text/html"
-  elif suffix == "js":
-    response.headers["Content-type"] = "application/javascript"
-  elif suffix == "css":
-    response.headers["Content-type"] = "text/css"
-  elif suffix == "png":
-    response.headers["Content-type"] = "image/png"
-  elif suffix == "svg":
-    response.headers["Content-type"] = "image/svg+xml"
-
-  return response
-
-## API for ON.Lab local GUI ##
-@app.route('/topology', methods=['GET'])
-def topology_for_gui():
-  try:
-    url="http://%s:%s/wm/onos/topology/switches/json" % (RestIP, RestPort)
-    (code, result) = get_json(url)
-    parsedResult = json.loads(result)
-  except:
-    log_error("REST IF has issue: %s" % url)
-    log_error("%s" % result)
-    return
-
-  topo = {}
-  switches = []
-  links = []
-  devices = []
-
-  for v in parsedResult:
-    if v.has_key('dpid'):
-#      if v.has_key('dpid') and str(v['state']) == "ACTIVE":#;if you want only ACTIVE nodes
-      dpid = str(v['dpid'])
-      state = str(v['state'])
-      sw = {}
-      sw['name']=dpid
-      sw['group']= -1
-
-      if state == "INACTIVE":
-        sw['group']=0
-      switches.append(sw)
-
-  try:
-    url="http://%s:%s/wm/onos/registry/switches/json" % (RestIP, RestPort)
-    (code, result) = get_json(url)
-    parsedResult = json.loads(result)
-  except:
-    log_error("REST IF has issue: %s" % url)
-    log_error("%s" % result)
-
-  for key in parsedResult:
-    dpid = key
-    ctrl = parsedResult[dpid][0]['controllerId']
-    sw_id = node_id(switches, dpid)
-    if sw_id != -1:
-      if switches[sw_id]['group'] != 0:
-        switches[sw_id]['group'] = controllers.index(ctrl) + 1
-
-  try:
-    url = "http://%s:%s/wm/onos/topology/links/json" % (RestIP, RestPort)
-    (code, result) = get_json(url)
-    parsedResult = json.loads(result)
-  except:
-    log_error("REST IF has issue: %s" % url)
-    log_error("%s" % result)
-    return
-#    sys.exit(0)
-
-  for v in parsedResult:
-    link = {}
-    if v.has_key('dst-switch'):
-      dst_dpid = str(v['dst-switch'])
-      dst_id = node_id(switches, dst_dpid)
-    if v.has_key('src-switch'):
-      src_dpid = str(v['src-switch'])
-      src_id = node_id(switches, src_dpid)
-    link['source'] = src_id
-    link['target'] = dst_id
-
-    #onpath = 0
-    #for (s,d) in path:
-    #  if s == v['src-switch'] and d == v['dst-switch']:
-    #    onpath = 1
-    #    break
-    #link['type'] = onpath
-
-    links.append(link)
-
-  topo['nodes'] = switches
-  topo['links'] = links
-
-  js = json.dumps(topo)
-  resp = Response(js, status=200, mimetype='application/json')
-  return resp
-
-@app.route("/controller_status")
-def controller_status():
-  url= "http://%s:%d/wm/onos/registry/controllers/json" % (RestIP, RestPort)
-  (code, result) = get_json(url)
-  parsedResult = json.loads(result)
-
-  cont_status=[]
-  for i in controllers:
-    status={}
-    if i in parsedResult:
-      onos=1
-    else:
-      onos=0
-    status["name"]=i
-    status["onos"]=onos
-    status["cassandra"]=0
-    cont_status.append(status)
-
-  js = json.dumps(cont_status)
-  resp = Response(js, status=200, mimetype='application/json')
-  return resp
-
-if __name__ == "__main__":
-  app.debug = True
-  app.run(threaded=True, host="0.0.0.0", port=9000)
