diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2Traffic.js b/web/gui/src/main/webapp/app/view/topo2/topo2Traffic.js
new file mode 100644
index 0000000..4515b8a
--- /dev/null
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Traffic.js
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function () {
+    'use strict';
+
+    // injected refs
+    var $log, fs, flash, wss, api;
+
+    // configuration
+    var allTrafficTypes = [
+            'flowStatsBytes',
+            'portStatsBitSec',
+            'portStatsPktSec'
+        ],
+        allTrafficMsgs = [
+            'Flow Stats (bytes)',
+            'Port Stats (bits / second)',
+            'Port Stats (packets / second)'
+        ];
+
+    // internal state
+    var mode = null,
+        allIndex = 0;
+
+    // === -----------------------------------------------------
+
+    function cancelTraffic() {
+        $log.debug('Topo2Traffic: Cancel Traffic');
+
+        if (!mode) {
+            return false;
+        }
+        mode = null;
+        wss.sendEvent('topo2CancelTraffic');
+        flash.flash('Traffic monitoring canceled');
+        return true;
+    }
+
+    function showAllTraffic() {
+        $log.debug('Topo2Traffic: Show All Traffic');
+
+        mode = 'allFlowPort';
+        wss.sendEvent('topo2RequestAllTraffic', {
+            trafficType: allTrafficTypes[allIndex]
+        });
+        flash.flash(allTrafficMsgs[allIndex]);
+        allIndex = (allIndex + 1) % 3;
+    }
+
+    // === -----------------------------------------------------
+
+    angular.module('ovTopo2')
+        .factory('Topo2TrafficService', [
+            '$log', 'FnService', 'FlashService', 'WebSocketService',
+
+            function (_$log_, _fs_, _flash_, _wss_) {
+                $log = _$log_;
+                fs = _fs_;
+                flash = _flash_;
+                wss = _wss_;
+
+                return {
+                    initTraffic: function (_api_) { api = _api_; },
+                    destroyTraffic: function () {},
+
+                    // invoked from toolbar overlay buttons or keystrokes
+                    cancelTraffic: cancelTraffic,
+                    showAllTraffic: showAllTraffic
+                }
+            }
+        ]);
+}());
\ No newline at end of file
