Merge "Unit tests for the DefaultFlowRule class"
diff --git a/web/gui/src/main/webapp/json/ev/intentSketch/scenario.json b/web/gui/src/main/webapp/json/ev/intentSketch/scenario.json
index 136d027..f109dde 100644
--- a/web/gui/src/main/webapp/json/ev/intentSketch/scenario.json
+++ b/web/gui/src/main/webapp/json/ev/intentSketch/scenario.json
@@ -5,5 +5,9 @@
   "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/main/webapp/json/ev/simple/scenario.json b/web/gui/src/main/webapp/json/ev/simple/scenario.json
index 5fb8869..c47d40e 100644
--- a/web/gui/src/main/webapp/json/ev/simple/scenario.json
+++ b/web/gui/src/main/webapp/json/ev/simple/scenario.json
@@ -22,4 +22,4 @@
     "12. remove link",
     ""
   ]
-}
\ No newline at end of file
+}
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_10_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_10_onos.json
index 9b30b4a..ec0f258 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_10_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_10_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffffff04",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff04",
       "FF:FF:FF:FF:FF:04",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_11_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_11_onos.json
index 3b361d5..04e6754 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_11_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_11_onos.json
@@ -3,15 +3,15 @@
   "payload": {
     "id": "of:0000ffffffff000A",
     "type": "switch",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffff000A",
       "FF:FF:FF:FF:00:0A",
       "?"
     ],
     "metaUi": {
-      "Zx": 832,
-      "Zy": 223
+      "x": 832,
+      "y": 223
     }
   }
 }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_12_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_12_onos.json
index e53a6cd..c778cd5 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_12_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_12_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffff0001",
     "type": "switch",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffff0001",
       "FF:FF:FF:FF:00:01",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_13_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_13_onos.json
index 6d2341f..a0cc21f 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_13_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_13_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffffff01",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff01",
       "FF:FF:FF:FF:FF:01",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_14_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_14_onos.json
index e196148..93127a8 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_14_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_14_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffff0004",
     "type": "switch",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffff0004",
       "FF:FF:FF:FF:00:04",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_15_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_15_onos.json
index 30ba9f3..f2d6891 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_15_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_15_onos.json
@@ -3,15 +3,15 @@
   "payload": {
     "id": "of:0000ffffffffff0A",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff0A",
       "FF:FF:FF:FF:FF:0A",
       "?"
     ],
     "metaUi": {
-      "Zx": 840,
-      "Zy": 290
+      "x": 840,
+      "y": 290
     }
   }
 }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_16_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_16_onos.json
index 274adc1..3b0db4b 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_16_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_16_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffffff09",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff09",
       "FF:FF:FF:FF:FF:09",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_17_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_17_onos.json
index 82272a4..69c62b9 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_17_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_17_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff02/20-of:0000ffffffffff05/10",
+    "type": "optical",
+    "linkWidth": 4,
     "src": "of:0000ffffffffff02",
     "srcPort": "20",
     "dst": "of:0000ffffffffff05",
     "dstPort": "10",
