Improved CLI. Still need to edit submitted code
diff --git a/cli/cli/c_actions.py b/cli/cli/c_actions.py
index e445315..d90acae 100755
--- a/cli/cli/c_actions.py
+++ b/cli/cli/c_actions.py
@@ -1546,6 +1546,12 @@
             result = []
             if (onos == 1) and (url == 'links'):
                 for entry in entries:
+                    src = entry.get('src')
+                    dst = entry.get('dst')
+                    for tempEntry in entries:
+                        if cmp(src, tempEntry.get('dst')) == 0:
+                            if cmp(dst, tempEntry.get('src')) == 0:
+                                entries.remove(tempEntry)
                     result.append({
                        'src-switch'          : entry['src']['dpid'],
                        'src-port'            : entry['src']['portNumber'],
diff --git a/cli/cli/desc/version200/switch.py b/cli/cli/desc/version200/switch.py
index 6a814f3..c8f65ed 100755
--- a/cli/cli/desc/version200/switch.py
+++ b/cli/cli/desc/version200/switch.py
@@ -951,11 +951,10 @@
     'switch' : {
         'field-orderings' : {
             'default' : [ 'Idx', '@', 'switch-alias', 'connected-since',
-                          'ip-address', 'type'],
+                          'ip-address', 'type', 'controller'],
             'details' : [ 'Idx','@', 'switch-alias', 'connected-since',
-                          'ip-address', 'type'],
-            'brief'   : [ 'Idx', '@', 'switch-alias', 'connected-since',
-                          'ip-address', ],
+                          'ip-address', 'type', 'controller'],
+            'brief'   : [ 'Idx', '@', 'switch-alias', 'controller'],
             },
         'fields' : {
             '@'                  : {
@@ -978,13 +977,14 @@
                                      'formatter' : fmtcnv.decode_switch_actions,
                                    },
             'ip-address'         : {
-                                     'verbose-name' : 'IP Address',
+                                     'verbose-name' : 'Connected At',
                                    },
             'socket-address'     : {
                                    },
             'buffers'            : {
                                    },
             'controller'         : {
+                                     'verbose-name' : 'Controller',
                                    },
             'tables'             : {
                                    },
diff --git a/cli/cli/rest_to_model.py b/cli/cli/rest_to_model.py
index 4c37c87..34506ce 100755
--- a/cli/cli/rest_to_model.py
+++ b/cli/cli/rest_to_model.py
@@ -410,7 +410,23 @@
 
         # this synthetic obj_type's name is 'switches' in an attempt
         # to disabigutate it from 'class Switch'
+        #TODO: Need figure out a better way to get url (Through sdncon framework)
+        url = "http://%s/rest/v1/mastership" % sdnsh.controller
+        try:
+            result2 = sdnsh.store.rest_simple_request(url)
+            check_rest_result(result2)
+            mastership_data = json.loads(result2)
+        except Exception, e:
+            if sdnsh.description:   # description debugging
+                print "get_model_from_url: failed request %s: '%s'" % (url, e)
+            entries = []
         for entry in entries:
+            dpid = entry.get('dpid')
+            if(dpid in mastership_data.keys()):
+                #As there is only one master for switch
+                controller = mastership_data[dpid][0].get('controllerId')
+            else:
+                controller = None
             if switch_match and switch_match != entry['dpid']:
                 continue
             if switch_prefix and not entry['dpid'].startswith(switch_prefix):
@@ -418,9 +434,11 @@
             if onos == 1:
                 result.append({
                    'dpid'                : entry['dpid'],
+                   'switch-alias'        : entry['stringAttributes']['name'],
                    'connected-since'     : entry['stringAttributes']['ConnectedSince'],
-                   'ip-address'          : 0,
-                   'type'                : entry['stringAttributes']['type']
+                   'ip-address'          : entry['stringAttributes']['remoteAddress'],
+                   'type'                : entry['stringAttributes']['type'],
+                   'controller'          : controller
                 })
             else:
                 attrs = entry['attributes']
@@ -476,8 +494,7 @@
                         sw['tcp-port'] = ''
                         sw['connected-since'] = ''
                         result.append(sw)
-                else:
-                    known_dpids[dpid].update(sw)
+                [dpid].update(sw)
     elif obj_type == 'interfaces':
 
         # These are called interfaces because the primary
diff --git a/cli/sdncon/rest/views.py b/cli/sdncon/rest/views.py
index 260933e..7a45dbb 100755
--- a/cli/sdncon/rest/views.py
+++ b/cli/sdncon/rest/views.py
@@ -702,6 +702,15 @@
     return get_sdnplatform_response(url)        
 
 @safe_rest_view
+def do_mastership(request):
+    url = controller_url("onos", "registry", "switches" ,"json")
+    #url = "http://127.0.0.1:8080/wm/onos/registry/switches/json"
+    if request.META['QUERY_STRING']:
+        url += '?' + request.META['QUERY_STRING']
+    return get_sdnplatform_response(url) 
+#'''
+
+@safe_rest_view
 def do_links(request):
     if onos == 0:
         url = controller_url("topology", "links", "json")
diff --git a/cli/sdncon/urls.py b/cli/sdncon/urls.py
index 2abf2bd..b06bd39 100755
--- a/cli/sdncon/urls.py
+++ b/cli/sdncon/urls.py
@@ -38,7 +38,6 @@
     (r'ui/show_link', 'sdncon.ui.views.show_link'),
     (r'ui/show_tunnel', 'sdncon.ui.views.show_tunnel'),
     (r'ui/build_topology', 'sdncon.ui.views.build_topology'),
-    
     # Uncomment the next line to enable the admin:
     (r'^admin/', include(admin.site.urls)),
     (r'accounts/login/$', 'django.contrib.auth.views.login'),
@@ -70,6 +69,7 @@
     (r'^rest/v1/device', 'sdncon.rest.views.do_device'),
     (r'^rest/v1/switches', 'sdncon.rest.views.do_switches'),
     (r'^rest/v1/links', 'sdncon.rest.views.do_links'),
+    (r'^rest/v1/mastership', 'sdncon.rest.views.do_mastership'), 
     (r'^rest/v1/vns/device-interface', 'sdncon.rest.views.do_vns_device_interface'),
     (r'^rest/v1/vns/interface', 'sdncon.rest.views.do_vns_interface'),
     (r'^rest/v1/vns/realtimestats/flow/(?P<vnsName>[A-Za-z0-9_:.|\-]+)/?$', 'sdncon.rest.views.do_vns_realtimestats_flow', {'category': 'vns'}),
diff --git a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
index 72ec404..7fa7560 100644
--- a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
+++ b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
@@ -18,6 +18,7 @@
 package net.floodlightcontroller.core;
 
 import java.io.IOException;
+import java.net.SocketAddress;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
@@ -113,6 +114,12 @@
      * @return whether the switch is still disconnected
      */
     public boolean isConnected();
+    
+    /**
+     * retun the channelSocket ip address with port number
+     * @return channelSocketAddress
+     */
+    public SocketAddress getChannelSocketAddress();
 
     /**
      * Sets whether the switch is connected.
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
index 30b8059..d92719c 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
@@ -18,6 +18,7 @@
  **/
 
 import java.io.IOException;
+import java.net.SocketAddress;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -323,6 +324,10 @@
     public void setChannel(Channel channel) {
         this.channel = channel;
     }
+    @Override
+    public SocketAddress getChannelSocketAddress(){
+        return channel.getRemoteAddress();
+    }
 
     @Override
     public void write(OFMessage m, FloodlightContext bc) throws IOException {
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
index c53ab76..b591044 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
@@ -377,6 +377,12 @@
                 sw.getConnectedSince().toString());
         switchData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
                 AdminStatus.ACTIVE.toString());
+        //setting name from config file.
+        switchData.createStringAttribute("name",
+                ret.getSwitchConfig().getName());
+        //set the switch socketAddress and port
+        switchData.createStringAttribute("remoteAddress",
+                sw.getChannelSocketAddress().toString().substring(1));
         if (ret.getConfigState() == NetworkConfigState.ACCEPT_ADD) {
             Map<String, String> attr = ret.getSwitchConfig().getPublishAttributes();
             for (Entry<String, String> e : attr.entrySet()) {
@@ -389,6 +395,7 @@
                     ConfigState.NOT_CONFIGURED.toString());
         }
         switchData.freeze();
+        System.out.println("getOnosInstanceId().toString():\n\n\n\n\n"+getOnosInstanceId());
         // The Port events
         List<PortData> portDataEntries = new ArrayList<PortData>();
         for (OFPortDesc port : sw.getPorts()) {