diff --git a/config/development.js b/config/development.js
index 088633d8..04d125f7 100644
--- a/config/development.js
+++ b/config/development.js
@@ -4,11 +4,6 @@ module.exports = {
    */
   TC_MEMBER_SERVICE_URL: "https://api.topcoder-dev.com/v3/members",
 
-  /**
-   * Topcoder Teams Service base URL
-   */
-  TC_TEAMS_SERVICE_URL: "https://api.topcoder-dev.com/taasmock",
-
   /**
    * URL of Topcoder Community Website
    */
@@ -18,4 +13,7 @@ module.exports = {
    * Email to report issues to
    */
   EMAIL_REPORT_ISSUE: "support+team-issue@topcoder-dev.com",
+  API: {
+    V5: "http://api.topcoder-dev.com/v5",
+  },
 };
diff --git a/config/production.js b/config/production.js
index f2b936ad..4e96d95a 100644
--- a/config/production.js
+++ b/config/production.js
@@ -4,11 +4,6 @@ module.exports = {
    */
   TC_MEMBER_SERVICE_URL: "https://api.topcoder.com/v3/members",
 
-  /**
-   * Topcoder Teams Service base URL
-   */
-  TC_TEAMS_SERVICE_URL: "http://localhost:8502/taasmock",
-
   /**
    * URL of Topcoder Community Website
    */
@@ -18,4 +13,7 @@ module.exports = {
    * Email to report issues to
    */
   EMAIL_REPORT_ISSUE: "support+team-issue@topcoder.com",
+  API: {
+    V5: "http://api.topcoder.com/v5",
+  },
 };
diff --git a/package-lock.json b/package-lock.json
index fb721d5e..9133be21 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1105,7 +1105,6 @@
       "version": "7.11.2",
       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
       "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
-      "dev": true,
       "requires": {
         "regenerator-runtime": "^0.13.4"
       }
@@ -2827,6 +2826,11 @@
         "pretty-format": "^25.2.1"
       }
     },
+    "@types/js-cookie": {
+      "version": "2.2.6",
+      "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz",
+      "integrity": "sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw=="
+    },
     "@types/json-schema": {
       "version": "7.0.6",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
@@ -3229,6 +3233,11 @@
         "@xtuc/long": "4.2.2"
       }
     },
+    "@xobotyi/scrollbar-width": {
+      "version": "1.9.5",
+      "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
+      "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
+    },
     "@xtuc/ieee754": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -4252,6 +4261,11 @@
         }
       }
     },
+    "bowser": {
+      "version": "1.9.4",
+      "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
+      "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ=="
+    },
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -5112,6 +5126,14 @@
       "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
       "dev": true
     },
+    "copy-to-clipboard": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
+      "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
+      "requires": {
+        "toggle-selection": "^1.0.6"
+      }
+    },
     "core-js": {
       "version": "2.6.11",
       "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
@@ -5353,6 +5375,15 @@
         }
       }
     },
+    "css-in-js-utils": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz",
+      "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==",
+      "requires": {
+        "hyphenate-style-name": "^1.0.2",
+        "isobject": "^3.0.1"
+      }
+    },
     "css-loader": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
@@ -5532,6 +5563,22 @@
         "fastparse": "^1.1.2"
       }
     },
+    "css-tree": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz",
+      "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
+      "requires": {
+        "mdn-data": "2.0.14",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
     "css.escape": {
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
@@ -6048,6 +6095,14 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "error-stack-parser": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz",
+      "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==",
+      "requires": {
+        "stackframe": "^1.1.1"
+      }
+    },
     "es-abstract": {
       "version": "1.18.0-next.1",
       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
@@ -6810,8 +6865,7 @@
     "fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "dev": true
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
     },
     "fast-diff": {
       "version": "1.2.0",
@@ -6831,6 +6885,16 @@
       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
       "dev": true
     },
+    "fast-shallow-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
+      "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
+    },
+    "fastest-stable-stringify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz",
+      "integrity": "sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg="
+    },
     "fastparse": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
@@ -7880,6 +7944,11 @@
       "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
       "dev": true
     },
+    "hyphenate-style-name": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
+      "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
+    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -7996,6 +8065,15 @@
       "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
       "dev": true
     },
