diff --git a/contrail-webui/controller/uuid-js.0.7.5.js b/contrail-webui/controller/uuid-js.0.7.5.js
new file mode 100644
index 0000000..e962dee
--- /dev/null
+++ b/contrail-webui/controller/uuid-js.0.7.5.js
@@ -0,0 +1,240 @@
+/*
+ * 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);
+
+// Returns a random integer between min and max
+// Using Math.round() will give you a non-uniform distribution!
+// @see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/random
+function getRandomInt(min, max) {
+  return Math.floor(Math.random() * (max - min + 1)) + min;
+}
+
+UUIDjs.randomUI04 = function() {
+  return getRandomInt(0, UUIDjs.limitUI04-1);
+};
+UUIDjs.randomUI06 = function() {
+  return getRandomInt(0, UUIDjs.limitUI06-1);
+};
+UUIDjs.randomUI08 = function() {
+  return getRandomInt(0, UUIDjs.limitUI08-1);
+};
+UUIDjs.randomUI12 = function() {
+  return getRandomInt(0, UUIDjs.limitUI12-1);
+};
+UUIDjs.randomUI14 = function() {
+  return getRandomInt(0, UUIDjs.limitUI14-1);
+};
+UUIDjs.randomUI16 = function() {
+  return getRandomInt(0, UUIDjs.limitUI16-1);
+};
+UUIDjs.randomUI32 = function() {
+  return getRandomInt(0, UUIDjs.limitUI32-1);
+};
+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;
