diff --git a/tools/test/topos/sol.py b/tools/test/topos/sol.py
new file mode 100644
index 0000000..ef99a9c
--- /dev/null
+++ b/tools/test/topos/sol.py
@@ -0,0 +1,4 @@
+#!/usr/bin/python
+import sys, solar
+topo = solar.Solar(cip=sys.argv[1])
+topo.run()
diff --git a/tools/test/topos/solar.py b/tools/test/topos/solar.py
new file mode 100644
index 0000000..d8e83a1
--- /dev/null
+++ b/tools/test/topos/solar.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+from mininet.cli import CLI
+from mininet.net import Mininet
+from mininet.node import RemoteController, OVSKernelSwitch
+
+MAC = 12
+DPID = 16
+
+class CustomCLI(CLI):
+    """Custom CLI to allow us to add our own commands."""
+
+    def __init__ (self, net):
+        """Init method for our custom CLI."""
+        self.net = net
+        CLI.__init__(self, net)
+
+class Solar(object):
+    """ Create a tiered topology from semi-scratch in Mininet """
+
+    def __init__(self, cname='onos', cip='192.168.56.1', islands=3, edges=2, hosts=2,
+                 proto=None):
+        """Create tower topology for mininet"""
+
+        # We are creating the controller with local-loopback on purpose to avoid
+        # having the switches connect immediately. Instead, we'll set controller
+        # explicitly for each switch after configuring it as we want.
+        self.flare = RemoteController(cname, cip, 6633)
+        self.net = Mininet(controller=self.flare, switch = OVSKernelSwitch,
+                           build=False)
+
+        self.cip = cip
+        self.spines = []
+        self.leaves = []
+        self.hosts = []
+        self.proto = proto
+
+        # Create the two core switches and links between them
+        c1 = self.net.addSwitch('c1',dpid='1111000000000000')
+        c2 = self.net.addSwitch('c2',dpid='2222000000000000')
+        self.spines.append(c1)
+        self.spines.append(c2)
+
+        self.net.addLink(c1, c2)
+        self.net.addLink(c2, c1)
+
+        for i in range(1, islands + 1):
+            sc = self.createSpineClump(i, edges, hosts)
+            self.net.addLink(c1, sc[0])
+            self.net.addLink(c2, sc[0])
+            self.net.addLink(c1, sc[1])
+            self.net.addLink(c2, sc[1])
+
+    def createSpineClump(self, island, edges, hosts):
+        """ Creates a clump of spine and edge switches with hosts"""
+        s1 = self.net.addSwitch('s%1d1' % island,dpid='00000%1d0100000000' % island)
+        s2 = self.net.addSwitch('s%1d2' % island,dpid='00000%1d0200000000' % island)
+        self.net.addLink(s1, s2)
+        self.net.addLink(s2, s1)
+
+        for i in range(1, edges + 1):
+            es = self.createEdgeSwitch(island, i, hosts)
+            self.net.addLink(es, s1)
+            self.net.addLink(es, s2)
+
+        self.spines.append(s1)
+        self.spines.append(s2)
+
+        clump = []
+        clump.append(s1)
+        clump.append(s2)
+        return clump
+
+    def createEdgeSwitch(self, island, index, hosts):
+        """ Creates an edge switch in an island and ads hosts to it"""
+        sw = self.net.addSwitch('e%1d%1d' % (island, index),dpid='0000000%1d0000000%1d' % (island, index))
+        self.leaves.append(sw)
+
+        for j in range(1, hosts + 1):
+            host = self.net.addHost('h%d%d%d' % (island, index, j),ip='10.%d.%d.%d' % (island, index, j))
+            self.net.addLink(host, sw)
+            self.hosts.append(host)
+        return sw
+
+    def run(self):
+        """ Runs the created network topology and launches mininet cli"""
+        self.run_silent()
+        CustomCLI(self.net)
+        self.net.stop()
+
+    def run_silent(self):
+        """ Runs silently - for unit testing """
+        self.net.build()
+
+        # Start the switches, configure them with desired protocols and only
+        # then set the controller
+        for sw in self.spines:
+            sw.start([self.flare])
+            if self.proto:
+                sw.cmd('ovs-vsctl set bridge %(sw)s protocols=%(proto)s' % \
+                           { 'sw': sw.name, 'proto': self.proto})
+            sw.cmdPrint('ovs-vsctl set-controller %(sw)s tcp:%(ctl)s:6633' % \
+                            {'sw': sw.name, 'ctl': self.cip})
+
+        for sw in self.leaves:
+            sw.start([self.flare])
+            sw.cmdPrint('ovs-vsctl set-controller %(sw)s tcp:%(ctl)s:6633' % \
+                            {'sw': sw.name, 'ctl': self.cip})
+
+    def pingAll(self):
+        """ PingAll to create flows - for unit testing """
+        self.net.pingAll()
+
+    def stop(self):
+        "Stops the topology. You should call this after run_silent"
+        self.net.stop()