+    "inline-style-prefixer": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz",
+      "integrity": "sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg==",
+      "requires": {
+        "bowser": "^1.7.3",
+        "css-in-js-utils": "^2.0.0"
+      }
+    },
     "inquirer": {
       "version": "7.3.3",
       "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
@@ -8432,8 +8510,7 @@
     "isobject": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
     },
     "isstream": {
       "version": "0.1.2",
@@ -11578,6 +11655,11 @@
       "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
       "dev": true
     },
+    "js-cookie": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+      "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -12048,6 +12130,11 @@
         "safe-buffer": "^5.1.2"
       }
     },
+    "mdn-data": {
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+    },
     "media-typer": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -12472,6 +12559,28 @@
       "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
       "dev": true
     },
+    "nano-css": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.0.tgz",
+      "integrity": "sha512-uM/9NGK9/E9/sTpbIZ/bQ9xOLOIHZwrrb/CRlbDHBU/GFS7Gshl24v/WJhwsVViWkpOXUmiZ66XO7fSB4Wd92Q==",
+      "requires": {
+        "css-tree": "^1.0.0-alpha.28",
+        "csstype": "^2.5.5",
+        "fastest-stable-stringify": "^1.0.1",
+        "inline-style-prefixer": "^4.0.0",
+        "rtl-css-js": "^1.9.0",
+        "sourcemap-codec": "^1.4.1",
+        "stacktrace-js": "^2.0.0",
+        "stylis": "3.5.0"
+      },
+      "dependencies": {
+        "csstype": {
+          "version": "2.6.14",
+          "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.14.tgz",
+          "integrity": "sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A=="
+        }
+      }
+    },
     "nanoid": {
       "version": "3.1.16",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.16.tgz",
@@ -14186,6 +14295,39 @@
         }
       }
     },
+    "react-universal-interface": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
+      "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw=="
+    },
+    "react-use": {
+      "version": "15.3.4",
+      "resolved": "https://registry.npmjs.org/react-use/-/react-use-15.3.4.tgz",
+      "integrity": "sha512-cHq1dELW6122oi1+xX7lwNyE/ugZs5L902BuO8eFJCfn2api1KeuPVG1M/GJouVARoUf54S2dYFMKo5nQXdTag==",
+      "requires": {
+        "@types/js-cookie": "2.2.6",
+        "@xobotyi/scrollbar-width": "1.9.5",
+        "copy-to-clipboard": "^3.2.0",
+        "fast-deep-equal": "^3.1.3",
+        "fast-shallow-equal": "^1.0.0",
+        "js-cookie": "^2.2.1",
+        "nano-css": "^5.2.1",
+        "react-universal-interface": "^0.6.2",
+        "resize-observer-polyfill": "^1.5.1",
+        "screenfull": "^5.0.0",
+        "set-harmonic-interval": "^1.0.1",
+        "throttle-debounce": "^2.1.0",
+        "ts-easing": "^0.2.0",
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
+      }
+    },
     "read-pkg": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
@@ -14274,8 +14416,7 @@
     "regenerator-runtime": {
       "version": "0.13.7",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
-      "dev": true
+      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
     },
     "regenerator-transform": {
       "version": "0.14.5",
@@ -14499,6 +14640,11 @@
       "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==",
       "dev": true
     },
+    "resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
     "resolve": {
       "version": "1.17.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
@@ -14734,6 +14880,14 @@
       "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
       "dev": true
     },
+    "rtl-css-js": {
+      "version": "1.14.0",
+      "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.14.0.tgz",
+      "integrity": "sha512-Dl5xDTeN3e7scU1cWX8c9b6/Nqz3u/HgR4gePc1kWXYiQWVQbKCEyK6+Hxve9LbcJ5EieHy1J9nJCN3grTtGwg==",
+      "requires": {
+        "@babel/runtime": "^7.1.2"
+      }
+    },
     "run-async": {
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
@@ -14884,6 +15038,11 @@
         "ajv-keywords": "^3.1.0"
       }
     },
+    "screenfull": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.0.2.tgz",
+      "integrity": "sha512-cCF2b+L/mnEiORLN5xSAz6H3t18i2oHh9BA8+CQlAh5DRw2+NFAGQJOSYbcGw8B2k04g/lVvFcfZ83b3ysH5UQ=="
+    },
     "scss-tokenizer": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
@@ -15050,6 +15209,11 @@
       "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
       "dev": true
     },