-    "type": "optical",
-    "linkWidth": 6,
     "props" : {
       "BW": "80 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_18_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_18_onos.json
index 5687698..d11f13e 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_18_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_18_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffff000A/2-of:0000ffffffffff0A/1",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffff000A",
     "srcPort": "2",
     "dst": "of:0000ffffffffff0A",
     "dstPort": "1",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "100 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_19_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_19_onos.json
index 24aeb2d..1349a3b 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_19_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_19_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff03/10-of:0000ffffffffff02/10",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffffff03",
     "srcPort": "10",
     "dst": "of:0000ffffffffff02",
     "dstPort": "10",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_1_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_1_onos.json
index d4c8ddb..00a3e17 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_1_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_1_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffffff08",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff08",
       "FF:FF:FF:FF:FF:08",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_20_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_20_onos.json
index f42b50e..e4d2161 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_20_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_20_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff07/21-of:0000ffffffffff05/20",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffffff07",
     "srcPort": "21",
     "dst": "of:0000ffffffffff05",
     "dstPort": "20",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_21_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_21_onos.json
index 5af0ac7..ccdad88 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_21_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_21_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffff0001/2-of:0000ffffffffff01/1",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffff0001",
     "srcPort": "2",
     "dst": "of:0000ffffffffff01",
     "dstPort": "1",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_22_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_22_onos.json
index 0d4cf2b..52a4a02 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_22_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_22_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff09/20-of:0000ffffffffff0A/20",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffffff09",
     "srcPort": "20",
     "dst": "of:0000ffffffffff0A",
     "dstPort": "20",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_23_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_23_onos.json
index fff0f2b..be778551 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_23_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_23_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
-    "src": "of:0000ffffffffff06",
-    "srcPort": "20",
-    "dst": "of:0000ffffffffff05",
-    "dstPort": "30",
+    "id": "of:0000ffffffffff07/30-of:0000ffffffffff08/20",
     "type": "optical",
-    "linkWidth": 6,
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff07",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "20",
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_24_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_24_onos.json
index 756b6c1..6ae5192 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_24_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_24_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
-    "src": "of:0000ffffffffff07",
-    "srcPort": "30",
-    "dst": "of:0000ffffffffff08",
-    "dstPort": "20",
+    "id": "of:0000ffffffffff02/10-of:0000ffffffffff01/10",
     "type": "optical",
-    "linkWidth": 6,
+    "linkWidth": 2,
+    "src": "of:0000ffffffffff02",
+    "srcPort": "10",
+    "dst": "of:0000ffffffffff01",
+    "dstPort": "10",
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_25_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_25_onos.json
index adad8a6..7fabce6 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_25_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_25_onos.json
@@ -1,14 +1,15 @@
 {
   "event": "addLink",
   "payload": {
-    "src": "of:0000ffffffffff03",
-    "srcPort": "20",
-    "dst": "of:0000ffffffffff06",
+    "id": "of:0000ffffffffff04/27-of:0000ffffffffff08/10",
+    "src": "of:0000ffffffffff04",
+    "srcPort": "27",
+    "dst": "of:0000ffffffffff08",
     "dstPort": "10",
     "type": "optical",
     "linkWidth": 2,
     "props" : {
-      "BW": "70 G"
+      "BW": "30 G"
     }
   }
 }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_26_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_26_onos.json
index 245c823..b89a287 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_26_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_26_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
-    "src": "of:0000ffffffffff02",
-    "srcPort": "10",
-    "dst": "of:0000ffffffffff01",
-    "dstPort": "10",
+    "id": "of:0000ffffffff0003/2-of:0000ffffffffff03/1",
     "type": "optical",
     "linkWidth": 2,
+    "src": "of:0000ffffffff0003",
+    "srcPort": "2",
+    "dst": "of:0000ffffffffff03",
+    "dstPort": "1",
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_27_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_27_onos.json
index b856573..112a33e 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_27_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_27_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff09/1-of:0000ffffffff0009/2",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffffff09",
     "srcPort": "1",
     "dst": "of:0000ffffffff0009",
     "dstPort": "2",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_28_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_28_onos.json
index 232dc3b..52207df 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_28_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_28_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff03/30-of:0000ffffffffff04/10",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffffff03",
     "srcPort": "30",
     "dst": "of:0000ffffffffff04",
     "dstPort": "10",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_29_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_29_onos.json
index 1a845ce..c4660a3 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_29_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_29_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff07/20-of:0000ffffffffff09/10",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffffff07",
     "srcPort": "20",
     "dst": "of:0000ffffffffff09",
     "dstPort": "10",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_2_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_2_onos.json
index fd446ba..8d4fbfa 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_2_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_2_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffffff03",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff03",
       "FF:FF:FF:FF:FF:03",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_30_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_30_onos.json
index a617f45..e23cc2a 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_30_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_30_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff0A/10-of:0000ffffffffff08/30",
+    "type": "optical",
+    "linkWidth": 4,
     "src": "of:0000ffffffffff0A",
     "srcPort": "10",
     "dst": "of:0000ffffffffff08",
     "dstPort": "30",
-    "type": "optical",
-    "linkWidth": 6,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_31_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_31_onos.json
index 438aa1b..a798e53 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_31_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_31_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffff0004/2-of:0000ffffffffff04/1",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffff0004",
     "srcPort": "2",
     "dst": "of:0000ffffffffff04",
     "dstPort": "1",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_32_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_32_onos.json
index c479f01..aac204f 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_32_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_32_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff07/1-of:0000ffffffff0007/2",
+    "type": "optical",
+    "linkWidth": 2,
     "src": "of:0000ffffffffff07",
     "srcPort": "1",
     "dst": "of:0000ffffffff0007",
     "dstPort": "2",
-    "type": "optical",
-    "linkWidth": 2,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_33_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_33_onos.json
index 2cc3a32..ab23e93 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_33_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_33_onos.json
@@ -1,14 +1,17 @@
 {
-  "event": "addLink",
+  "event": "updateDevice",
   "payload": {
-    "src": "of:0000ffffffff0003",
-    "srcPort": "2",
-    "dst": "of:0000ffffffffff03",
-    "dstPort": "1",
-    "type": "optical",
-    "linkWidth": 2,
-    "props" : {
-      "BW": "70 G"
+    "id": "of:0000ffffffffff06",
+    "type": "roadm",
+    "online": true,
+    "labels": [
+      "0000ffffffffff06",
+      "FF:FF:FF:FF:FF:06",
+      "?"
+    ],
+    "metaUi": {
+      "x": 336,
+      "y": 254
     }
   }
 }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_34_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_34_onos.json
index fa5e3bc..09be8e6 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_34_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_34_onos.json
@@ -1,12 +1,13 @@
 {
   "event": "addLink",
   "payload": {
+    "id": "of:0000ffffffffff06/20-of:0000ffffffffff05/30",
     "src": "of:0000ffffffffff06",
-    "srcPort": "30",
-    "dst": "of:0000ffffffffff08",
-    "dstPort": "10",
+    "srcPort": "20",
+    "dst": "of:0000ffffffffff05",
+    "dstPort": "30",
     "type": "optical",
-    "linkWidth": 6,
+    "linkWidth": 4,
     "props" : {
       "BW": "70 G"
     }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_35_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_35_onos.json
index c579e59..4b612e9 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_35_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_35_onos.json
@@ -1,14 +1,15 @@
 {
   "event": "addLink",
   "payload": {
-    "src": "of:0000ffffffffff04",
-    "srcPort": "27",
-    "dst": "of:0000ffffffffff08",
-    "dstPort": "10",
+    "id": "of:0000ffffffffff03/20-of:0000ffffffffff06/10",
     "type": "optical",
     "linkWidth": 2,
+    "src": "of:0000ffffffffff03",
+    "srcPort": "20",
+    "dst": "of:0000ffffffffff06",
+    "dstPort": "10",
     "props" : {
-      "BW": "30 G"
+      "BW": "70 G"
     }
   }
 }
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_36_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_36_onos.json
new file mode 100644
index 0000000..cddb929
--- /dev/null
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_36_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "addLink",
+  "payload": {
+    "id": "of:0000ffffffffff06/30-of:0000ffffffffff08/10",
+    "type": "optical",
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff06",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_37_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_37_onos.json
new file mode 100644
index 0000000..6f608cd
--- /dev/null
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_37_onos.json
@@ -0,0 +1,17 @@
+{
+  "event": "updateDevice",
+  "payload": {
+    "id": "of:0000ffffffffff08",
+    "type": "roadm",
+    "online": false,
+    "labels": [
+      "0000ffffffffff08",
+      "FF:FF:FF:FF:FF:08",
+      "?"
+    ],
+    "metaUi": {
+      "x": 539,
+      "y": 186
+    }
+  }
+}
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_38_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_38_onos.json
new file mode 100644
index 0000000..09a0339
--- /dev/null
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_38_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffffff07/30-of:0000ffffffffff08/20",
+    "type": "optical",
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff07",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "20",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_39_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_39_onos.json
new file mode 100644
index 0000000..a85cee6
--- /dev/null
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_39_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffffff04/27-of:0000ffffffffff08/10",
+    "src": "of:0000ffffffffff04",
+    "srcPort": "27",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "10",
+    "type": "optical",
+    "linkWidth": 2,
+    "props" : {
+      "BW": "30 G"
+    }
+  }
+}
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_3_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_3_onos.json
index 23bf26a..b4c3537 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_3_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_3_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffff0007",
     "type": "switch",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffff0007",
       "FF:FF:FF:FF:00:07",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_40_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_40_onos.json
new file mode 100644
index 0000000..1b95d24
--- /dev/null
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_40_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffffff0A/10-of:0000ffffffffff08/30",
+    "type": "optical",
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff0A",
+    "srcPort": "10",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "30",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_41_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_41_onos.json
new file mode 100644
index 0000000..1efc1f6
--- /dev/null
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_41_onos.json
@@ -0,0 +1,15 @@
+{
+  "event": "removeLink",
+  "payload": {
+    "id": "of:0000ffffffffff06/30-of:0000ffffffffff08/10",
+    "type": "optical",
+    "linkWidth": 4,
+    "src": "of:0000ffffffffff06",
+    "srcPort": "30",
+    "dst": "of:0000ffffffffff08",
+    "dstPort": "10",
+    "props" : {
+      "BW": "70 G"
+    }
+  }
+}
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_4_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_4_onos.json
index c600401..053b963 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_4_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_4_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffff0009",
     "type": "switch",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffff0009",
       "FF:FF:FF:FF:00:09",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_5_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_5_onos.json
index af912a7..332bfdb 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_5_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_5_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffffff02",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff02",
       "FF:FF:FF:FF:FF:02",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_6_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_6_onos.json
index 50273bc..c764bc1 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_6_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_6_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffff0003",
     "type": "switch",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffff0003",
       "FF:FF:FF:FF:00:03",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_7_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_7_onos.json
index 7cd29b0..25a6dce 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_7_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_7_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffffff07",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff07",
       "FF:FF:FF:FF:FF:07",
diff --git a/web/gui/src/main/webapp/json/ev/startup/ev_9_onos.json b/web/gui/src/main/webapp/json/ev/startup/ev_9_onos.json
index 1e0f427..0f497c0 100644
--- a/web/gui/src/main/webapp/json/ev/startup/ev_9_onos.json
+++ b/web/gui/src/main/webapp/json/ev/startup/ev_9_onos.json
@@ -3,7 +3,7 @@
   "payload": {
     "id": "of:0000ffffffffff05",
     "type": "roadm",
-    "online": false,
+    "online": true,
     "labels": [
       "0000ffffffffff05",
       "FF:FF:FF:FF:FF:05",
diff --git a/web/gui/src/main/webapp/json/ev/startup/scenario.json b/web/gui/src/main/webapp/json/ev/startup/scenario.json
index 37939ca0..089d53a 100644
--- a/web/gui/src/main/webapp/json/ev/startup/scenario.json
+++ b/web/gui/src/main/webapp/json/ev/startup/scenario.json
@@ -6,5 +6,15 @@
   "title": "Startup Scenario",
   "params": {
     "lastAuto": 32
-  }
+  },
+  "description": [
+    "Loads 16 devices (10 optical, 6 packet)",
+    " and their associated links.",
+    "",
+    "Press 'S' to load initial events.",
+    "",
+    "Press spacebar to complete the scenario...",
+    " * 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/main/webapp/topo2.js b/web/gui/src/main/webapp/topo2.js
index 94b2e9e..701f914 100644
--- a/web/gui/src/main/webapp/topo2.js
+++ b/web/gui/src/main/webapp/topo2.js
@@ -30,6 +30,7 @@
     // configuration data
     var config = {
         useLiveData: true,
+        fnTrace: true,
         debugOn: false,
         debug: {
             showNodeXY: true,
@@ -180,6 +181,11 @@
         return config.debugOn && config.debug[what];
     }
 
+    function fnTrace(msg, id) {
+        if (config.fnTrace) {
+            console.log('FN: ' + msg + ' [' + id + ']');
+        }
+    }
 
     // ==============================
     // Key Callbacks
@@ -220,7 +226,7 @@
         var v = scenario.view,
             frame;
         if (stack.length === 0) {
-            v.alert('Error:\n\nNo event #' + evn + ' found.');
+            v.alert('Oops!\n\nNo event #' + evn + ' found.');
             return;
         }
         frame = stack.shift();
@@ -334,6 +340,7 @@
     function logicError(msg) {
         // TODO, report logic error to server, via websock, so it can be logged
         network.view.alert('Logic Error:\n\n' + msg);
+        console.warn(msg);
     }
 
     var eventDispatch = {
@@ -350,6 +357,7 @@
     };
 
     function addDevice(data) {
+        fnTrace('addDevice', data.payload.id);
         var device = data.payload,
             nodeData = createDeviceNode(device);
         network.nodes.push(nodeData);
@@ -359,6 +367,7 @@
     }
 
     function addLink(data) {
+        fnTrace('addLink', data.payload.id);
         var link = data.payload,
             lnk = createLink(link);
         if (lnk) {
@@ -370,6 +379,7 @@
     }
 
     function addHost(data) {
+        fnTrace('addHost', data.payload.id);
         var host = data.payload,
             node = createHostNode(host),
             lnk;
@@ -388,6 +398,7 @@
     }
 
     function updateDevice(data) {
+        fnTrace('updateDevice', data.payload.id);
         var device = data.payload,
             id = device.id,
             nodeData = network.lookup[id];
@@ -400,6 +411,7 @@
     }
 
     function updateLink(data) {
+        fnTrace('updateLink', data.payload.id);
         var link = data.payload,
             id = link.id,
             linkData = network.lookup[id];
@@ -412,6 +424,7 @@
     }
 
     function updateHost(data) {
+        fnTrace('updateHost', data.payload.id);
         var host = data.payload,
             id = host.id,
             hostData = network.lookup[id];
@@ -424,6 +437,7 @@
     }
 
     function removeLink(data) {
+        fnTrace('removeLink', data.payload.id);
         var link = data.payload,
             id = link.id,
             linkData = network.lookup[id];
@@ -435,6 +449,7 @@
     }
 
     function showPath(data) {
+        fnTrace('showPath', data.payload.id);
         var links = data.payload.links,
             s = [ data.event + "\n" + links.length ];
         links.forEach(function (d, i) {
@@ -883,7 +898,7 @@
         // remove from links array
         var idx = find(linkData.id, network.links);
 
-        network.links.splice(linkData.index, 1);
+        network.links.splice(idx, 1);
         // remove from SVG
         updateLinks();
     }
@@ -1058,13 +1073,12 @@
         d3.json(urlSc, function(err, data) {
             var p = data && data.params || {},
                 desc = data && data.description || null,
-                intro;
+                intro = data && data.title;
 
             if (err) {
                 view.alert('No scenario found:\n\n' + urlSc + '\n\n' + err);
             } else {
                 sc.params = p;
-                intro = "Scenario loaded: " + ctx + '\n\n' + data.title;
                 if (desc) {
                     intro += '\n\n  ' + desc.join('\n  ');
                 }