diff --git a/contrail-webui/controller/uuid.js b/contrail-webui/controller/uuid.js
new file mode 100644
index 0000000..ee4b388
--- /dev/null
+++ b/contrail-webui/controller/uuid.js
@@ -0,0 +1,233 @@
+/*
+ * UUID-js: A js library to generate and parse UUIDs, TimeUUIDs and generate
+ * TimeUUID based on dates for range selections.
+ * @see http://www.ietf.org/rfc/rfc4122.txt
+ **/
+
+function UUIDjs() {
+};
+
+UUIDjs.maxFromBits = function(bits) {
+  return Math.pow(2, bits);
+};
+
+UUIDjs.limitUI04 = UUIDjs.maxFromBits(4);
+UUIDjs.limitUI06 = UUIDjs.maxFromBits(6);
+UUIDjs.limitUI08 = UUIDjs.maxFromBits(8);
+UUIDjs.limitUI12 = UUIDjs.maxFromBits(12);
+UUIDjs.limitUI14 = UUIDjs.maxFromBits(14);
+UUIDjs.limitUI16 = UUIDjs.maxFromBits(16);
+UUIDjs.limitUI32 = UUIDjs.maxFromBits(32);
+UUIDjs.limitUI40 = UUIDjs.maxFromBits(40);
+UUIDjs.limitUI48 = UUIDjs.maxFromBits(48);
+
+UUIDjs.randomUI04 = function() {
+  return Math.round(Math.random() * UUIDjs.limitUI04);
+};
+UUIDjs.randomUI06 = function() {
+  return Math.round(Math.random() * UUIDjs.limitUI06);
+};
+UUIDjs.randomUI08 = function() {
+  return Math.round(Math.random() * UUIDjs.limitUI08);
+};
+UUIDjs.randomUI12 = function() {
+  return Math.round(Math.random() * UUIDjs.limitUI12);
+};
+UUIDjs.randomUI14 = function() {
+  return Math.round(Math.random() * UUIDjs.limitUI14);
+};
+UUIDjs.randomUI16 = function() {
+  return Math.round(Math.random() * UUIDjs.limitUI16);
+};
+UUIDjs.randomUI32 = function() {
+  return Math.round(Math.random() * UUIDjs.limitUI32);
+};
+UUIDjs.randomUI40 = function() {
+  return (0 | Math.random() * (1 << 30)) + (0 | Math.random() * (1 << 40 - 30)) * (1 << 30);
+};
+UUIDjs.randomUI48 = function() {
+  return (0 | Math.random() * (1 << 30)) + (0 | Math.random() * (1 << 48 - 30)) * (1 << 30);
+};
+
+UUIDjs.paddedString = function(string, length, z) {
+  string = String(string);
+  z = (!z) ? '0' : z;
+  var i = length - string.length;
+  for (; i > 0; i >>>= 1, z += z) {
+    if (i & 1) {
+      string = z + string;
+    }
+  }
+  return string;
+};
+
+UUIDjs.prototype.fromParts = function(timeLow, timeMid, timeHiAndVersion, clockSeqHiAndReserved, clockSeqLow, node) {
+  this.version = (timeHiAndVersion >> 12) & 0xF;
+  this.hex = UUIDjs.paddedString(timeLow.toString(16), 8)
+             + '-'
+             + UUIDjs.paddedString(timeMid.toString(16), 4)
+             + '-'
+             + UUIDjs.paddedString(timeHiAndVersion.toString(16), 4)
+             + '-'
+             + UUIDjs.paddedString(clockSeqHiAndReserved.toString(16), 2)
+             + UUIDjs.paddedString(clockSeqLow.toString(16), 2)
+             + '-'
+             + UUIDjs.paddedString(node.toString(16), 12);
+  return this;
+};
+
+UUIDjs.prototype.toString = function() {
+  return this.hex;
+};
+UUIDjs.prototype.toURN = function() {
+  return 'urn:uuid:' + this.hex;
+};
+
+UUIDjs.prototype.toBytes = function() {
+  var parts = this.hex.split('-');
+  var ints = [];
+  var intPos = 0;
+  for (var i = 0; i < parts.length; i++) {
+    for (var j = 0; j < parts[i].length; j+=2) {
+      ints[intPos++] = parseInt(parts[i].substr(j, 2), 16);
+    }
+  }
+  return ints;
+};
+
+UUIDjs.prototype.equals = function(uuid) {
+  if (!(uuid instanceof UUID)) {
+    return false;
+  }
+  if (this.hex !== uuid.hex) {
+    return false;
+  }
+  return true;
+};
+
+UUIDjs.getTimeFieldValues = function(time) {
+  var ts = time - Date.UTC(1582, 9, 15);
+  var hm = ((ts / 0x100000000) * 10000) & 0xFFFFFFF;
+  return { low: ((ts & 0xFFFFFFF) * 10000) % 0x100000000,
+            mid: hm & 0xFFFF, hi: hm >>> 16, timestamp: ts };
+};
+
+UUIDjs._create4 = function() {
+  return new UUIDjs().fromParts(
+    UUIDjs.randomUI32(),
+    UUIDjs.randomUI16(),
+    0x4000 | UUIDjs.randomUI12(),
+    0x80   | UUIDjs.randomUI06(),
+    UUIDjs.randomUI08(),
+    UUIDjs.randomUI48()
+  );
+};
+
+UUIDjs._create1 = function() {
+  var now = new Date().getTime();
+  var sequence = UUIDjs.randomUI14();
+  var node = (UUIDjs.randomUI08() | 1) * 0x10000000000 + UUIDjs.randomUI40();
+  var tick = UUIDjs.randomUI04();
+  var timestamp = 0;
+  var timestampRatio = 1/4;
+
+  if (now != timestamp) {
+    if (now < timestamp) {
+      sequence++;
+    }
+    timestamp = now;
+    tick = UUIDjs.randomUI04();
+  } else if (Math.random() < timestampRatio && tick < 9984) {
+    tick += 1 + UUIDjs.randomUI04();
+  } else {
+    sequence++;
+  }
+
+  var tf = UUIDjs.getTimeFieldValues(timestamp);
+  var tl = tf.low + tick;
+  var thav = (tf.hi & 0xFFF) | 0x1000;
+
+  sequence &= 0x3FFF;
+  var cshar = (sequence >>> 8) | 0x80;
+  var csl = sequence & 0xFF;
+
+  return new UUIDjs().fromParts(tl, tf.mid, thav, cshar, csl, node);
+};
+
+UUIDjs.create = function(version) {
+  version = version || 4;
+  return this['_create' + version]();
+};
+
+UUIDjs.fromTime = function(time, last) {
+  last = (!last) ? false : last;
+  var tf = UUIDjs.getTimeFieldValues(time);
+  var tl = tf.low;
+  var thav = (tf.hi & 0xFFF) | 0x1000;  // set version '0001'
+  if (last === false) {
+    return new UUIDjs().fromParts(tl, tf.mid, thav, 0, 0, 0);
+  } else {
+    return new UUIDjs().fromParts(tl, tf.mid, thav, 0x80 | UUIDjs.limitUI06, UUIDjs.limitUI08 - 1, UUIDjs.limitUI48 - 1);
+  }
+};
+
+UUIDjs.firstFromTime = function(time) {
+  return UUIDjs.fromTime(time, false);
+};
+UUIDjs.lastFromTime = function(time) {
+  return UUIDjs.fromTime(time, true);
+};
+
+UUIDjs.fromURN = function(strId) {
+  var r, p = /^(?:urn:uuid:|\{)?([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{2})([0-9a-f]{2})-([0-9a-f]{12})(?:\})?$/i;
+  if ((r = p.exec(strId))) {
+    return new UUIDjs().fromParts(parseInt(r[1], 16), parseInt(r[2], 16),
+                            parseInt(r[3], 16), parseInt(r[4], 16),
+                            parseInt(r[5], 16), parseInt(r[6], 16));
+  }
+  return null;
+};
+
+UUIDjs.fromBytes = function(ints) {
+  if (ints.length < 5) {
+    return null;
+  }
+  var str = '';
+  var pos = 0;
+  var parts = [4, 2, 2, 2, 6];
+  for (var i = 0; i < parts.length; i++) {
+    for (var j = 0; j < parts[i]; j++) {
+      var octet = ints[pos++].toString(16);
+      if (octet.length == 1) {
+        octet = '0' + octet;
+      }
+      str += octet;
+    }
+    if (parts[i] !== 6) {
+      str += '-';
+    }
+  }
+  return UUIDjs.fromURN(str);
+};
+
+UUIDjs.fromBinary = function(binary) {
+  var ints = [];
+  for (var i = 0; i < binary.length; i++) {
+    ints[i] = binary.charCodeAt(i);
+    if (ints[i] > 255 || ints[i] < 0) {
+      throw new Error('Unexpected byte in binary data.');
+    }
+  }
+  return UUIDjs.fromBytes(ints);
+};
+
+// Aliases to support legacy code. Do not use these when writing new code as
+// they may be removed in future versions!
+UUIDjs.new = function() {
+  return this.create(4);
+};
+UUIDjs.newTS = function() {
+  return this.create(1);
+};
+
+//module.exports = UUIDjs;