+    "set-harmonic-interval": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
+      "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g=="
+    },
     "set-value": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -15377,6 +15541,11 @@
       "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
       "dev": true
     },
+    "sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+    },
     "spawn-command": {
       "version": "0.0.2-1",
       "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
@@ -15496,12 +15665,51 @@
         "figgy-pudding": "^3.5.1"
       }
     },
+    "stack-generator": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz",
+      "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==",
+      "requires": {
+        "stackframe": "^1.1.1"
+      }
+    },
     "stack-utils": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
       "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
       "dev": true
     },
+    "stackframe": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz",
+      "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA=="
+    },
+    "stacktrace-gps": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz",
+      "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==",
+      "requires": {
+        "source-map": "0.5.6",
+        "stackframe": "^1.1.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+          "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI="
+        }
+      }
+    },
+    "stacktrace-js": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
+      "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
+      "requires": {
+        "error-stack-parser": "^2.0.6",
+        "stack-generator": "^2.0.5",
+        "stacktrace-gps": "^3.0.4"
+      }
+    },
     "static-extend": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -15760,6 +15968,11 @@
         }
       }
     },
+    "stylis": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz",
+      "integrity": "sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw=="
+    },
     "supports-color": {
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -15977,6 +16190,11 @@
       "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
       "dev": true
     },
+    "throttle-debounce": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz",
+      "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -16077,6 +16295,11 @@
         "repeat-string": "^1.6.1"
       }
     },
+    "toggle-selection": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+      "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
+    },
     "toidentifier": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
@@ -16129,6 +16352,11 @@
       "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
       "dev": true
     },
+    "ts-easing": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
+      "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
+    },
     "tslib": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
diff --git a/package.json b/package.json
index 64b1e967..e8a9c18e 100644
--- a/package.json
+++ b/package.json
@@ -66,7 +66,8 @@
     "react-avatar": "^3.9.7",
     "react-dom": "^16.12.0",
     "react-outside-click-handler": "^1.3.0",
