GUI -- Created Mock WebSocket Server (runs with node.js)
- moved test scenario events to directory in test branch.

Change-Id: I1f94a9b4c844be1ea2633de0c74d49ebf5a770a7
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex1.json
new file mode 100644
index 0000000..b82fda8
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex1.json
@@ -0,0 +1,19 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000000000000003",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "of:0000000000000003",
+      "3",
+      "",
+      null
+    ],
+    "props": {
+      "latitude": 123.5,
+      "longitude": 67.8,
+      "anotherProp": "foobar"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex2_memo.json b/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex2_memo.json
new file mode 100644
index 0000000..5f519ff
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex2_memo.json
@@ -0,0 +1,24 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000000000000003",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "of:0000000000000003",
+      "3",
+      "",
+      null
+    ],
+    "props": {
+      "latitude": 123.5,
+      "longitude": 67.8,
+      "anotherProp": "foobar"
+    },
+    "metaUi": {
+      "xpc": 57.3,
+      "ypc": 24.86,
+      "and": "other properties the UI wishes to remember..."
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex3.json b/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex3.json
new file mode 100644
index 0000000..e02f712
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex3.json
@@ -0,0 +1,24 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:000000000000000a",
+    "type": "switch",
+    "online": true,
+    "master": "local",
+    "labels": [
+      "",
+      "NWOR",
+      "of:000000000000000a"
+    ],
+    "props": {
+      "latitude": "29.951475",
+      "name": "NWOR",
+      "longitude": "-90.078434"
+    },
+    "location": {
+      "type": "latlng",
+      "lat": 29.951475,
+      "lng": -90.078434
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex1.json
new file mode 100644
index 0000000..a97d15a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex1.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "6A:40:24:F7:9C:2C/-1",
+    "ingress": "6A:40:24:F7:9C:2C/-1/0-of:0000000000000003/2",
+    "egress": "of:0000000000000003/2-6A:40:24:F7:9C:2C/-1/0",
+    "cp": {
+      "device": "of:0000000000000003",
+      "port": 2
+    },
+    "labels": [
+      "unknown",
+      "6A:40:24:F7:9C:2C"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex2.json b/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex2.json
new file mode 100644
index 0000000..d47265b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex2.json
@@ -0,0 +1,27 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "00:00:00:00:00:01/-1",
+    "type": "endstation",
+    "ingress": "00:00:00:00:00:01/-1/0-of:0000000000000001/1",
+    "egress": "of:0000000000000001/1-00:00:00:00:00:01/-1/0",
+    "cp": {
+      "device": "of:0000000000000001",
+      "port": 1
+    },
+    "labels": [
+      "10.0.0.1",
+      "00:00:00:00:00:01"
+    ],
+    "props": {
+      "name": "CMBR",
+      "latitude": "44.37373",
+      "longitude": "-71.109734"
+    },
+    "location": {
+      "type": "latlng",
+      "lat": 44.37373,
+      "lng": -71.109734
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/addInstance_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/addInstance_ex1.json
new file mode 100644
index 0000000..0579c1d
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/addInstance_ex1.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "local",
+    "ip": "127.0.0.1",
+    "online": true,
+    "uiAttached": true,
+    "switches": 25,
+    "labels": [
+      "local",
+      "127.0.0.1"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/addLink_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/addLink_ex1.json
new file mode 100644
index 0000000..f48147f
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/addLink_ex1.json
@@ -0,0 +1,13 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000000000000007/4-of:0000000000000006/1",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000000000000007",
+    "srcPort": "4",
+    "dst": "of:0000000000000006",
+    "dstPort": "1"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/removeDevice_fab.json b/web/gui/src/test/_karma/ev/_capture/rx/removeDevice_fab.json
new file mode 100644
index 0000000..0e8d47a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/removeDevice_fab.json
@@ -0,0 +1,20 @@
+{
+  "__comments__": [
+    "fabricated event",
+    "not sure if this is the actual format",
+    "but we really only care about 'id' being in the payload"
+  ],
+  "event": "removeDevice",
+  "payload": {
+    "id": "of:0000000000000002",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "of:0000000000000002",
+      "2",
+      "",
+      null
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/removeHost_fab.json b/web/gui/src/test/_karma/ev/_capture/rx/removeHost_fab.json
new file mode 100644
index 0000000..4237199
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/removeHost_fab.json
@@ -0,0 +1,22 @@
+{
+  "__comments__": [
+    "fabricated event",
+    "not sure if this is the actual format",
+    "but we really only care about 'id' being in the payload"
+  ],
+  "event": "removeHost",
+  "payload": {
+    "id": "6A:40:24:F7:9C:2C/-1",
+    "ingress": "6A:40:24:F7:9C:2C/-1/0-of:0000000000000003/2",
+    "egress": "of:0000000000000003/2-6A:40:24:F7:9C:2C/-1/0",
+    "cp": {
+      "device": "of:0000000000000003",
+      "port": 2
+    },
+    "labels": [
+      "unknown",
+      "6A:40:24:F7:9C:2C"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/removeInstance_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/removeInstance_ex1.json
new file mode 100644
index 0000000..0f9388b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/removeInstance_ex1.json
@@ -0,0 +1,7 @@
+{
+  "event": "removeInstance",
+  "payload": {
+    "id": "onos-1",
+    "online": "false"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/removeLink_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/removeLink_ex1.json
new file mode 100644
index 0000000..8d1dd03
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/removeLink_ex1.json
@@ -0,0 +1,12 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000000000000001/1-of:0000000000000002/4",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000000000000001",
+    "srcPort": "1",
+    "dst": "of:0000000000000002",
+    "dstPort": "4"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex1_host.json b/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex1_host.json
new file mode 100644
index 0000000..19d9959
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex1_host.json
@@ -0,0 +1,22 @@
+{
+  "event": "showDetails",
+  "sid": 9,
+  "payload": {
+    "id": "CA:4B:EE:A4:B0:33/-1",
+    "type": "host",
+    "propOrder": [
+      "MAC",
+      "IP",
+      "-",
+      "Latitude",
+      "Longitude"
+    ],
+    "props": {
+      "MAC": "CA:4B:EE:A4:B0:33",
+      "IP": "[10.0.0.1]",
+      "-": "",
+      "Latitude": null,
+      "Longitude": null
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex2_device.json b/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex2_device.json
new file mode 100644
index 0000000..8ac1f4f
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex2_device.json
@@ -0,0 +1,33 @@
+{
+  "event": "showDetails",
+  "sid": 37,
+  "payload": {
+    "id": "of:000000000000000a",
+    "type": "switch",
+    "propOrder": [
+      "Name",
+      "Vendor",
+      "H/W Version",
+      "S/W Version",
+      "Serial Number",
+      "-",
+      "Latitude",
+      "Longitude",
+      "Ports",
+      "-",
+      "Master"
+    ],
+    "props": {
+      "Name": null,
+      "Vendor": "Nicira, Inc.",
+      "H/W Version": "Open vSwitch",
+      "S/W Version": "2.0.1",
+      "Serial Number": "None",
+      "-": "",
+      "Latitude": null,
+      "Longitude": null,
+      "Ports": "5",
+      "Master":"local"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/showSummary_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/showSummary_ex1.json
new file mode 100644
index 0000000..4d5bd30
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/showSummary_ex1.json
@@ -0,0 +1,30 @@
+{
+  "event": "showSummary",
+  "sid": 1,
+  "payload": {
+    "id": "ONOS Summary",
+    "type": "node",
+    "propOrder": [
+      "Devices",
+      "Links",
+      "Hosts",
+      "Topology SCCs",
+      "Paths",
+      "-",
+      "Intents",
+      "Flows",
+      "Version"
+    ],
+    "props": {
+      "Devices": "25",
+      "Links": "112",
+      "Hosts": "25",
+      "Topology SCCs": "1",
+      "Paths": "1,272",
+      "-": "",
+      "Intents": "0",
+      "Flows": "0",
+      "Version": "1.0.0*"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex1.json
new file mode 100644
index 0000000..bed7cdd
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex1.json
@@ -0,0 +1,48 @@
+{
+  "event": "showTraffic",
+  "sid":63,
+  "payload": {
+    "paths": [
+      {
+        "class": "primary",
+        "traffic": false,
+        "links": [
+          "1E:10:D9:A2:84:E2/-1/0-of:0000000000000003/1",
+          "of:0000000000000003/4-of:0000000000000002/1",
+          "of:0000000000000002/4-of:0000000000000001/1",
+          "of:0000000000000001/2-of:0000000000000006/4",
+          "of:0000000000000006/2-of:0000000000000008/4",
+          "of:0000000000000008/3-9E:0B:E0:38:98:DE/-1/0"
+        ],
+        "labels": [
+          "",
+          "",
+          "",
+          "",
+          "",
+          ""
+        ]
+      },
+      {
+        "class": "primary",
+        "traffic": false,
+        "links": [
+          "9E:0B:E0:38:98:DE/-1/0-of:0000000000000008/3",
+          "of:0000000000000008/4-of:0000000000000006/2",
+          "of:0000000000000006/4-of:0000000000000001/2",
+          "of:0000000000000001/1-of:0000000000000002/4",
+          "of:0000000000000002/1-of:0000000000000003/4",
+          "of:0000000000000003/1-1E:10:D9:A2:84:E2/-1/0"
+        ],
+        "labels": [
+          "",
+          "",
+          "",
+          "",
+          "",
+          ""
+        ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex2_animated.json b/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex2_animated.json
new file mode 100644
index 0000000..610b516
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex2_animated.json
@@ -0,0 +1,88 @@
+{
+  "event": "showTraffic",
+  "sid": 227,
+  "payload": {
+    "paths": [
+      {
+        "class": "primary animated",
+        "traffic": true,
+        "links": [
+          "02:D7:91:9F:4B:E8/-1/0-of:0000000000000004/1",
+          "of:0000000000000004/4-of:0000000000000002/2",
+          "of:0000000000000002/4-of:0000000000000001/1",
+          "of:0000000000000001/2-of:0000000000000006/4",
+          "of:0000000000000006/2-of:0000000000000008/4",
+          "of:0000000000000008/3-9E:0B:E0:38:98:DE/-1/0"
+        ],
+        "labels": [
+          "",
+          "Load{rate=98, latest=37898}",
+          "",
+          "",
+          "",
+          "Load{rate=98, latest=38080}"
+        ]
+      },
+      {
+        "class": "primary animated",
+        "traffic": true,
+        "links": [
+          "9E:0B:E0:38:98:DE/-1/0-of:0000000000000008/3",
+          "of:0000000000000008/4-of:0000000000000006/2",
+          "of:0000000000000006/4-of:0000000000000001/2",
+          "of:0000000000000001/1-of:0000000000000002/4",
+          "of:0000000000000002/2-of:0000000000000004/4",
+          "of:0000000000000004/1-02:D7:91:9F:4B:E8/-1/0"
+        ],
+        "labels": [
+          "",
+          "",
+          "Load{rate=98, latest=38178}",
+          "",
+          "Load{rate=98, latest=37898}",
+          "Load{rate=98, latest=37898}"
+        ]
+      },
+      {
+        "class": "primary animated",
+        "traffic": true,
+        "links": [
+          "1E:10:D9:A2:84:E2/-1/0-of:0000000000000003/1",
+          "of:0000000000000003/4-of:0000000000000002/1",
+          "of:0000000000000002/4-of:0000000000000001/1",
+          "of:0000000000000001/2-of:0000000000000006/4",
+          "of:0000000000000006/2-of:0000000000000008/4",
+          "of:0000000000000008/3-9E:0B:E0:38:98:DE/-1/0"
+        ],
+        "labels": [
+          "",
+          "",
+          "",
+          "",
+          "",
+          "Load{rate=98, latest=38080}"
+        ]
+      },
+      {
+        "class": "primary animated",
+        "traffic": true,
+        "links": [
+          "9E:0B:E0:38:98:DE/-1/0-of:0000000000000008/3",
+          "of:0000000000000008/4-of:0000000000000006/2",
+          "of:0000000000000006/4-of:0000000000000001/2",
+          "of:0000000000000001/1-of:0000000000000002/4",
+          "of:0000000000000002/1-of:0000000000000003/4",
+          "of:0000000000000003/1-1E:10:D9:A2:84:E2/-1/0"
+        ],
+        "labels": [
+          "",
+          "",
+          "Load{rate=98, latest=38178}",
+          "",
+          "",
+          ""
+        ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex3_none.json b/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex3_none.json
new file mode 100644
index 0000000..4acd829
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex3_none.json
@@ -0,0 +1,7 @@
+{
+  "event": "showTraffic",
+  "sid": 11,
+  "payload": {
+    "paths": []
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex1.json
new file mode 100644
index 0000000..dda6186
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex1.json
@@ -0,0 +1,15 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000000000000002",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "of:0000000000000002",
+      "2",
+      "",
+      null
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex2.json b/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex2.json
new file mode 100644
index 0000000..d607f98
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex2.json
@@ -0,0 +1,15 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000000000000002",
+    "type": "switch",
+    "online": false,
+    "labels": [
+      "of:0000000000000002",
+      "2",
+      "",
+      null
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/updateHost.json b/web/gui/src/test/_karma/ev/_capture/rx/updateHost.json
new file mode 100644
index 0000000..fd7361c
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/updateHost.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateHost",
+  "payload": {
+    "id": "AA:C2:74:3F:B8:06/-1",
+    "ingress": "AA:C2:74:3F:B8:06/-1/0-of:0000000000000005/3",
+    "egress": "of:0000000000000005/3-AA:C2:74:3F:B8:06/-1/0",
+    "cp": {
+      "device": "of:0000000000000005",
+      "port": 3
+    },
+    "labels": [
+      "10.0.0.9",
+      "AA:C2:74:3F:B8:06"
+    ],
+    "props":{}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/updateInstance_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/updateInstance_ex1.json
new file mode 100644
index 0000000..e8cf9e8
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/updateInstance_ex1.json
@@ -0,0 +1,7 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-1",
+    "online": "false"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/rx/updateLink_ex1.json b/web/gui/src/test/_karma/ev/_capture/rx/updateLink_ex1.json
new file mode 100644
index 0000000..3be5c5f
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/rx/updateLink_ex1.json
@@ -0,0 +1,12 @@
+{
+  "event": "updateLink",
+  "payload": {
+    "id": "of:0000000000000002/4-of:0000000000000001/1",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000000000000002",
+    "srcPort": "4",
+    "dst": "of:0000000000000001",
+    "dstPort": "1"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/cancelSummary_ex1.json b/web/gui/src/test/_karma/ev/_capture/tx/cancelSummary_ex1.json
new file mode 100644
index 0000000..6418471
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/cancelSummary_ex1.json
@@ -0,0 +1,5 @@
+{
+  "event": "cancelSummary",
+  "sid": 2,
+  "payload": {}
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex1.json b/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex1.json
new file mode 100644
index 0000000..6c88605
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex1.json
@@ -0,0 +1,9 @@
+{
+  "event": "requestDetails",
+  "sid": 15,
+  "payload": {
+    "id": "of:0000000000000003",
+    "class": "device"
+  }
+}
+
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex2.json b/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex2.json
new file mode 100644
index 0000000..2cc1bfa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex2.json
@@ -0,0 +1,8 @@
+{
+  "event": "requestDetails",
+  "sid": 9,
+  "payload": {
+    "id": "CA:4B:EE:A4:B0:33/-1",
+    "class": "host"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/requestSummary_ex1.json b/web/gui/src/test/_karma/ev/_capture/tx/requestSummary_ex1.json
new file mode 100644
index 0000000..448d027
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/requestSummary_ex1.json
@@ -0,0 +1,5 @@
+{
+  "event": "requestSummary",
+  "sid": 1,
+  "payload": {}
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex1_devs.json b/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex1_devs.json
new file mode 100644
index 0000000..5c00b71
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex1_devs.json
@@ -0,0 +1,12 @@
+{
+  "event": "requestTraffic",
+  "sid": 6,
+  "payload": {
+    "ids": [
+      "of:0000000000000007",
+      "of:000000000000000c",
+      "of:000000000000000a"
+    ],
+    "hover": ""
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex2_hosts.json b/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex2_hosts.json
new file mode 100644
index 0000000..3d7bb2d
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex2_hosts.json
@@ -0,0 +1,13 @@
+{
+  "event": "requestTraffic",
+  "sid": 12,
+  "payload": {
+    "ids": [
+      "86:C3:7B:90:79:CD/-1",
+      "22:BA:28:81:FD:45/-1",
+      "BA:91:F6:8E:B6:B6/-1",
+      "06:E2:E6:F7:03:12/-1"
+    ],
+    "hover": ""
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex3_devs_hosts.json b/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex3_devs_hosts.json
new file mode 100644
index 0000000..1757b44
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex3_devs_hosts.json
@@ -0,0 +1,13 @@
+{
+  "event": "requestTraffic",
+  "sid": 18,
+  "payload": {
+    "ids": [
+      "of:0000000000000001",
+      "86:C3:7B:90:79:CD/-1",
+      "7E:D2:EE:0F:12:4A/-1",
+      "of:000000000000000c"
+    ],
+    "hover": ""
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex4_hover.json b/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex4_hover.json
new file mode 100644
index 0000000..b86e03a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex4_hover.json
@@ -0,0 +1,8 @@
+{
+  "event": "requestTraffic",
+  "sid": 48,
+  "payload": {
+    "ids": [],
+    "hover": "9E:0B:E0:38:98:DE/-1"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/_capture/tx/updateMeta_ex1.json b/web/gui/src/test/_karma/ev/_capture/tx/updateMeta_ex1.json
new file mode 100644
index 0000000..6114583
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/_capture/tx/updateMeta_ex1.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateMeta",
+  "sid": 11,
+  "payload": {
+    "id": "62:4F:65:BF:FF:B3/-1",
+    "class": "host",
+    "memento": {
+      "xpc": 57.3,
+      "ypc": 24.86,
+      "and": "other properties the UI wishes to remember..."
+    }
+  }
+}
+
diff --git a/web/gui/src/test/_karma/ev/colors/ev_10_onos.json b/web/gui/src/test/_karma/ev/colors/ev_10_onos.json
new file mode 100644
index 0000000..b4685cb
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_10_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff03",
+    "type": "roadm",
+    "online": true,
+    "master": "192.168.56.101",
+    "labels": [
+      "",
+      "opt-3",
+      "0000ffffffffff03"
+    ],
+    "metaUi": {
+      "x": 282,
+      "y": 603
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_11_onos.json b/web/gui/src/test/_karma/ev/colors/ev_11_onos.json
new file mode 100644
index 0000000..0fde1c0
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_11_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0009",
+    "type": "switch",
+    "online": false,
+    "master": "onos-2",
+    "labels": [
+      "",
+      "sw-9",
+      "0000ffffffff0009"
+    ],
+    "metaUi": {
+      "x": 884,
+      "y": 477
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_12_onos.json b/web/gui/src/test/_karma/ev/colors/ev_12_onos.json
new file mode 100644
index 0000000..4f3af68
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_12_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff09",
+    "type": "roadm",
+    "online": false,
+    "master": "onos-2",
+    "labels": [
+      "",
+      "opt-9",
+      "0000ffffffffff09"
+    ],
+    "metaUi": {
+      "x": 884,
+      "y": 577
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_13_onos.json b/web/gui/src/test/_karma/ev/colors/ev_13_onos.json
new file mode 100644
index 0000000..5633802
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_13_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-slave",
+    "ip": "192.168.24.11",
+    "online": true,
+    "uiAttached": false,
+    "switches": 103,
+    "labels": [
+      "onos-slave",
+      "192.168.24.11"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_14_onos.json b/web/gui/src/test/_karma/ev/colors/ev_14_onos.json
new file mode 100644
index 0000000..f8a9186
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_14_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "removeInstance",
+  "payload": {
+    "id": "onos-leader",
+    "ip": "192.168.0.5",
+    "online": false,
+    "uiAttached": false,
+    "switches": 0,
+    "labels": [
+      "onos-leader",
+      "192.168.0.5"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_15_onos.json b/web/gui/src/test/_karma/ev/colors/ev_15_onos.json
new file mode 100644
index 0000000..eef2964
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_15_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-leader",
+    "ip": "192.168.0.5",
+    "online": true,
+    "uiAttached": false,
+    "switches": 0,
+    "labels": [
+      "onos-leader",
+      "192.168.0.5"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_16_onos.json b/web/gui/src/test/_karma/ev/colors/ev_16_onos.json
new file mode 100644
index 0000000..1367251
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_16_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-6",
+    "ip": "192.168.0.66",
+    "online": true,
+    "uiAttached": false,
+    "switches": 0,
+    "labels": [
+      "onos-6",
+      "192.168.0.66"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_17_onos.json b/web/gui/src/test/_karma/ev/colors/ev_17_onos.json
new file mode 100644
index 0000000..c080d56
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_17_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-7",
+    "ip": "192.168.0.77",
+    "online": true,
+    "uiAttached": false,
+    "switches": 0,
+    "labels": [
+      "onos-7",
+      "192.168.0.77"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_18_onos.json b/web/gui/src/test/_karma/ev/colors/ev_18_onos.json
new file mode 100644
index 0000000..c195585
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_18_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-master",
+    "ip": "192.168.0.7",
+    "online": true,
+    "uiAttached": false,
+    "switches": 300,
+    "labels": [
+      "onos-master",
+      "192.168.0.7"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_19_onos.json b/web/gui/src/test/_karma/ev/colors/ev_19_onos.json
new file mode 100644
index 0000000..bd536da
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_19_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0002",
+    "type": "switch",
+    "online": false,
+    "master": "192.168.56.101",
+    "labels": [
+      "",
+      "sw-2",
+      "0000ffffffff0002"
+    ],
+    "metaUi": {
+      "x": 142,
+      "y": 503
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_1_onos.json b/web/gui/src/test/_karma/ev/colors/ev_1_onos.json
new file mode 100644
index 0000000..0fac1a1
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_1_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "192.168.56.101",
+    "ip": "192.168.56.101",
+    "online": true,
+    "uiAttached": true,
+    "switches": 4,
+    "labels": [
+      "192.168.56.101",
+      "192.168.56.101"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_20_onos.json b/web/gui/src/test/_karma/ev/colors/ev_20_onos.json
new file mode 100644
index 0000000..faf0a77
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_20_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff02",
+    "type": "roadm",
+    "online": false,
+    "master": "192.168.56.101",
+    "labels": [
+      "",
+      "opt-2",
+      "0000ffffffffff02"
+    ],
+    "metaUi": {
+      "x": 142,
+      "y": 603
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_21_onos.json b/web/gui/src/test/_karma/ev/colors/ev_21_onos.json
new file mode 100644
index 0000000..5d44197
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_21_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0006",
+    "type": "switch",
+    "online": false,
+    "master": "onos-master",
+    "labels": [
+      "",
+      "sw-6",
+      "0000ffffffff0006"
+    ],
+    "metaUi": {
+      "x": 382,
+      "y": 333
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_22_onos.json b/web/gui/src/test/_karma/ev/colors/ev_22_onos.json
new file mode 100644
index 0000000..02e3d6e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_22_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff000a",
+    "type": "switch",
+    "online": true,
+    "master": "onos-slave",
+    "labels": [
+      "",
+      "sw-A",
+      "0000ffffffff000a"
+    ],
+    "metaUi": {
+      "x": 195,
+      "y": 259
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_23_onos.json b/web/gui/src/test/_karma/ev/colors/ev_23_onos.json
new file mode 100644
index 0000000..547d6a0
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_23_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff000b",
+    "type": "switch",
+    "online": false,
+    "master": "onos-slave",
+    "labels": [
+      "",
+      "sw-B",
+      "0000ffffffff000b"
+    ],
+    "metaUi": {
+      "x": 52,
+      "y": 262
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_24_onos.json b/web/gui/src/test/_karma/ev/colors/ev_24_onos.json
new file mode 100644
index 0000000..d7de3c1
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_24_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff000c",
+    "type": "switch",
+    "online": true,
+    "master": "onos-leader",
+    "labels": [
+      "",
+      "sw-C",
+      "0000ffffffff000c"
+    ],
+    "metaUi": {
+      "x": 229,
+      "y": 354
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_25_onos.json b/web/gui/src/test/_karma/ev/colors/ev_25_onos.json
new file mode 100644
index 0000000..cade64c
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_25_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff000d",
+    "type": "switch",
+    "online": false,
+    "master": "onos-leader",
+    "labels": [
+      "",
+      "sw-D",
+      "0000ffffffff000d"
+    ],
+    "metaUi": {
+      "x": 100,
+      "y": 357
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_26_onos.json b/web/gui/src/test/_karma/ev/colors/ev_26_onos.json
new file mode 100644
index 0000000..9f21a7c
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_26_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff000e",
+    "type": "switch",
+    "online": true,
+    "master": "onos-6",
+    "labels": [
+      "",
+      "sw-E",
+      "0000ffffffff000e"
+    ],
+    "metaUi": {
+      "x": 757,
+      "y": 267
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_27_onos.json b/web/gui/src/test/_karma/ev/colors/ev_27_onos.json
new file mode 100644
index 0000000..9f9b70a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_27_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff000f",
+    "type": "switch",
+    "online": false,
+    "master": "onos-6",
+    "labels": [
+      "",
+      "sw-F",
+      "0000ffffffff000f"
+    ],
+    "metaUi": {
+      "x": 877,
+      "y": 267
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_28_onos.json b/web/gui/src/test/_karma/ev/colors/ev_28_onos.json
new file mode 100644
index 0000000..a60b43e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_28_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0010",
+    "type": "switch",
+    "online": true,
+    "master": "onos-7",
+    "labels": [
+      "",
+      "sw-1-0",
+      "0000ffffffff0010"
+    ],
+    "metaUi": {
+      "x": 442,
+      "y": 508
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_29_onos.json b/web/gui/src/test/_karma/ev/colors/ev_29_onos.json
new file mode 100644
index 0000000..ae45cd2
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_29_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0011",
+    "type": "switch",
+    "online": false,
+    "master": "onos-7",
+    "labels": [
+      "",
+      "sw-1-1",
+      "0000ffffffff0011"
+    ],
+    "metaUi": {
+      "x": 576,
+      "y": 519
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_2_onos.json b/web/gui/src/test/_karma/ev/colors/ev_2_onos.json
new file mode 100644
index 0000000..bbc587a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_2_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-2",
+    "ip": "192.168.0.2",
+    "online": true,
+    "uiAttached": false,
+    "switches": 3,
+    "labels": [
+      "onos-2",
+      "192.168.0.2"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_30_onos.json b/web/gui/src/test/_karma/ev/colors/ev_30_onos.json
new file mode 100644
index 0000000..327e264
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_30_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "192.168.56.101",
+    "ip": "192.168.56.101",
+    "online": false,
+    "uiAttached": false,
+    "switches": 4,
+    "labels": [
+      "192.168.56.101",
+      "192.168.56.101"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_31_onos.json b/web/gui/src/test/_karma/ev/colors/ev_31_onos.json
new file mode 100644
index 0000000..dad87a2
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_31_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-2",
+    "ip": "192.168.0.2",
+    "online": false,
+    "uiAttached": false,
+    "switches": 3,
+    "labels": [
+      "onos-2",
+      "192.168.0.2"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_32_onos.json b/web/gui/src/test/_karma/ev/colors/ev_32_onos.json
new file mode 100644
index 0000000..6efdfc5
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_32_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-leader",
+    "ip": "192.168.0.5",
+    "online": false,
+    "uiAttached": false,
+    "switches": 0,
+    "labels": [
+      "onos-leader",
+      "192.168.0.5"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_33_onos.json b/web/gui/src/test/_karma/ev/colors/ev_33_onos.json
new file mode 100644
index 0000000..2751055
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_33_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-master",
+    "ip": "192.168.0.7",
+    "online": true,
+    "uiAttached": true,
+    "switches": 300,
+    "labels": [
+      "onos-master",
+      "192.168.0.7"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_34_onos.json b/web/gui/src/test/_karma/ev/colors/ev_34_onos.json
new file mode 100644
index 0000000..1cab6fd
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_34_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-slave",
+    "ip": "192.168.0.11",
+    "online": false,
+    "uiAttached": false,
+    "switches": 17,
+    "labels": [
+      "onos-slave",
+      "192.168.0.11"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_35_onos.json b/web/gui/src/test/_karma/ev/colors/ev_35_onos.json
new file mode 100644
index 0000000..142bd36
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_35_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-6",
+    "ip": "192.168.0.66",
+    "online": false,
+    "uiAttached": false,
+    "switches": 17,
+    "labels": [
+      "onos-6",
+      "192.168.0.66"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_36_onos.json b/web/gui/src/test/_karma/ev/colors/ev_36_onos.json
new file mode 100644
index 0000000..a4d8dfa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_36_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-7",
+    "ip": "192.168.0.77",
+    "online": false,
+    "uiAttached": false,
+    "switches": 17,
+    "labels": [
+      "onos-7",
+      "192.168.0.77"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_37_onos.json b/web/gui/src/test/_karma/ev/colors/ev_37_onos.json
new file mode 100644
index 0000000..a5cef11
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_37_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "192.168.56.101",
+    "ip": "192.168.56.101",
+    "online": true,
+    "uiAttached": true,
+    "switches": 4,
+    "labels": [
+      "192.168.56.101",
+      "192.168.56.101"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_38_onos.json b/web/gui/src/test/_karma/ev/colors/ev_38_onos.json
new file mode 100644
index 0000000..65cae8d
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_38_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-master",
+    "ip": "192.168.0.7",
+    "online": false,
+    "uiAttached": false,
+    "switches": 300,
+    "labels": [
+      "onos-master",
+      "192.168.0.7"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_3_onos.json b/web/gui/src/test/_karma/ev/colors/ev_3_onos.json
new file mode 100644
index 0000000..f7e1f49
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_3_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-leader",
+    "ip": "192.168.0.5",
+    "online": false,
+    "uiAttached": false,
+    "switches": 0,
+    "labels": [
+      "onos-leader",
+      "192.168.0.5"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_4_onos.json b/web/gui/src/test/_karma/ev/colors/ev_4_onos.json
new file mode 100644
index 0000000..3eeb99a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_4_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-master",
+    "ip": "192.168.0.7",
+    "online": false,
+    "uiAttached": false,
+    "switches": 300,
+    "labels": [
+      "onos-master",
+      "192.168.0.7"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_5_onos.json b/web/gui/src/test/_karma/ev/colors/ev_5_onos.json
new file mode 100644
index 0000000..a41e1d7
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_5_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-slave",
+    "ip": "192.168.0.11",
+    "online": false,
+    "uiAttached": false,
+    "switches": 17,
+    "labels": [
+      "onos-slave",
+      "192.168.0.11"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_6_onos.json b/web/gui/src/test/_karma/ev/colors/ev_6_onos.json
new file mode 100644
index 0000000..d19a508
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_6_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0008",
+    "type": "switch",
+    "online": true,
+    "master": "onos-2",
+    "labels": [
+      "",
+      "sw-8",
+      "0000ffffffff0008"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 477
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_7_onos.json b/web/gui/src/test/_karma/ev/colors/ev_7_onos.json
new file mode 100644
index 0000000..d382b7c
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_7_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0003",
+    "type": "switch",
+    "online": true,
+    "master": "192.168.56.101",
+    "labels": [
+      "",
+      "sw-3",
+      "0000ffffffff0003"
+    ],
+    "metaUi": {
+      "x": 282,
+      "y": 503
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_8_onos.json b/web/gui/src/test/_karma/ev/colors/ev_8_onos.json
new file mode 100644
index 0000000..7967c0e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_8_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0007",
+    "type": "switch",
+    "online": true,
+    "master": "onos-master",
+    "labels": [
+      "",
+      "sw-7",
+      "0000ffffffff0007"
+    ],
+    "metaUi": {
+      "x": 530,
+      "y": 330
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/ev_9_onos.json b/web/gui/src/test/_karma/ev/colors/ev_9_onos.json
new file mode 100644
index 0000000..ff160d6
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/ev_9_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff08",
+    "type": "roadm",
+    "online": true,
+    "master": "onos-2",
+    "labels": [
+      "",
+      "opt-8",
+      "0000ffffffffff08"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 577
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/colors/scenario.json b/web/gui/src/test/_karma/ev/colors/scenario.json
new file mode 100644
index 0000000..dd17828
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/colors/scenario.json
@@ -0,0 +1,13 @@
+{
+  "comments": [
+    "Tweaking Colors"
+  ],
+  "title": "Color-Tweaking Scenario",
+  "params": {
+    "lastAuto": 29
+  },
+  "description": [
+    "Press '=' to load initial events.",
+    "Press '-' to fire further events."
+  ]
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_10_onos.json b/web/gui/src/test/_karma/ev/instances/ev_10_onos.json
new file mode 100644
index 0000000..4a289d8
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_10_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/4-of:0000ffffffffff03/1",
+    "type": "pktopt",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "4",
+    "dst": "of:0000ffffffffff03",
+    "dstPort": "1",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_11_onos.json b/web/gui/src/test/_karma/ev/instances/ev_11_onos.json
new file mode 100644
index 0000000..70dc216
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_11_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/9-of:0000ffffffff0007/2",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "9",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "2",
+    "props" : {
+      "BW": "120 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_12_onos.json b/web/gui/src/test/_karma/ev/instances/ev_12_onos.json
new file mode 100644
index 0000000..78e6a39
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_12_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/2-of:0000ffffffff0003/1",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "2",
+    "dst": "of:0000ffffffff0003",
+    "dstPort": "1",
+    "props" : {
+      "BW": "70 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_13_onos.json b/web/gui/src/test/_karma/ev/instances/ev_13_onos.json
new file mode 100644
index 0000000..d9d27e7
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_13_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/4-of:0000ffffffff0007/1",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "4",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "1",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_14_onos.json b/web/gui/src/test/_karma/ev/instances/ev_14_onos.json
new file mode 100644
index 0000000..89435bc
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_14_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff08/4-of:0000ffffffffff03/1",
+    "type": "optical",
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff08",
+    "srcPort": "4",
+    "dst": "of:0000ffffffffff03",
+    "dstPort": "1",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_15_onos.json b/web/gui/src/test/_karma/ev/instances/ev_15_onos.json
new file mode 100644
index 0000000..af031a6
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_15_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:aa/-1",
+    "ingress": "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/101",
+    "egress": "of:0000ffffffff0008/101-0E:2A:69:30:13:aa/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0008",
+      "port": 101
+    },
+    "labels": [
+      "12.13.14.15",
+      "0E:2A:69:30:13:aa"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_16_onos.json b/web/gui/src/test/_karma/ev/instances/ev_16_onos.json
new file mode 100644
index 0000000..6efcda9
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_16_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:88/-1",
+    "ingress": "0E:2A:69:30:13:88/-1/0-of:0000ffffffff0007/101",
+    "egress": "of:0000ffffffff0007/101-0E:2A:69:30:13:86/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0007",
+      "port": 101
+    },
+    "labels": [
+      "4.5.7.6",
+      "0E:2A:69:30:13:88"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_17_onos.json b/web/gui/src/test/_karma/ev/instances/ev_17_onos.json
new file mode 100644
index 0000000..a5ee5c9
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_17_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:86/-1",
+    "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+    "egress": "of:0000ffffffff0003/101-0E:2A:69:30:13:86/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0003",
+      "port": 101
+    },
+    "labels": [
+      "1.2.3.4",
+      "0E:2A:69:30:13:86"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_18_onos.json b/web/gui/src/test/_karma/ev/instances/ev_18_onos.json
new file mode 100644
index 0000000..4168e11
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_18_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-3",
+    "ip": "192.168.3.3",
+    "online": true,
+    "uiAttached": false,
+    "switches": 2,
+    "labels": [
+      "onos-3",
+      "192.168.3.3"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_19_onos.json b/web/gui/src/test/_karma/ev/instances/ev_19_onos.json
new file mode 100644
index 0000000..2e95539
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_19_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "updateInstance",
+  "payload": {
+    "id": "onos-3",
+    "ip": "192.168.3.3",
+    "online": false,
+    "uiAttached": false,
+    "switches": 2,
+    "labels": [
+      "onos-3",
+      "192.168.3.3"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_1_onos.json b/web/gui/src/test/_karma/ev/instances/ev_1_onos.json
new file mode 100644
index 0000000..287538e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_1_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "192.168.56.101",
+    "ip": "192.168.56.101",
+    "online": true,
+    "uiAttached": false,
+    "switches": 2,
+    "labels": [
+      "192.168.56.101",
+      "127.0.0.1"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_2_onos.json b/web/gui/src/test/_karma/ev/instances/ev_2_onos.json
new file mode 100644
index 0000000..bbf6c64
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_2_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-2",
+    "ip": "192.168.2.2",
+    "online": true,
+    "uiAttached": true,
+    "switches": 1,
+    "labels": [
+      "onos-2",
+      "192.168.2.2"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_3_onos.json b/web/gui/src/test/_karma/ev/instances/ev_3_onos.json
new file mode 100644
index 0000000..0459e10
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_3_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "onos-3",
+    "ip": "192.168.3.3",
+    "online": false,
+    "uiAttached": false,
+    "switches": 2,
+    "labels": [
+      "onos-3",
+      "192.168.3.3"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_4_onos.json b/web/gui/src/test/_karma/ev/instances/ev_4_onos.json
new file mode 100644
index 0000000..f1abeeb
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_4_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0008",
+    "type": "switch",
+    "online": true,
+    "master": "onos-3",
+    "labels": [
+      "0000ffffffff0008",
+      "FF:FF:FF:FF:00:08",
+      "sw-8"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 477
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_5_onos.json b/web/gui/src/test/_karma/ev/instances/ev_5_onos.json
new file mode 100644
index 0000000..d99b0fe
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_5_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0003",
+    "type": "switch",
+    "online": true,
+    "master": "192.168.56.101",
+    "labels": [
+      "0000ffffffff0003",
+      "FF:FF:FF:FF:00:03",
+      "sw-3"
+    ],
+    "metaUi": {
+      "x": 282,
+      "y": 503
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_6_onos.json b/web/gui/src/test/_karma/ev/instances/ev_6_onos.json
new file mode 100644
index 0000000..2f58f61
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_6_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0007",
+    "type": "switch",
+    "online": true,
+    "master": "onos-2",
+    "labels": [
+      "0000ffffffff0007",
+      "FF:FF:FF:FF:00:07",
+      "sw-7"
+    ],
+    "metaUi": {
+      "x": 530,
+      "y": 330
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_7_onos.json b/web/gui/src/test/_karma/ev/instances/ev_7_onos.json
new file mode 100644
index 0000000..33f2967
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_7_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff08",
+    "type": "roadm",
+    "online": true,
+    "master": "onos-3",
+    "labels": [
+      "0000ffffffffff08",
+      "FF:FF:FF:FF:FF:08",
+      "opt-8"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 577
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_8_onos.json b/web/gui/src/test/_karma/ev/instances/ev_8_onos.json
new file mode 100644
index 0000000..d3bb143
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_8_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff03",
+    "type": "roadm",
+    "online": true,
+    "master": "192.168.56.101",
+    "labels": [
+      "0000ffffffffff03",
+      "FF:FF:FF:FF:FF:03",
+      "opt-3"
+    ],
+    "metaUi": {
+      "x": 282,
+      "y": 603
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/ev_9_onos.json b/web/gui/src/test/_karma/ev/instances/ev_9_onos.json
new file mode 100644
index 0000000..115858a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/ev_9_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/4-of:0000ffffffffff08/1",
+    "type": "pktopt",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "4",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "1",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/instances/scenario.json b/web/gui/src/test/_karma/ev/instances/scenario.json
new file mode 100644
index 0000000..503edfc
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/instances/scenario.json
@@ -0,0 +1,16 @@
+{
+  "comments": [
+    "Developing ONOS instance visualization"
+  ],
+  "title": "ONOS Instance Scenario",
+  "params": {
+    "lastAuto": 17
+  },
+  "description": [
+    "Press 'I' to show instance pane.",
+    "Press 'H' to show hosts.",
+    "",
+    "Press '=' to load initial events.",
+    "Press '-' to fire further events."
+  ]
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/ev_1_ui.json b/web/gui/src/test/_karma/ev/intentSketch/ev_1_ui.json
new file mode 100644
index 0000000..962fcaa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/ev_1_ui.json
@@ -0,0 +1,8 @@
+{
+  "event": "addHostIntent",
+  "sid": 1,
+  "payload": {
+    "one": "hostOne",
+    "two": "hostTwo"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/ev_2_onos.json b/web/gui/src/test/_karma/ev/intentSketch/ev_2_onos.json
new file mode 100644
index 0000000..4fdeaa1
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/ev_2_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "showTraffic",
+  "sid": 1,
+  "payload": {
+    "paths": [
+      {
+        "intentId": "0x1234",
+        "links": [ "1-2", "2-3" ],
+        "class": "primary"
+      },
+      {
+        "intentId": "0x4321",
+        "links": [ "5-6", "6-7" ],
+        "class": "secondary"
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/ev_3_ui.json b/web/gui/src/test/_karma/ev/intentSketch/ev_3_ui.json
new file mode 100644
index 0000000..f6a2b17
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/ev_3_ui.json
@@ -0,0 +1,8 @@
+{
+  "event": "requestTraffic",
+  "sid": 2,
+  "payload": {
+    "ids": [ "00:00:00:00:00:01/-1",  "00:00:00:00:00:02/-1" ],
+    "hover": ""
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/ev_4_onos.json b/web/gui/src/test/_karma/ev/intentSketch/ev_4_onos.json
new file mode 100644
index 0000000..f78616a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/ev_4_onos.json
@@ -0,0 +1,20 @@
+{
+  "event": "showPath",
+  "sid": 2,
+  "payload": {
+    "paths": [
+      {
+        "intentId": "0x1234",
+        "links": [ "1-2", "2-3" ],
+        "class": "animated",
+        "labels": [ "9Gb", "9Gb" ]
+      },
+      {
+        "intentId": "0x4321",
+        "links": [ "5-6", "6-7" ],
+        "class": "animated",
+        "labels": [ "4GB", "4GB" ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/ev_5_onos.json b/web/gui/src/test/_karma/ev/intentSketch/ev_5_onos.json
new file mode 100644
index 0000000..2afb785
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/ev_5_onos.json
@@ -0,0 +1,20 @@
+{
+  "event": "showTraffic",
+  "sid": 2,
+  "payload": {
+    "paths": [
+      {
+        "intentId": "0x1234",
+        "links": [ "1-2", "2-3" ],
+        "class": "animated",
+        "labels": [ "17Gb", "16Gb" ]
+      },
+      {
+        "intentId": "0x4321",
+        "links": [ "5-6", "6-7" ],
+        "class": "animated",
+        "labels": [ "9Gb", "5Gb" ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/ev_6_onos.json b/web/gui/src/test/_karma/ev/intentSketch/ev_6_onos.json
new file mode 100644
index 0000000..5f55415
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/ev_6_onos.json
@@ -0,0 +1,20 @@
+{
+  "event": "showTraffic",
+  "sid": 2,
+  "payload": {
+    "paths": [
+      {
+        "intentId": "0x1234",
+        "links": [ "1-2", "2-3" ],
+        "class": "primary",
+        "labels": [ "17Gb", "16Gb" ]
+      },
+      {
+        "intentId": "0x4321",
+        "links": [ "5-6", "6-7" ],
+        "class": "secondary",
+        "labels": [ "9Gb", "5Gb" ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/ev_7_ui.json b/web/gui/src/test/_karma/ev/intentSketch/ev_7_ui.json
new file mode 100644
index 0000000..89da44e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/ev_7_ui.json
@@ -0,0 +1,6 @@
+{
+  "event": "cancelTraffic",
+  "sid": 3,
+  "payload": {
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/ev_8_onos.json b/web/gui/src/test/_karma/ev/intentSketch/ev_8_onos.json
new file mode 100644
index 0000000..8d5a50e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/ev_8_onos.json
@@ -0,0 +1,7 @@
+{
+  "event": "showTraffic",
+  "sid": 3,
+  "payload": {
+    "paths": []
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/intentSketch/scenario.json b/web/gui/src/test/_karma/ev/intentSketch/scenario.json
new file mode 100644
index 0000000..f109dde
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/intentSketch/scenario.json
@@ -0,0 +1,13 @@
+{
+  "comments": [
+    "This scenario steps through adding a host intent."
+  ],
+  "title": "Host Intent Scenario",
+  "params": {
+    "lastAuto": 0
+  },
+  "description": [
+    "Currently this is just a sketch of the event sequence,",
+    " but is NOT YET a runnable scenario."
+  ]
+}
\ No newline at end of file
diff --git a/web/gui/src/test/_karma/ev/links/ev_10_onos.json b/web/gui/src/test/_karma/ev/links/ev_10_onos.json
new file mode 100644
index 0000000..5775e43
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_10_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/10-of:0000ffffffff0003/20",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "10",
+    "dst": "of:0000ffffffff0003",
+    "dstPort": "20",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_11_onos.json b/web/gui/src/test/_karma/ev/links/ev_11_onos.json
new file mode 100644
index 0000000..f0d0b4d
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_11_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:88/-1",
+    "ingress": "0E:2A:69:30:13:88/-1/0-of:0000ffffffff0003/1",
+    "egress": "of:0000ffffffff0003/1-0E:2A:69:30:13:88/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0003",
+      "port": 1
+    },
+    "labels": [
+      "Host-A",
+      "0E:2A:69:30:13:88"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_12_onos.json b/web/gui/src/test/_karma/ev/links/ev_12_onos.json
new file mode 100644
index 0000000..d977343
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_12_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:89/-1",
+    "ingress": "0E:2A:69:30:13:89/-1/0-of:0000ffffffff0007/1",
+    "egress": "of:0000ffffffff0007/1-0E:2A:69:30:13:89/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0007",
+      "port": 1
+    },
+    "labels": [
+      "Host-B",
+      "0E:2A:69:30:13:89"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_13_onos.json b/web/gui/src/test/_karma/ev/links/ev_13_onos.json
new file mode 100644
index 0000000..8f643ba
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_13_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:8A/-1",
+    "ingress": "0E:2A:69:30:13:8A/-1/0-of:0000ffffffff0008/1",
+    "egress": "of:0000ffffffff0008/1-0E:2A:69:30:13:8A/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0008",
+      "port": 1
+    },
+    "labels": [
+      "Host-C",
+      "0E:2A:69:30:13:8A"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_14_onos.json b/web/gui/src/test/_karma/ev/links/ev_14_onos.json
new file mode 100644
index 0000000..d761019
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_14_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateLink",
+  "payload": {
+    "id": "of:0000ffffffff0007/10-of:0000ffffffff0008/20",
+    "src": "of:0000ffffffff0007",
+    "srcPort": "10",
+    "dst": "of:0000ffffffff0008",
+    "dstPort": "20",
+
+    "type": "direct",
+    "linkWidth": 2,
+    "online": true,
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_15_onos.json b/web/gui/src/test/_karma/ev/links/ev_15_onos.json
new file mode 100644
index 0000000..dbdfb3a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_15_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateLink",
+  "payload": {
+    "id": "of:0000ffffffff0007/20-of:0000ffffffff0003/10",
+    "src": "of:0000ffffffff0007",
+    "srcPort": "20",
+    "dst": "of:0000ffffffff0003",
+    "dstPort": "10",
+
+    "type": "direct",
+    "linkWidth": 6,
+    "online": true,
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_16_onos.json b/web/gui/src/test/_karma/ev/links/ev_16_onos.json
new file mode 100644
index 0000000..b7783c1
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_16_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffff0007/20-of:0000ffffffff0003/10",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0007",
+    "srcPort": "20",
+    "dst": "of:0000ffffffff0003",
+    "dstPort": "10",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_17_onos.json b/web/gui/src/test/_karma/ev/links/ev_17_onos.json
new file mode 100644
index 0000000..daf926e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_17_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/10-of:0000ffffffff0007/20",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "10",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "20",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_18_onos.json b/web/gui/src/test/_karma/ev/links/ev_18_onos.json
new file mode 100644
index 0000000..aa40361
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_18_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/10-of:0000ffffffff0007/20",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "10",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "20",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_19_onos.json b/web/gui/src/test/_karma/ev/links/ev_19_onos.json
new file mode 100644
index 0000000..58772f7
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_19_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0007/20-of:0000ffffffff0003/10",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0007",
+    "srcPort": "20",
+    "dst": "of:0000ffffffff0003",
+    "dstPort": "10",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_1_onos.json b/web/gui/src/test/_karma/ev/links/ev_1_onos.json
new file mode 100644
index 0000000..46803a2
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_1_onos.json
@@ -0,0 +1,14 @@
+{
+  "event": "addInstance",
+  "payload": {
+    "id": "local",
+    "ip": "127.0.0.1",
+    "online": true,
+    "uiAttached": true,
+    "switches": 43,
+    "labels": [
+      "local",
+      "127.0.0.1"
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_20_onos.json b/web/gui/src/test/_karma/ev/links/ev_20_onos.json
new file mode 100644
index 0000000..19b5cd3
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_20_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "updateLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/20-of:0000ffffffff0008/10",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "20",
+    "dst": "of:0000ffffffff0008",
+    "dstPort": "10",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_21_onos.json b/web/gui/src/test/_karma/ev/links/ev_21_onos.json
new file mode 100644
index 0000000..342272c
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_21_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "updateLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/10-of:0000ffffffff0003/20",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "10",
+    "dst": "of:0000ffffffff0003",
+    "dstPort": "20",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_22_onos.json b/web/gui/src/test/_karma/ev/links/ev_22_onos.json
new file mode 100644
index 0000000..b0b51b1
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_22_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:BB:BB/-1",
+    "type": "bgpSpeaker",
+    "ingress": "0E:2A:69:30:BB:BB/-1/0-of:0000ffffffff0007/2",
+    "egress": "of:0000ffffffff0007/2-0E:2A:69:30:BB:BB/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0007",
+      "port": 2
+    },
+    "labels": [
+      "BGP",
+      "0E:2A:69:30:BB:BB"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_23_onos.json b/web/gui/src/test/_karma/ev/links/ev_23_onos.json
new file mode 100644
index 0000000..1fd53cd
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_23_onos.json
@@ -0,0 +1,22 @@
+{
+  "event": "showTraffic",
+  "sid":62,
+  "payload": {
+    "paths": [
+      {
+        "class": "primary",
+        "traffic": false,
+        "links": [
+          "0E:2A:69:30:13:8A/-1/0-of:0000ffffffff0008/1",
+          "of:0000ffffffff0008/20-of:0000ffffffff0007/10",
+          "of:0000ffffffff0007/1-0E:2A:69:30:13:89/-1/0"
+        ],
+        "labels": [
+          "123 bytes",
+          "10 bytes",
+          "0 bytes"
+        ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_24_onos.json b/web/gui/src/test/_karma/ev/links/ev_24_onos.json
new file mode 100644
index 0000000..b797752
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_24_onos.json
@@ -0,0 +1,22 @@
+{
+  "event": "showTraffic",
+  "sid":63,
+  "payload": {
+    "paths": [
+      {
+        "class": "primary animated",
+        "traffic": true,
+        "links": [
+          "0E:2A:69:30:13:8A/-1/0-of:0000ffffffff0008/1",
+          "of:0000ffffffff0008/20-of:0000ffffffff0007/10",
+          "of:0000ffffffff0007/1-0E:2A:69:30:13:89/-1/0"
+        ],
+        "labels": [
+          "99997 bytes",
+          "200 bytes",
+          "3.1415926 bytes"
+        ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_25_onos.json b/web/gui/src/test/_karma/ev/links/ev_25_onos.json
new file mode 100644
index 0000000..59c12fa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_25_onos.json
@@ -0,0 +1,7 @@
+{
+  "event": "showTraffic",
+  "sid": 64,
+  "payload": {
+    "paths": []
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_2_onos.json b/web/gui/src/test/_karma/ev/links/ev_2_onos.json
new file mode 100644
index 0000000..46e56f6
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_2_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0003",
+    "type": "switch",
+    "online": true,
+    "master": "local",
+    "labels": [
+      "",
+      "sw-3",
+      "0000ffffffff0003"
+    ],
+    "metaUi": {
+      "x": 282,
+      "y": 503
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_3_onos.json b/web/gui/src/test/_karma/ev/links/ev_3_onos.json
new file mode 100644
index 0000000..c32cd28
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_3_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0007",
+    "type": "switch",
+    "online": true,
+    "master": "local",
+    "labels": [
+      "",
+      "sw-7",
+      "0000ffffffff0007"
+    ],
+    "metaUi": {
+      "x": 530,
+      "y": 330
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_4_onos.json b/web/gui/src/test/_karma/ev/links/ev_4_onos.json
new file mode 100644
index 0000000..375fccc
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_4_onos.json
@@ -0,0 +1,18 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0008",
+    "type": "switch",
+    "online": true,
+    "master": "local",
+    "labels": [
+      "",
+      "sw-8",
+      "0000ffffffff0008"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 477
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_5_onos.json b/web/gui/src/test/_karma/ev/links/ev_5_onos.json
new file mode 100644
index 0000000..771c332
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_5_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0007/10-of:0000ffffffff0008/20",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0007",
+    "srcPort": "10",
+    "dst": "of:0000ffffffff0008",
+    "dstPort": "20",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_6_onos.json b/web/gui/src/test/_karma/ev/links/ev_6_onos.json
new file mode 100644
index 0000000..6eea869
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_6_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/20-of:0000ffffffff0007/10",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "20",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "10",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_7_onos.json b/web/gui/src/test/_karma/ev/links/ev_7_onos.json
new file mode 100644
index 0000000..cff94a5
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_7_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/10-of:0000ffffffff0007/20",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "10",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "20",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_8_onos.json b/web/gui/src/test/_karma/ev/links/ev_8_onos.json
new file mode 100644
index 0000000..0a5a314
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_8_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0007/20-of:0000ffffffff0003/10",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0007",
+    "srcPort": "20",
+    "dst": "of:0000ffffffff0003",
+    "dstPort": "10",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/ev_9_onos.json b/web/gui/src/test/_karma/ev/links/ev_9_onos.json
new file mode 100644
index 0000000..0b6b67b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/ev_9_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/20-of:0000ffffffff0008/10",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "20",
+    "dst": "of:0000ffffffff0008",
+    "dstPort": "10",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/links/scenario.json b/web/gui/src/test/_karma/ev/links/scenario.json
new file mode 100644
index 0000000..2cef0aa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/links/scenario.json
@@ -0,0 +1,15 @@
+{
+  "comments": [
+    "Stepping through link events"
+  ],
+  "title": "Process Link Events Scenario",
+  "params": {
+    "lastAuto": 13
+  },
+  "description": [
+    "Press 'H' to show hosts.",
+    "",
+    "Press '=' to load initial events.",
+    "Press '-' to fire further events."
+  ]
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_10_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_10_onos.json
new file mode 100644
index 0000000..10f868f
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_10_onos.json
@@ -0,0 +1,13 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "2-2b",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "sw2",
+    "srcPort": "20",
+    "dst": "sw2b",
+    "dstPort": "10"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_11_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_11_onos.json
new file mode 100644
index 0000000..deaf0a1
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_11_onos.json
@@ -0,0 +1,13 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "3-3b",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "sw3",
+    "srcPort": "20",
+    "dst": "sw3b",
+    "dstPort": "10"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_12_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_12_onos.json
new file mode 100644
index 0000000..ff47e5c
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_12_onos.json
@@ -0,0 +1,13 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "4-4b",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "sw4",
+    "srcPort": "20",
+    "dst": "sw4b",
+    "dstPort": "10"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_1_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_1_onos.json
new file mode 100644
index 0000000..780f0aa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_1_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "sw1b",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "sw-1b",
+      "00001b"
+    ],
+    "metaUi": {
+      "x": 200,
+      "y": 200
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_2_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_2_onos.json
new file mode 100644
index 0000000..e0dba2b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_2_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "sw2b",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "sw-2b",
+      "00002b"
+    ],
+    "metaUi": {
+      "x": 800,
+      "y": 200
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_3_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_3_onos.json
new file mode 100644
index 0000000..38d066a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_3_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "sw3b",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "sw-3b",
+      "00003b"
+    ],
+    "metaUi": {
+      "x": 200,
+      "y": 600
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_4_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_4_onos.json
new file mode 100644
index 0000000..bece53d
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_4_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "sw4b",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "sw-4b",
+      "00004b"
+    ],
+    "metaUi": {
+      "x": 800,
+      "y": 600
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_5_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_5_onos.json
new file mode 100644
index 0000000..a05f3f9
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_5_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "sw1",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-1",
+      "00001"
+    ],
+    "metaUi": {
+      "x": 200,
+      "y": 200
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_6_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_6_onos.json
new file mode 100644
index 0000000..27e3b14
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_6_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "sw2",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-2",
+      "00002"
+    ],
+    "metaUi": {
+      "x": 800,
+      "y": 200
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_7_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_7_onos.json
new file mode 100644
index 0000000..992b964
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_7_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "sw3",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-3",
+      "00003"
+    ],
+    "metaUi": {
+      "x": 200,
+      "y": 600
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_8_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_8_onos.json
new file mode 100644
index 0000000..2c33d50
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_8_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "sw4",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-4",
+      "00004"
+    ],
+    "metaUi": {
+      "x": 800,
+      "y": 600
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/ev_9_onos.json b/web/gui/src/test/_karma/ev/oblique/ev_9_onos.json
new file mode 100644
index 0000000..57e9706
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/ev_9_onos.json
@@ -0,0 +1,13 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "1-1b",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "sw1",
+    "srcPort": "20",
+    "dst": "sw1b",
+    "dstPort": "10"
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/oblique/scenario.json b/web/gui/src/test/_karma/ev/oblique/scenario.json
new file mode 100644
index 0000000..7b349ea
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/oblique/scenario.json
@@ -0,0 +1,11 @@
+{
+  "title": "Oblique Test Scenario",
+  "params": {
+    "lastAuto": 8
+  },
+  "description": [
+    "Test Scenario for Oblique view",
+    "",
+    "Press '=' to load initial events."
+  ]
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_10_onos.json b/web/gui/src/test/_karma/ev/simple/ev_10_onos.json
new file mode 100644
index 0000000..f09cc9b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_10_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "updateLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+    "type": "direct",
+    "linkWidth": 6,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "21",
+    "dst": "of:0000ffffffff0008",
+    "dstPort": "20",
+    "props" : {
+      "BW": "512 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_11_onos.json b/web/gui/src/test/_karma/ev/simple/ev_11_onos.json
new file mode 100644
index 0000000..447ded3
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_11_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "updateLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "21",
+    "dst": "of:0000ffffffff0008",
+    "dstPort": "20",
+    "props" : {
+      "BW": "80 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_12_onos.json b/web/gui/src/test/_karma/ev/simple/ev_12_onos.json
new file mode 100644
index 0000000..96018f3
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_12_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+    "type": "direct",
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "21",
+    "dst": "of:0000ffffffff0008",
+    "dstPort": "20",
+    "props" : {
+      "BW": "80 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_13_onos.json b/web/gui/src/test/_karma/ev/simple/ev_13_onos.json
new file mode 100644
index 0000000..5320841
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_13_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "removeHost",
+  "payload": {
+    "id": "A6:96:E5:03:52:5F/-1",
+    "ingress": "A6:96:E5:03:52:5F/-1/0-of:0000ffffffff0008/1",
+    "egress": "of:0000ffffffff0008/1-A6:96:E5:03:52:5F/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0008",
+      "port": 1
+    },
+    "labels": [
+      "10.0.0.17",
+      "A6:96:E5:03:52:5F"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_14_onos.json b/web/gui/src/test/_karma/ev/simple/ev_14_onos.json
new file mode 100644
index 0000000..9df9d61
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_14_onos.json
@@ -0,0 +1,22 @@
+{
+  "event": "removeDevice",
+  "payload": {
+    "id": "of:0000ffffffff0003",
+    "type": "switch",
+    "online": false,
+    "location": {
+      "type": "latlng",
+      "lat": 40.7127,
+      "lng": -74.0059
+    },
+    "labels": [
+      "",
+      "sw-3",
+      "0000ffffffff0003"
+    ],
+    "metaUi": {
+      "x": 800,
+      "y": 280
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_1_onos.json b/web/gui/src/test/_karma/ev/simple/ev_1_onos.json
new file mode 100644
index 0000000..b86a73c
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_1_onos.json
@@ -0,0 +1,22 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0008",
+    "type": "switch",
+    "online": false,
+    "location": {
+      "type": "latlng",
+      "lat": 37.7833,
+      "lng": -122.4167
+    },
+    "labels": [
+      "",
+      "sw-8",
+      "0000ffffffff0008"
+    ],
+    "metaUi": {
+      "x": 520,
+      "y": 350
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_2_onos.json b/web/gui/src/test/_karma/ev/simple/ev_2_onos.json
new file mode 100644
index 0000000..2df409a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_2_onos.json
@@ -0,0 +1,22 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0003",
+    "type": "switch",
+    "online": false,
+    "location": {
+      "type": "latlng",
+      "lat": 40.7127,
+      "lng": -74.0059
+    },
+    "labels": [
+      "",
+      "sw-3",
+      "0000ffffffff0003"
+    ],
+    "metaUi": {
+      "x": 800,
+      "y": 280
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_3_onos.json b/web/gui/src/test/_karma/ev/simple/ev_3_onos.json
new file mode 100644
index 0000000..0083530
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_3_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000ffffffff0008",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "switch-8",
+      "0000ffffffff0008"
+    ],
+    "metaUi": {
+      "x": 520,
+      "y": 350
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_4_onos.json b/web/gui/src/test/_karma/ev/simple/ev_4_onos.json
new file mode 100644
index 0000000..57e3347
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_4_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000ffffffff0003",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "switch-3",
+      "0000ffffffff0003"
+    ],
+    "metaUi": {
+      "x": 800,
+      "y": 280
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_5_onos.json b/web/gui/src/test/_karma/ev/simple/ev_5_onos.json
new file mode 100644
index 0000000..755255a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_5_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "21",
+    "dst": "of:0000ffffffff0008",
+    "dstPort": "20",
+    "props" : {
+      "BW": "70 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_6_onos.json b/web/gui/src/test/_karma/ev/simple/ev_6_onos.json
new file mode 100644
index 0000000..993570b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_6_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:86/-1",
+    "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/2",
+    "egress": "of:0000ffffffff0003/2-0E:2A:69:30:13:86/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0003",
+      "port": 2
+    },
+    "labels": [
+      "unknown",
+      "0E:2A:69:30:13:86"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_7_onos.json b/web/gui/src/test/_karma/ev/simple/ev_7_onos.json
new file mode 100644
index 0000000..17864a6
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_7_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "A6:96:E5:03:52:5F/-1",
+    "ingress": "A6:96:E5:03:52:5F/-1/0-of:0000ffffffff0008/1",
+    "egress": "of:0000ffffffff0008/1-A6:96:E5:03:52:5F/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0008",
+      "port": 1
+    },
+    "labels": [
+      "unknown",
+      "A6:96:E5:03:52:5F"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_8_onos.json b/web/gui/src/test/_karma/ev/simple/ev_8_onos.json
new file mode 100644
index 0000000..3a3ea9e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_8_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:86/-1",
+    "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/2",
+    "egress": "of:0000ffffffff0003/2-0E:2A:69:30:13:86/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0003",
+      "port": 2
+    },
+    "labels": [
+      "10.0.0.13",
+      "0E:2A:69:30:13:86"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/ev_9_onos.json b/web/gui/src/test/_karma/ev/simple/ev_9_onos.json
new file mode 100644
index 0000000..0fb56fa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/ev_9_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateHost",
+  "payload": {
+    "id": "A6:96:E5:03:52:5F/-1",
+    "ingress": "A6:96:E5:03:52:5F/-1/0-of:0000ffffffff0008/1",
+    "egress": "of:0000ffffffff0008/1-A6:96:E5:03:52:5F/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0008",
+      "port": 1
+    },
+    "labels": [
+      "10.0.0.17",
+      "A6:96:E5:03:52:5F"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/simple/scenario.json b/web/gui/src/test/_karma/ev/simple/scenario.json
new file mode 100644
index 0000000..524377c
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/simple/scenario.json
@@ -0,0 +1,30 @@
+{
+  "comments": [
+    "Add two devices and one link (auto), and two hosts.",
+    "Then update the two hosts (with IP address labels)."
+  ],
+  "title": "Simple Startup Scenario",
+  "params": {
+    "lastAuto": 0
+  },
+  "description": [
+    "Press 'H' to show hosts.",
+    "",
+    "Press '-' to fire further events.",
+    "",
+    "1. add device [8] (offline)",
+    "2. add device [3] (offline)",
+    "3. update device [8] (online, label3 change)",
+    "4. update device [3] (online, label3 change)",
+    "5. add link [3] --> [8]",
+    "6. add host (to [3])",
+    "7. add host (to [8])",
+    "8. update host[3] (IP now 10.0.0.13)",
+    "9. update host[8] (IP now 10.0.0.17)",
+    "10. update link (increase width, update props)",
+    "11. update link (reduce width, update props)",
+    "12. remove link",
+    "13. remove host (10.0.0.17)",
+    "13. remove device [3]"
+  ]
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_10_onos.json b/web/gui/src/test/_karma/ev/startup/ev_10_onos.json
new file mode 100644
index 0000000..e07a3c7
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_10_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff04",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-4",
+      "0000ffffffffff04"
+    ],
+    "metaUi": {
+      "x": 322,
+      "y": 138
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_11_onos.json b/web/gui/src/test/_karma/ev/startup/ev_11_onos.json
new file mode 100644
index 0000000..71efaf3
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_11_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff000A",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-A",
+      "0000ffffffff000A"
+    ],
+    "metaUi": {
+      "x": 832,
+      "y": 223
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_12_onos.json b/web/gui/src/test/_karma/ev/startup/ev_12_onos.json
new file mode 100644
index 0000000..7d9fe61
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_12_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0001",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-1",
+      "0000ffffffff0001"
+    ],
+    "metaUi": {
+      "x": 167,
+      "y": 403
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_13_onos.json b/web/gui/src/test/_karma/ev/startup/ev_13_onos.json
new file mode 100644
index 0000000..12937b4
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_13_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff01",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-1",
+      "0000ffffffffff01"
+    ],
+    "metaUi": {
+      "x": 227,
+      "y": 460
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_14_onos.json b/web/gui/src/test/_karma/ev/startup/ev_14_onos.json
new file mode 100644
index 0000000..c4f9790
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_14_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0004",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-4",
+      "0000ffffffff0004"
+    ],
+    "metaUi": {
+      "x": 317,
+      "y": 73
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_15_onos.json b/web/gui/src/test/_karma/ev/startup/ev_15_onos.json
new file mode 100644
index 0000000..6a51e77
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_15_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff0A",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-A",
+      "0000ffffffffff0A"
+    ],
+    "metaUi": {
+      "x": 840,
+      "y": 290
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_16_onos.json b/web/gui/src/test/_karma/ev/startup/ev_16_onos.json
new file mode 100644
index 0000000..ba243ba5
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_16_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff09",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-9",
+      "0000ffffffffff09"
+    ],
+    "metaUi": {
+      "x": 1010,
+      "y": 229
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_17_onos.json b/web/gui/src/test/_karma/ev/startup/ev_17_onos.json
new file mode 100644
index 0000000..1a7e24b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_17_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff02/20-of:0000ffffffffff05/10",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff02",
+    "srcPort": "20",
+    "dst": "of:0000ffffffffff05",
+    "dstPort": "10",
+    "props" : {
+      "BW": "80 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_18_onos.json b/web/gui/src/test/_karma/ev/startup/ev_18_onos.json
new file mode 100644
index 0000000..5f9f7d7
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_18_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff000A/2-of:0000ffffffffff0A/1",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff000A",
+    "srcPort": "2",
+    "dst": "of:0000ffffffffff0A",
+    "dstPort": "1",
+    "props" : {
+      "BW": "100 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_19_onos.json b/web/gui/src/test/_karma/ev/startup/ev_19_onos.json
new file mode 100644
index 0000000..5c928ee
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_19_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff03/10-of:0000ffffffffff02/10",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff03",
+    "srcPort": "10",
+    "dst": "of:0000ffffffffff02",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_1_onos.json b/web/gui/src/test/_karma/ev/startup/ev_1_onos.json
new file mode 100644
index 0000000..bd07ae6
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_1_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff08",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-B",
+      "0000ffffffffff08"
+    ],
+    "metaUi": {
+      "x": 539,
+      "y": 186
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_20_onos.json b/web/gui/src/test/_karma/ev/startup/ev_20_onos.json
new file mode 100644
index 0000000..44705d5
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_20_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff07/21-of:0000ffffffffff05/20",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff07",
+    "srcPort": "21",
+    "dst": "of:0000ffffffffff05",
+    "dstPort": "20",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_21_onos.json b/web/gui/src/test/_karma/ev/startup/ev_21_onos.json
new file mode 100644
index 0000000..0fa67d2
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_21_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0001/2-of:0000ffffffffff01/1",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0001",
+    "srcPort": "2",
+    "dst": "of:0000ffffffffff01",
+    "dstPort": "1",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_22_onos.json b/web/gui/src/test/_karma/ev/startup/ev_22_onos.json
new file mode 100644
index 0000000..0edde2a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_22_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff09/20-of:0000ffffffffff0A/20",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff09",
+    "srcPort": "20",
+    "dst": "of:0000ffffffffff0A",
+    "dstPort": "20",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_23_onos.json b/web/gui/src/test/_karma/ev/startup/ev_23_onos.json
new file mode 100644
index 0000000..5443b41
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_23_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff07/30-of:0000ffffffffff08/20",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff07",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "20",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_24_onos.json b/web/gui/src/test/_karma/ev/startup/ev_24_onos.json
new file mode 100644
index 0000000..5e7bb99
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_24_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff02/10-of:0000ffffffffff01/10",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff02",
+    "srcPort": "10",
+    "dst": "of:0000ffffffffff01",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_25_onos.json b/web/gui/src/test/_karma/ev/startup/ev_25_onos.json
new file mode 100644
index 0000000..1d0e976
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_25_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff04/27-of:0000ffffffffff08/10",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff04",
+    "srcPort": "27",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "10",
+    "props" : {
+      "BW": "30 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_26_onos.json b/web/gui/src/test/_karma/ev/startup/ev_26_onos.json
new file mode 100644
index 0000000..9f2cd7b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_26_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/2-of:0000ffffffffff03/1",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "2",
+    "dst": "of:0000ffffffffff03",
+    "dstPort": "1",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_27_onos.json b/web/gui/src/test/_karma/ev/startup/ev_27_onos.json
new file mode 100644
index 0000000..23ccc22
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_27_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff09/1-of:0000ffffffff0009/2",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff09",
+    "srcPort": "1",
+    "dst": "of:0000ffffffff0009",
+    "dstPort": "2",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_28_onos.json b/web/gui/src/test/_karma/ev/startup/ev_28_onos.json
new file mode 100644
index 0000000..84be94f
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_28_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff03/30-of:0000ffffffffff04/10",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff03",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff04",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_29_onos.json b/web/gui/src/test/_karma/ev/startup/ev_29_onos.json
new file mode 100644
index 0000000..be5c696
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_29_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff07/20-of:0000ffffffffff09/10",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff07",
+    "srcPort": "20",
+    "dst": "of:0000ffffffffff09",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_2_onos.json b/web/gui/src/test/_karma/ev/startup/ev_2_onos.json
new file mode 100644
index 0000000..b00c689
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_2_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff03",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-3",
+      "0000ffffffffff03"
+    ],
+    "metaUi": {
+      "x": 95,
+      "y": 225
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_30_onos.json b/web/gui/src/test/_karma/ev/startup/ev_30_onos.json
new file mode 100644
index 0000000..283d300
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_30_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff0A/10-of:0000ffffffffff08/30",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff0A",
+    "srcPort": "10",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "30",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_31_onos.json b/web/gui/src/test/_karma/ev/startup/ev_31_onos.json
new file mode 100644
index 0000000..965f76b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_31_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0004/2-of:0000ffffffffff04/1",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0004",
+    "srcPort": "2",
+    "dst": "of:0000ffffffffff04",
+    "dstPort": "1",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_32_onos.json b/web/gui/src/test/_karma/ev/startup/ev_32_onos.json
new file mode 100644
index 0000000..3d90bfa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_32_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff07/1-of:0000ffffffff0007/2",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff07",
+    "srcPort": "1",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "2",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_33_onos.json b/web/gui/src/test/_karma/ev/startup/ev_33_onos.json
new file mode 100644
index 0000000..7b17dda
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_33_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000ffffffffff06",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-6",
+      "0000ffffffffff06"
+    ],
+    "metaUi": {
+      "x": 336,
+      "y": 254
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_34_onos.json b/web/gui/src/test/_karma/ev/startup/ev_34_onos.json
new file mode 100644
index 0000000..a75a345
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_34_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff06/20-of:0000ffffffffff05/30",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff06",
+    "srcPort": "20",
+    "dst": "of:0000ffffffffff05",
+    "dstPort": "30",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_35_onos.json b/web/gui/src/test/_karma/ev/startup/ev_35_onos.json
new file mode 100644
index 0000000..055a80d
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_35_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff03/20-of:0000ffffffffff06/10",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff03",
+    "srcPort": "20",
+    "dst": "of:0000ffffffffff06",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_36_onos.json b/web/gui/src/test/_karma/ev/startup/ev_36_onos.json
new file mode 100644
index 0000000..addcc6d
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_36_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff06/30-of:0000ffffffffff08/10",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff06",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_37_onos.json b/web/gui/src/test/_karma/ev/startup/ev_37_onos.json
new file mode 100644
index 0000000..42adbf9
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_37_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000ffffffffff08",
+    "type": "roadm",
+    "online": false,
+    "labels": [
+      "",
+      "opt-8",
+      "0000ffffffffff08"
+    ],
+    "metaUi": {
+      "x": 539,
+      "y": 186
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_38_onos.json b/web/gui/src/test/_karma/ev/startup/ev_38_onos.json
new file mode 100644
index 0000000..5479f6e
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_38_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffffff07/30-of:0000ffffffffff08/20",
+    "type": "optical",
+    "online": false,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff07",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "20",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_39_onos.json b/web/gui/src/test/_karma/ev/startup/ev_39_onos.json
new file mode 100644
index 0000000..13c2cf2
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_39_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffffff04/27-of:0000ffffffffff08/10",
+    "type": "optical",
+    "online": false,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff04",
+    "srcPort": "27",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "10",
+    "props" : {
+      "BW": "30 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_3_onos.json b/web/gui/src/test/_karma/ev/startup/ev_3_onos.json
new file mode 100644
index 0000000..eb1da81
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_3_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0007",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-7",
+      "0000ffffffff0007"
+    ],
+    "metaUi": {
+      "x": 890,
+      "y": 375
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_40_onos.json b/web/gui/src/test/_karma/ev/startup/ev_40_onos.json
new file mode 100644
index 0000000..7a9c1e1
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_40_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffffff0A/10-of:0000ffffffffff08/30",
+    "type": "optical",
+    "online": false,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff0A",
+    "srcPort": "10",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "30",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_41_onos.json b/web/gui/src/test/_karma/ev/startup/ev_41_onos.json
new file mode 100644
index 0000000..fb2fa45
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_41_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffffff06/30-of:0000ffffffffff08/10",
+    "type": "optical",
+    "online": false,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff06",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_4_onos.json b/web/gui/src/test/_karma/ev/startup/ev_4_onos.json
new file mode 100644
index 0000000..495d69b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_4_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0009",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-9",
+      "0000ffffffff0009"
+    ],
+    "metaUi": {
+      "x": 1004,
+      "y": 163
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_5_onos.json b/web/gui/src/test/_karma/ev/startup/ev_5_onos.json
new file mode 100644
index 0000000..0fe4341
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_5_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff02",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-2",
+      "0000ffffffffff02"
+    ],
+    "metaUi": {
+      "x": 211,
+      "y": 307
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_6_onos.json b/web/gui/src/test/_karma/ev/startup/ev_6_onos.json
new file mode 100644
index 0000000..7557c02
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_6_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0003",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-3",
+      "0000ffffffff0003"
+    ],
+    "metaUi": {
+      "x": 114,
+      "y": 158
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_7_onos.json b/web/gui/src/test/_karma/ev/startup/ev_7_onos.json
new file mode 100644
index 0000000..ed90ac3
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_7_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff07",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-7",
+      "0000ffffffffff07"
+    ],
+    "metaUi": {
+      "x": 925,
+      "y": 446
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_8_onos.json b/web/gui/src/test/_karma/ev/startup/ev_8_onos.json
new file mode 100644
index 0000000..f9f429b
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_8_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff06",
+    "type": "roadm",
+    "online": false,
+    "labels": [
+      "",
+      "opt-6",
+      "0000ffffffffff06"
+    ],
+    "metaUi": {
+      "x": 336,
+      "y": 254
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/ev_9_onos.json b/web/gui/src/test/_karma/ev/startup/ev_9_onos.json
new file mode 100644
index 0000000..72d8fed
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/ev_9_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff05",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-5",
+      "0000ffffffffff05"
+    ],
+    "metaUi": {
+      "x": 539,
+      "y": 524
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/startup/scenario.json b/web/gui/src/test/_karma/ev/startup/scenario.json
new file mode 100644
index 0000000..0fe1dd3
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/startup/scenario.json
@@ -0,0 +1,19 @@
+{
+  "comments": [
+    "This scenario steps through adding devices and links.",
+    "(Typical 'start-ip' of the view.)"
+  ],
+  "title": "Startup Scenario",
+  "params": {
+    "lastAuto": 32
+  },
+  "description": [
+    "Loads 16 devices (10 optical, 6 packet)",
+    " and their associated links.",
+    "",
+    "Press '=' to load initial events.",
+    "Press '-' to fire further events...",
+    " * 4 events - device online, add 3 links",
+    " * 5 events - device offline, remove 4 links"
+  ]
+}
\ No newline at end of file
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_10_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_10_onos.json
new file mode 100644
index 0000000..ae7c2ab
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_10_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/4-of:0000ffffffffff03/1",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "4",
+    "dst": "of:0000ffffffffff03",
+    "dstPort": "1",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_11_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_11_onos.json
new file mode 100644
index 0000000..6c08070
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_11_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff08/4-of:0000ffffffffff03/1",
+    "type": "optical",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff08",
+    "srcPort": "4",
+    "dst": "of:0000ffffffffff03",
+    "dstPort": "1",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_12_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_12_onos.json
new file mode 100644
index 0000000..a5ee5c9
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_12_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:86/-1",
+    "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+    "egress": "of:0000ffffffff0003/101-0E:2A:69:30:13:86/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0003",
+      "port": 101
+    },
+    "labels": [
+      "1.2.3.4",
+      "0E:2A:69:30:13:86"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_13_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_13_onos.json
new file mode 100644
index 0000000..6efcda9
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_13_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:88/-1",
+    "ingress": "0E:2A:69:30:13:88/-1/0-of:0000ffffffff0007/101",
+    "egress": "of:0000ffffffff0007/101-0E:2A:69:30:13:86/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0007",
+      "port": 101
+    },
+    "labels": [
+      "4.5.7.6",
+      "0E:2A:69:30:13:88"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_14_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_14_onos.json
new file mode 100644
index 0000000..af031a6
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_14_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:aa/-1",
+    "ingress": "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/101",
+    "egress": "of:0000ffffffff0008/101-0E:2A:69:30:13:aa/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0008",
+      "port": 101
+    },
+    "labels": [
+      "12.13.14.15",
+      "0E:2A:69:30:13:aa"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_15_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_15_onos.json
new file mode 100644
index 0000000..3b76e53
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_15_onos.json
@@ -0,0 +1,32 @@
+{
+  "event": "showTraffic",
+  "sid": 1,
+  "payload": {
+    "paths": [
+      {
+        "class": "primary",
+        "links": [
+          "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+          "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/101"
+        ],
+        "labels": [
+          "20 bytes",
+          "20 bytes"
+        ]
+      },
+      {
+        "class": "primary optical",
+        "links": [
+          "of:0000ffffffff0003/4-of:0000ffffffffff03/1",
+          "of:0000ffffffff0008/4-of:0000ffffffffff08/1",
+          "of:0000ffffffffff08/4-of:0000ffffffffff03/1"
+        ],
+        "labels": [
+          "24 bytes",
+          "some bits",
+          "foo bars"
+        ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_16_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_16_onos.json
new file mode 100644
index 0000000..4f42d41
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_16_onos.json
@@ -0,0 +1,32 @@
+{
+  "event": "showTraffic",
+  "sid": 1,
+  "payload": {
+    "paths": [
+      {
+        "class": "secondary",
+        "links": [
+          "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+          "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/101"
+        ],
+        "labels": [
+          "35 bytes",
+          "35 bytes"
+        ]
+      },
+      {
+        "class": "secondary optical",
+        "links": [
+          "of:0000ffffffff0003/4-of:0000ffffffffff03/1",
+          "of:0000ffffffff0008/4-of:0000ffffffffff08/1",
+          "of:0000ffffffffff08/4-of:0000ffffffffff03/1"
+        ],
+        "labels": [
+          "24 bytes",
+          "some bits",
+          "foo bars"
+        ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_17_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_17_onos.json
new file mode 100644
index 0000000..f53b3e4
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_17_onos.json
@@ -0,0 +1,34 @@
+{
+  "event": "showTraffic",
+  "sid": 1,
+  "payload": {
+    "paths": [
+      {
+        "class": "animated",
+        "traffic": true,
+        "links": [
+          "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+          "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/101"
+        ],
+        "labels": [
+          "47 bytes",
+          "47 bytes"
+        ]
+      },
+      {
+        "class": "animated optical",
+        "traffic": true,
+        "links": [
+          "of:0000ffffffff0003/4-of:0000ffffffffff03/1",
+          "of:0000ffffffff0008/4-of:0000ffffffffff08/1",
+          "of:0000ffffffffff08/4-of:0000ffffffffff03/1"
+        ],
+        "labels": [
+          "24 bytes",
+          "some bits",
+          "foo bars"
+        ]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_18_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_18_onos.json
new file mode 100644
index 0000000..3b3e921
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_18_onos.json
@@ -0,0 +1,56 @@
+{
+  "event": "showTraffic",
+  "sid": 1,
+  "payload": {
+    "paths": [
+      {
+        "class": "primary",
+        "traffic": false,
+        "links": [
+          "of:0000ffffffff0008/2-of:0000ffffffff0003/1"
+        ],
+        "labels": [""]
+      },
+      {
+        "class": "secondary",
+        "traffic": false,
+        "links": [
+          "of:0000ffffffff0003/9-of:0000ffffffff0007/2"
+        ],
+        "labels": [""]
+      },
+      {
+        "class": "animated",
+        "traffic": true,
+        "links": [
+          "of:0000ffffffff0008/4-of:0000ffffffff0007/1"
+        ],
+        "labels": [""]
+      },
+      {
+        "class": "animated optical",
+        "traffic": true,
+        "links": [
+          "of:0000ffffffff0008/4-of:0000ffffffffff08/1"
+        ],
+        "labels": [""]
+      },
+      {
+        "class": "secondary optical",
+        "traffic": false,
+        "links": [
+          "of:0000ffffffff0003/4-of:0000ffffffffff03/1"
+        ],
+        "labels": [""]
+      },
+      {
+        "class": "primary optical",
+        "traffic": false,
+        "links": [
+          "of:0000ffffffffff08/4-of:0000ffffffffff03/1"
+        ],
+        "labels": [""]
+      }
+    ]
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_19_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_19_onos.json
new file mode 100644
index 0000000..5f8aae0
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_19_onos.json
@@ -0,0 +1,7 @@
+{
+  "event": "showTraffic",
+  "sid": 1,
+  "payload": {
+    "paths": []
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_1_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_1_onos.json
new file mode 100644
index 0000000..0a4c853
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_1_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0008",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-8",
+      "0000ffffffff0008"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 477
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_20_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_20_onos.json
new file mode 100644
index 0000000..2f9d567
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_20_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000ffffffff0007",
+    "type": "switch",
+    "online": false,
+    "labels": [
+      "",
+      "sw-7",
+      "0000ffffffff0007"
+    ],
+    "metaUi": {
+      "x": 530,
+      "y": 330
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_21_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_21_onos.json
new file mode 100644
index 0000000..a409b61
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_21_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000ffffffff0007",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-7",
+      "0000ffffffff0007"
+    ],
+    "metaUi": {
+      "x": 530,
+      "y": 330
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_22_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_22_onos.json
new file mode 100644
index 0000000..0478da1
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_22_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "removeDevice",
+  "payload": {
+    "id": "of:0000ffffffff0008",
+    "type": "switch",
+    "online": false,
+    "labels": [
+      "",
+      "sw-8",
+      "0000ffffffff0008"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 477
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_23_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_23_onos.json
new file mode 100644
index 0000000..0a4c853
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_23_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0008",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-8",
+      "0000ffffffff0008"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 477
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_24_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_24_onos.json
new file mode 100644
index 0000000..69fc2bc
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_24_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "removeHost",
+  "payload": {
+    "id": "0E:2A:69:30:13:88/-1",
+    "ingress": "0E:2A:69:30:13:88/-1/0-of:0000ffffffff0007/101",
+    "egress": "of:0000ffffffff0007/101-0E:2A:69:30:13:86/-1/0",
+    "cp": {
+      "device": "of:0000ffffffff0007",
+      "port": 101
+    },
+    "labels": [
+      "4.5.7.6",
+      "0E:2A:69:30:13:88"
+    ],
+    "props": {}
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_2_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_2_onos.json
new file mode 100644
index 0000000..bdc52fa
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_2_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0003",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-3",
+      "0000ffffffff0003"
+    ],
+    "metaUi": {
+      "x": 282,
+      "y": 503
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_3_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_3_onos.json
new file mode 100644
index 0000000..0a064b2
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_3_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffff0007",
+    "type": "switch",
+    "online": true,
+    "labels": [
+      "",
+      "sw-7",
+      "0000ffffffff0007"
+    ],
+    "metaUi": {
+      "x": 530,
+      "y": 330
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_4_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_4_onos.json
new file mode 100644
index 0000000..5326092
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_4_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff08",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-8",
+      "0000ffffffffff08"
+    ],
+    "metaUi": {
+      "x": 734,
+      "y": 577
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_5_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_5_onos.json
new file mode 100644
index 0000000..266d22a
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_5_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "addDevice",
+  "payload": {
+    "id": "of:0000ffffffffff03",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "",
+      "opt-3",
+      "0000ffffffffff03"
+    ],
+    "metaUi": {
+      "x": 282,
+      "y": 603
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_6_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_6_onos.json
new file mode 100644
index 0000000..00583d4
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_6_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0003/9-of:0000ffffffff0007/2",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "9",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "2",
+    "props" : {
+      "BW": "120 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_7_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_7_onos.json
new file mode 100644
index 0000000..3fd1352
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_7_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/2-of:0000ffffffff0003/1",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "2",
+    "dst": "of:0000ffffffff0003",
+    "dstPort": "1",
+    "props" : {
+      "BW": "70 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_8_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_8_onos.json
new file mode 100644
index 0000000..e6206d7
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_8_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/4-of:0000ffffffff0007/1",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "4",
+    "dst": "of:0000ffffffff0007",
+    "dstPort": "1",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/ev_9_onos.json b/web/gui/src/test/_karma/ev/traffic/ev_9_onos.json
new file mode 100644
index 0000000..e28d575
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/ev_9_onos.json
@@ -0,0 +1,16 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffff0008/4-of:0000ffffffffff08/1",
+    "type": "direct",
+    "online": true,
+    "linkWidth": 2,
+    "src": "of:0000ffffffff0008",
+    "srcPort": "4",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "1",
+    "props" : {
+      "BW": "90 Gb"
+    }
+  }
+}
diff --git a/web/gui/src/test/_karma/ev/traffic/scenario.json b/web/gui/src/test/_karma/ev/traffic/scenario.json
new file mode 100644
index 0000000..9eb9a69
--- /dev/null
+++ b/web/gui/src/test/_karma/ev/traffic/scenario.json
@@ -0,0 +1,17 @@
+{
+  "comments": [
+    "Stepping through showTraffic"
+  ],
+  "title": "Show Traffic Scenario",
+  "params": {
+    "lastAuto": 14
+  },
+  "description": [
+    "Figure out primary, secondary and animated link visualizations.",
+    "",
+    "Press 'H' to show hosts.",
+    "",
+    "Press '=' to load initial events.",
+    "Press '-' to fire further events."
+  ]
+}
diff --git a/web/gui/src/test/_karma/wssrv.js b/web/gui/src/test/_karma/wssrv.js
new file mode 100644
index 0000000..e0a8773
--- /dev/null
+++ b/web/gui/src/test/_karma/wssrv.js
@@ -0,0 +1,114 @@
+#!/usr/bin/env node
+// === Mock Web Socket Server - for testing the topology view
+//
+
+var readline = require('readline');
+var WebSocketServer = require('websocket').server;
+var http = require('http');
+var port = 8123;
+
+
+var server = http.createServer(function(request, response) {
+    console.log((new Date()) + ' Received request for ' + request.url);
+    response.writeHead(404);
+    response.end();
+});
+
+server.listen(port, function() {
+    console.log((new Date()) + ' Server is listening on port ' + port);
+});
+
+server.on('listening', function () {
+    console.log('ok, server is running');
+});
+
+var wsServer = new WebSocketServer({
+    httpServer: server,
+    // You should not use autoAcceptConnections for production
+    // applications, as it defeats all standard cross-origin protection
+    // facilities built into the protocol and the browser.  You should
+    // *always* verify the connection's origin and decide whether or not
+    // to accept it.
+    autoAcceptConnections: false
+});
+
+function originIsAllowed(origin) {
+    // put logic here to detect whether the specified origin is allowed.
+    return true;
+}
+
+var connection;
+
+wsServer.on('request', function(request) {
+    console.log(); // newline after prompt
+    console.log("Origin: ", request.origin);
+
+    if (!originIsAllowed(request.origin)) {
+        // Make sure we only accept requests from an allowed origin
+        request.reject();
+        console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
+        return;
+    }
+
+    connection = request.accept(null, request.origin);
+
+
+    console.log((new Date()) + ' Connection accepted.');
+    rl.prompt();
+
+
+    connection.on('message', function(message) {
+        if (message.type === 'utf8') {
+            console.log(); // newline after prompt
+            console.log('Received Message: ' + message.utf8Data);
+            //connection.sendUTF(message.utf8Data);
+            rl.prompt();
+        }
+        else if (message.type === 'binary') {
+            console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
+            //connection.sendBytes(message.binaryData);
+        }
+    });
+    connection.on('close', function(reasonCode, description) {
+        console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
+    });
+});
+
+
+var rl = readline.createInterface(process.stdin, process.stdout);
+rl.setPrompt('ws> ');
+
+setTimeout(doCli, 10);
+
+function doCli() {
+    rl.prompt();
+    rl.on('line', function (line) {
+        var words = line.trim().split(' '),
+            cmd = words.shift(),
+            str = words.join(' ');
+
+        switch(cmd) {
+            case 'hello':
+                console.log('hello back: ' + str);
+                break;
+
+            case 'quit':
+                process.exit(0);
+                break;
+
+            case 'm':
+                console.log('sending message: ' + str);
+                connection.sendUTF(str);
+                break;
+
+            default:
+                console.log('Say what?! [' + line.trim() + ']');
+                break;
+        }
+        rl.prompt();
+    }).on('close', function () {
+        console.log('quitting...');
+        process.exit(0);
+    });
+
+}