-    "react-popper": "^2.2.3"
+    "react-popper": "^2.2.3",
+    "react-use": "^15.3.4"
   },
   "browserslist": [
     "last 1 version",
diff --git a/src/components/SkillsList/index.jsx b/src/components/SkillsList/index.jsx
index a95d1fdf..02ce61b6 100644
--- a/src/components/SkillsList/index.jsx
+++ b/src/components/SkillsList/index.jsx
@@ -15,13 +15,11 @@ import OutsideClickHandler from "react-outside-click-handler";
 
 const SkillsList = ({
   skills,
-  requiredSkills,
   limit = 3,
   showMatches = false,
 }) => {
-  const otherSkills = _.differenceBy(skills, requiredSkills, "id");
-  const skillsToShow = (skills || requiredSkills).slice(0, limit);
-  const skillsToHide = (skills || requiredSkills).slice(limit);
+  const skillsToShow = skills.slice(0, limit);
+  const skillsToHide = skills.slice(limit);
 
   const [isOpen, setIsOpen] = useState(false);
   const [referenceElement, setReferenceElement] = useState(null);
@@ -98,29 +96,11 @@ const SkillsList = ({
                 {...attributes.popper}
               >
                 <div styleName="popover-content">
-                  {requiredSkills && (
-                    <div styleName="skills-section">
-                      <div styleName="skills-title">Required Skills</div>
-                      <ul styleName="skills-list">
-                        {requiredSkills.map((skill) => (
-                          <li key={skill.id}>
-                            {showMatches &&
-                              (_.find(skills, { id: skill.id }) ? (
-                                <IconCheck />
-                              ) : (
-                                <IconCross />
-                              ))}{" "}
-                            {skill.name}
-                          </li>
-                        ))}
-                      </ul>
-                    </div>
-                  )}
                   {skills && (
                     <div styleName="skills-section">
-                      <div styleName="skills-title">Other Skills</div>
+                      <div styleName="skills-title">Skills</div>
                       <ul styleName="skills-list">
-                        {otherSkills.map((skill) => (
+                        {skills.map((skill) => (
                           <li key={skill.id}>{skill.name}</li>
                         ))}
                       </ul>
@@ -143,7 +123,6 @@ export const skillShape = PT.shape({
 
 SkillsList.propTypes = {
   skills: PT.arrayOf(skillShape),
-  requiredSkills: PT.arrayOf(skillShape),
   limit: PT.number,
   showMatches: PT.bool,
 };
diff --git a/src/components/SkillsSummary/index.jsx b/src/components/SkillsSummary/index.jsx
index c619d2d2..66ae1e56 100644
--- a/src/components/SkillsSummary/index.jsx
+++ b/src/components/SkillsSummary/index.jsx
@@ -10,7 +10,7 @@ import PercentageBar from "components/PercentageBar";
 import SkillsList from "components/SkillsList";
 import "./styles.module.scss";
 
-const SkillsSummary = ({ skills, requiredSkills, skillMatched, limit }) => {
+const SkillsSummary = ({ skills, skillMatched, limit }) => {
   return (
     <div>
       <div styleName="percentage">
@@ -19,7 +19,6 @@ const SkillsSummary = ({ skills, requiredSkills, skillMatched, limit }) => {
       </div>
       <SkillsList
         skills={skills}
-        requiredSkills={requiredSkills}
         limit={limit}
         showMatches
       />
@@ -34,7 +33,6 @@ const skillShape = PT.shape({
 
 SkillsSummary.propTypes = {
   skills: PT.arrayOf(skillShape),
-  requiredSkills: PT.arrayOf(skillShape),
   limit: PT.number,
   skillMatched: PT.number,
 };
diff --git a/src/routes/MyTeamsDetails/components/TeamMembers/index.jsx b/src/routes/MyTeamsDetails/components/TeamMembers/index.jsx
index 56da23d1..9ae881fb 100644
--- a/src/routes/MyTeamsDetails/components/TeamMembers/index.jsx
+++ b/src/routes/MyTeamsDetails/components/TeamMembers/index.jsx
@@ -22,13 +22,13 @@ import Input from "components/Input";
 import { skillShape } from "components/SkillsList";
 
 const TeamMembers = ({ team }) => {
-  const { members } = team;
-  const userDetails = useUserDetails(_.map(members, "userId"));
+  const { resources } = team;
+  const userDetails = useUserDetails(_.map(resources, "id"));
   const [filter, setFilter] = useState("");
 
   const filteredMembers = useMemo(
     () =>
-      members.filter((member) => {
+      resources.filter((member) => {
         const filterLowerCase = filter.toLowerCase();
         const lookupFields = _.compact([
           member.handle,
@@ -43,7 +43,7 @@ const TeamMembers = ({ team }) => {
           (field) => field.indexOf(filterLowerCase) > -1
         );
       }),
-    [members, filter]
+    [resources, filter]
   );
 
   const onFilterChange = useCallback(
@@ -91,20 +91,20 @@ const TeamMembers = ({ team }) => {
           />
         }
       />
-      {members.length === 0 && <div styleName="no-members">No members</div>}
-      {members.length > 0 && filteredMembers.length === 0 && (
+      {resources.length === 0 && <div styleName="no-members">No members</div>}
+      {resources.length > 0 && filteredMembers.length === 0 && (
         <div styleName="no-members">No members matching filter</div>
       )}
       {filteredMembers.length > 0 && (
         <div styleName="table">
           {pageMembers.map((member) => (
-            <div styleName="table-row" key={member.userId}>
+            <div styleName="table-row" key={member.id}>
               <div styleName="table-group-first">
                 <div styleName="table-cell cell-user">
                   <User
                     user={{
                       ...member,
-                      photoUrl: _.get(userDetails[member.userId], "photoURL"),
+                      photoUrl: _.get(userDetails[member.id], "photoURL"),
                     }}
                   />
                 </div>
@@ -115,14 +115,13 @@ const TeamMembers = ({ team }) => {
                     {moment(member.endDate).format(DAY_FORMAT)}
                   </div>
                   <div styleName="table-cell cell-money">
-                    {formatMoney(member.weeklyCost)}
+                    {formatMoney(member.weeklyCost || 0)}
                   </div>
                 </div>
               </div>
               <div styleName="table-group-second">
                 <div styleName="table-cell cell-skills">
                   <SkillsSummary
-                    requiredSkills={member.requiredSkills}
                     skills={member.skills}
                     skillMatched={member.skillMatched}
                   />
@@ -181,19 +180,14 @@ const TeamMembers = ({ team }) => {
 TeamMembers.propTypes = {
   team: PT.shape({
     name: PT.string,
-    members: PT.arrayOf(
+    resources: PT.arrayOf(
       PT.shape({
+        id: PT.string,
         handle: PT.string,
         firstName: PT.string,
         lastName: PT.string,
-        role: PT.string,
-        weeklyCost: PT.number,
-        rating: PT.number,
         skills: PT.arrayOf(skillShape),
         skillMatched: PT.number,
-        startDate: PT.string,
-        endDate: PT.string,
-        requiredSkills: PT.arrayOf(skillShape),
       })
     ),
   }),
diff --git a/src/routes/MyTeamsDetails/components/TeamPositions/index.jsx b/src/routes/MyTeamsDetails/components/TeamPositions/index.jsx
index e169e402..f838b171 100644
--- a/src/routes/MyTeamsDetails/components/TeamPositions/index.jsx
+++ b/src/routes/MyTeamsDetails/components/TeamPositions/index.jsx
@@ -30,7 +30,7 @@ const TeamPositions = ({ teamId, positions }) => {
               <div styleName="table-group-first">
                 <div styleName="table-cell cell-skills">
                   <strong>{position.description}</strong>
-                  <SkillsList requiredSkills={position.skills} limit={5} />
+                  <SkillsList skills={position.skills} limit={5} />
                 </div>
                 <div styleName="table-group-first-inner">
                   <div styleName="table-cell cell-date">
@@ -38,7 +38,7 @@ const TeamPositions = ({ teamId, positions }) => {
                     {moment(position.endDate).format(DAY_FORMAT)}
                   </div>
                   <div styleName="table-cell cell-money">
-                    {formatRate(position.customerRate, position.rateType)}
+                    {formatRate(position.customerRate || 0, position.rateType)}
                   </div>
                 </div>
               </div>
diff --git a/src/routes/MyTeamsDetails/components/TeamSummary/index.jsx b/src/routes/MyTeamsDetails/components/TeamSummary/index.jsx
index 5ace5197..f8d7f8d5 100644
--- a/src/routes/MyTeamsDetails/components/TeamSummary/index.jsx
+++ b/src/routes/MyTeamsDetails/components/TeamSummary/index.jsx
@@ -27,7 +27,7 @@ const TeamSummary = ({ team }) => {
         </DataItem>
 
         <DataItem title="Weekly Cost" icon={<IconMoney />}>
-          {formatMoney(team.weeklyCost)}
+          {formatMoney(team.weeklyCount || 0)}
         </DataItem>
 
         <DataItem title="Overall Rating" icon={<IconRating />}>
@@ -53,7 +53,7 @@ TeamSummary.propTypes = {
   team: PT.shape({
     name: PT.string,
     endDate: PT.string,
-    weeklyCost: PT.number,
+    weeklyCount: PT.number,
     rating: PT.number,
   }),
 };
diff --git a/src/routes/MyTeamsDetails/index.jsx b/src/routes/MyTeamsDetails/index.jsx
index c2ed0520..51f124d3 100644
--- a/src/routes/MyTeamsDetails/index.jsx
+++ b/src/routes/MyTeamsDetails/index.jsx
@@ -14,9 +14,15 @@ import LoadingIndicator from "components/LoadingIndicator";
 import TeamSummary from "./components/TeamSummary";
 import TeamMembers from "./components/TeamMembers";
 import TeamPositions from "./components/TeamPositions";
+import { useAsync } from "react-use";
+import {
+  getAuthUserTokens,
+} from "@topcoder/micro-frontends-navbar-app";
 
 const MyTeamsDetails = ({ teamId }) => {
-  const [team, loadingError] = useData(getTeamById, teamId);
+  const authUserTokens = useAsync(getAuthUserTokens);
+  const tokenV3 = authUserTokens.value ? authUserTokens.value.tokenV3 : null;
+  const [team, loadingError] = useData(getTeamById, tokenV3, teamId);
 
   return (
     <LayoutContainer>
@@ -27,7 +33,7 @@ const MyTeamsDetails = ({ teamId }) => {
           <PageHeader title={team.name} backTo="/taas/myteams" />
           <TeamSummary team={team} />
           <TeamMembers team={team} />
-          <TeamPositions positions={team.jobs} teamId={teamId} />
+          <TeamPositions positions={team.jobs || []} teamId={teamId} />
         </>
       )}
     </LayoutContainer>
diff --git a/src/routes/MyTeamsList/components/TeamCard/index.jsx b/src/routes/MyTeamsList/components/TeamCard/index.jsx
index a8828bef..67c71b9a 100644
--- a/src/routes/MyTeamsList/components/TeamCard/index.jsx
+++ b/src/routes/MyTeamsList/components/TeamCard/index.jsx
@@ -23,7 +23,7 @@ import { useUserDetails } from "hooks/useUserDetails";
 import ThreeDotsMenu from "components/ThreeDotsMenu";
 
 const TeamCard = ({ team }) => {
-  const userDetails = useUserDetails(_.map(team.members, "userId"));
+  const userDetails = useUserDetails(_.map(team.resources, "id"));
 
   return (
     <div styleName="team-card">
@@ -69,18 +69,18 @@ const TeamCard = ({ team }) => {
         </DataItem>
 
         <DataItem title="Weekly Cost" icon={<IconMoney />}>
-          {formatMoney(team.weeklyCost)}
+          {formatMoney(team.weeklyCost || 0)}
         </DataItem>
 
         <DataItem title="Number of Team Members" icon={<IconPeople />}>
-          {team.members.length} of {team.totalPositions}
+          {team.resources.length} of {team.totalPositions || 0}
         </DataItem>
       </div>
 
       <AvatarGroup
-        users={team.members.map((member) => ({
+        users={team.resources.map((member) => ({
           ...member,
-          photoUrl: _.get(userDetails[member.userId], "photoURL"),
+          photoUrl: _.get(userDetails[member.id], "photo_url"),
         }))}
       />
     </div>
@@ -91,7 +91,7 @@ TeamCard.propTypes = {
   team: PT.shape({
     id: PT.number.isRequired,
     name: PT.string,
-    members: PT.array,
+    resources: PT.array,
     positions: PT.array,
     startDate: PT.string,
     endDate: PT.string,
diff --git a/src/routes/MyTeamsList/index.jsx b/src/routes/MyTeamsList/index.jsx
index 5abb33fa..819f97c5 100644
--- a/src/routes/MyTeamsList/index.jsx
+++ b/src/routes/MyTeamsList/index.jsx
@@ -11,9 +11,15 @@ import { getMyTeams } from "../../services/teams";
 import TeamCard from "./components/TeamCard";
 import TeamCardGrid from "./components/TeamCardGrid";
 import LoadingIndicator from "../../components/LoadingIndicator";
+import { useAsync } from "react-use";
+import {
+  getAuthUserTokens,
+} from "@topcoder/micro-frontends-navbar-app";
 
 const MyTeamsList = () => {
-  const [myTeams, loadingError] = useData(getMyTeams);
+  const authUserTokens = useAsync(getAuthUserTokens);
+  const tokenV3 = authUserTokens.value ? authUserTokens.value.tokenV3 : null;
+  const [myTeams, loadingError] = useData(getMyTeams, tokenV3);
 
   return (
     <LayoutContainer>
diff --git a/src/routes/PositionDetails/PositionCandidates/index.jsx b/src/routes/PositionDetails/PositionCandidates/index.jsx
index 5ded3b76..d0fa8678 100644
--- a/src/routes/PositionDetails/PositionCandidates/index.jsx
+++ b/src/routes/PositionDetails/PositionCandidates/index.jsx
@@ -23,7 +23,6 @@ import Button from "components/Button";
 import Pagination from "components/Pagination";
 import IconResume from "../../../assets/images/icon-resume.svg";
 import { skillShape } from "components/SkillsList";
-import { TC_TEAMS_SERVICE_URL } from "../../../../config";
 
 /**
  * Generates a function to sort candidates
@@ -47,7 +46,6 @@ const createSortCandidatesMethod = (sortBy) => (candidate1, candidate2) => {
 const PositionCandidates = ({
   candidates,
   candidateStatus,
-  positionSkills,
 }) => {
   const userDetails = useUserDetails(_.map(candidates, "userId"));
   const [sortBy, setSortBy] = useState(CANDIDATES_SORT_BY.SKILL_MATCHED);
@@ -124,14 +122,13 @@ const PositionCandidates = ({
               </div>
               <div styleName="table-cell cell-skills">
                 <SkillsSummary
-                  requiredSkills={positionSkills}
                   skills={candidate.skills}
                   skillMatched={candidate.skillMatched}
                   limit={7}
                 />
                 {candidate.resumeLink && (
                   <a
-                    href={`${TC_TEAMS_SERVICE_URL}${candidate.resumeLink}`}
+                    href={`${candidate.resumeLink}`}
                     styleName="resume-link"
                   >
                     <IconResume />
@@ -184,7 +181,6 @@ const PositionCandidates = ({
 PositionCandidates.propType = {
   candidates: PT.array,
   candidateStatus: PT.oneOf(Object.values(CANDIDATE_STATUS)),
-  positionSkills: PT.arrayOf(skillShape),
 };
 
 export default PositionCandidates;
diff --git a/src/routes/PositionDetails/index.jsx b/src/routes/PositionDetails/index.jsx
index 545d9283..09d48fa9 100644
--- a/src/routes/PositionDetails/index.jsx
+++ b/src/routes/PositionDetails/index.jsx
@@ -14,11 +14,18 @@ import { getPositionDetails } from "services/teams";
 import PositionCandidates from "./PositionCandidates";
 import "./styles.module.scss";
 import CandidatesStatusFilter from "./CandidatesStatusFilter";
+import { useAsync } from "react-use";
+import {
+  getAuthUserTokens,
+} from "@topcoder/micro-frontends-navbar-app";
 
 const PositionDetails = ({ teamId, positionId }) => {
+  const authUserTokens = useAsync(getAuthUserTokens);
+  const tokenV3 = authUserTokens.value ? authUserTokens.value.tokenV3 : null;
   const [candidateStatus, setCandidateStatus] = useState(CANDIDATE_STATUS.OPEN);
   const [position, loadingError] = useData(
     getPositionDetails,
+    tokenV3,
     teamId,
     positionId
   );
@@ -50,7 +57,6 @@ const PositionDetails = ({ teamId, positionId }) => {
           <PositionCandidates
             candidates={position.candidates}
             candidateStatus={candidateStatus}
-            positionSkills={position.skills}
           />
         </>
       )}
diff --git a/src/services/teams.js b/src/services/teams.js
index abc5f34c..95ffcf7b 100644
--- a/src/services/teams.js
+++ b/src/services/teams.js
@@ -9,31 +9,56 @@ import config from "../../config";
 /**
  * Get my teams.
  *
+ * @param {string} tokenV3 login token
+ *
  * @returns {Promise<object[]>} list of teams
  */
-export const getMyTeams = () => {
-  return axios.get(`${config.TC_TEAMS_SERVICE_URL}/taas-teams`);
+export const getMyTeams = (tokenV3) => {
+  if (!tokenV3) {
+    return Promise.resolve({
+      data: null,
+    });
+  }
+  return axios.get(`${config.API.V5}/taas-teams`, {
+    headers: { Authorization: `Bearer ${tokenV3}` },
+  });
 };
 
 /**
  * Get team by id.
  *
+ * @param {string} tokenV3 login token
  * @param {string|number} teamId team id
  *
  * @returns {Promise<{}>} team object
  */
-export const getTeamById = (teamId) => {
-  return axios.get(`${config.TC_TEAMS_SERVICE_URL}/taas-teams/${teamId}`);
+export const getTeamById = (tokenV3, teamId) => {
+  if (!tokenV3) {
+    return Promise.resolve({
+      data: null,
+    });
+  }
+  return axios.get(`${config.API.V5}/taas-teams/${teamId}`, {
+    headers: { Authorization: `Bearer ${tokenV3}` },
+  });
 };
 
 /**
  * Get team position details.
  *
+ * @param {string} tokenV3 login token
  * @param {string|number} teamId team id
  * @param {string|number} positionId position id
  *
  * @returns {Promise<object{}>} job object
  */
-export const getPositionDetails = (teamId, positionId) => {
-  return axios.get(`${config.TC_TEAMS_SERVICE_URL}/jobs/${positionId}`);
+export const getPositionDetails = (tokenV3, teamId, positionId) => {
+  if (!tokenV3) {
+    return Promise.resolve({
+      data: null,
+    });
+  }
+  return axios.get(`${config.API.V5}/taas-teams/${teamId}/jobs/${positionId}`, {
+    headers: { Authorization: `Bearer ${tokenV3}` },
+  });
 };