diff --git a/__tests__/__snapshots__/index.js.snap b/__tests__/__snapshots__/index.js.snap
index f1c7c70a..53d2317a 100644
--- a/__tests__/__snapshots__/index.js.snap
+++ b/__tests__/__snapshots__/index.js.snap
@@ -225,9 +225,9 @@ Object {
       "setEndDate": [Function],
       "setReviewOpportunityType": [Function],
       "setStartDate": [Function],
-      "setSubtracks": [Function],
       "setTags": [Function],
       "setText": [Function],
+      "setTypes": [Function],
     },
   },
   "errors": Object {
@@ -372,9 +372,10 @@ Object {
   },
   "tc": Object {
     "COMPETITION_TRACKS": Object {
-      "DATA_SCIENCE": "data_science",
-      "DESIGN": "design",
-      "DEVELOP": "develop",
+      "DATA_SCIENCE": "Data Science",
+      "DESIGN": "Design",
+      "DEVELOP": "Development",
+      "QA": "Quality Assurance",
     },
     "REVIEW_OPPORTUNITY_TYPES": Object {
       "Contest Review": "Review",
diff --git a/__tests__/utils/challenge/filter.js b/__tests__/utils/challenge/filter.js
index 950a1ca9..01a4753b 100644
--- a/__tests__/utils/challenge/filter.js
+++ b/__tests__/utils/challenge/filter.js
@@ -1,5 +1,5 @@
 import {
-  setText, setTags, setSubtracks, setStartDate,
+  setText, setTags, setTypes, setStartDate,
 } from '../../../src/utils/challenge/filter';
 
 describe('challenge filter', () => {
@@ -22,12 +22,12 @@ describe('challenge filter', () => {
     expect(res).toEqual({});
   });
 
-  test('setSubtracks', () => {
-    res = setSubtracks({});
+  test('setTypes', () => {
+    res = setTypes({});
     expect(res).toEqual({});
-    res = setSubtracks({}, 'subtracks');
-    expect(res).toEqual({ subtracks: 'subtracks' });
-    res = setSubtracks({ subtracks: 'subtracks' });
+    res = setTypes({}, 'types');
+    expect(res).toEqual({ types: 'types' });
+    res = setTypes({ types: 'types' });
     expect(res).toEqual({});
   });
 
diff --git a/docs/challenge.filter.md b/docs/challenge.filter.md
index 978050ee..391ef5e5 100644
--- a/docs/challenge.filter.md
+++ b/docs/challenge.filter.md
@@ -70,7 +70,7 @@ users are participating.
         * [.setEndDate(state, date)](#module_challenge.filter.setEndDate) ⇒ <code>Object</code>
         * [.setReviewOpportunityType(state, reviewOpportunityType)](#module_challenge.filter.setReviewOpportunityType) ⇒ <code>Object</code>
         * [.setStartDate(state, date)](#module_challenge.filter.setStartDate) ⇒ <code>Object</code>
-        * [.setSubtracks(state, subtracks)](#module_challenge.filter.setSubtracks) ⇒ <code>Object</code>
+        * [.setTypes(state, types)](#module_challenge.filter.setTypes) ⇒ <code>Object</code>
         * [.setTags(state, tags)](#module_challenge.filter.setTags) ⇒ <code>Object</code>
         * [.setText(state, text)](#module_challenge.filter.setText) ⇒ <code>Object</code>
     * _inner_
@@ -198,17 +198,17 @@ Clones the state and sets the start date.
 | state | <code>Object</code> |  |
 | date | <code>String</code> | ISO date string. |
 
-<a name="module_challenge.filter.setSubtracks"></a>
+<a name="module_challenge.filter.setTypes"></a>
 
-### challenge.filter.setSubtracks(state, subtracks) ⇒ <code>Object</code>
-Clones the state and sets the subtracks.
+### challenge.filter.setTypes(state, types) ⇒ <code>Object</code>
+Clones the state and sets the challenge types.
 
 **Kind**: static method of [<code>challenge.filter</code>](#module_challenge.filter)  
 
 | Param | Type |
 | --- | --- |
 | state | <code>Object</code> | 
-| subtracks | <code>Array</code> | 
+| types | <code>Array</code> | 
 
 <a name="module_challenge.filter.setTags"></a>
 
diff --git a/src/utils/challenge/filter.js b/src/utils/challenge/filter.js
index d9e6429e..e7aebf8d 100644
--- a/src/utils/challenge/filter.js
+++ b/src/utils/challenge/filter.js
@@ -159,20 +159,12 @@ function filterByText(challenge, state) {
 
 function filterByTrack(challenge, state) {
   if (!state.tracks) return true;
-
-  /* Development challenges having Data Science tech tag, still should be
-   * included into data science track. */
-  if (state.tracks[COMPETITION_TRACKS.DATA_SCIENCE]
-    && _.includes(challenge.tags, 'Data Science')) {
-    return true;
-  }
-
-  return _.keys(state.tracks).some(track => challenge.communities.has(track));
+  return _.keys(state.tracks).some(track => challenge.track === track);
 }
 
-function filterBySubtracks(challenge, state) {
-  if (!state.subtracks) return true;
-  return state.subtracks.includes(challenge.typeId);
+function filterByTypes(challenge, state) {
+  if (!state.types) return true;
+  return state.types.includes(challenge.typeId);
 }
 
 function filterByUpcoming(challenge, state) {
@@ -222,7 +214,7 @@ export function getFilterFunction(state) {
       && filterByGroupIds(challenge, state)
       && filterByText(challenge, state)
       && filterByTags(challenge, state)
-      && filterBySubtracks(challenge, state)
+      && filterByTypes(challenge, state)
       && filterByUsers(challenge, state)
       && filterByEndDate(challenge, state)
       && filterByStartDate(challenge, state)
@@ -245,9 +237,9 @@ export function getFilterFunction(state) {
  * @param {Object} state
  * @return {Function}
  */
-export function getReviewOpportunitiesFilterFunction(state, validSubtracks) {
+export function getReviewOpportunitiesFilterFunction(state, validTypes) {
   return (opp) => {
-    const newSubTrack = _.find(validSubtracks, { abbreviation: opp.challenge.subTrack }) || {};
+    const newType = _.find(validTypes, { name: opp.challenge.type }) || {};
 
     // Review Opportunity objects have a challenge field which
     // is largely compatible with many of the existing filter functions
@@ -257,12 +249,11 @@ export function getReviewOpportunitiesFilterFunction(state, validSubtracks) {
       // This allows filterByText to search for Review Types and Challenge Titles
       name: `${opp.challenge.title} ${REVIEW_OPPORTUNITY_TYPES[opp.type]}`,
       registrationStartDate: opp.startDate, // startDate of Review, not Challenge
-      subTrack: opp.challenge.subTrack || '', // Sometimes back-end doesn't return this field
       submissionEndDate: opp.startDate, // Currently uses startDate for both date comparisons
       communities: new Set([ // Used to filter by Track, and communities at a future date
         opp.challenge.track.toLowerCase(),
       ]),
-      typeId: newSubTrack.id,
+      typeId: newType.id,
       tags: opp.challenge.technologies || [],
       platforms: opp.challenge.platforms || [],
     };
@@ -271,7 +262,7 @@ export function getReviewOpportunitiesFilterFunction(state, validSubtracks) {
       filterByTrack(challenge, state)
       && filterByText(challenge, state)
       && filterByTags(challenge, state)
-      && filterBySubtracks(challenge, state)
+      && filterByTypes(challenge, state)
       && filterByEndDate(challenge, state)
       && filterByStartDate(challenge, state)
       && filterByReviewOpportunityType(opp, state)
@@ -455,16 +446,16 @@ export function setStartDate(state, date) {
 }
 
 /**
- * Clones the state and sets the subtracks.
+ * Clones the state and sets the challenge types.
  * @param {Object} state
- * @param {Array} subtracks
+ * @param {Array} types
  * @return {Object}
  */
-export function setSubtracks(state, subtracks) {
-  if (subtracks && subtracks.length) return { ...state, subtracks };
-  if (!state.subtracks) return state;
+export function setTypes(state, types) {
+  if (types && types.length) return { ...state, types };
+  if (!state.types) return state;
   const res = _.clone(state);
-  delete res.subtracks;
+  delete res.types;
   return res;
 }
 
diff --git a/src/utils/tc.js b/src/utils/tc.js
index aed187ca..5388d4bb 100644
--- a/src/utils/tc.js
+++ b/src/utils/tc.js
@@ -11,9 +11,10 @@
  * uses upper-case literals to encode the tracks. At some point, we should
  * update it in this code as well! */
 export const COMPETITION_TRACKS = {
-  DATA_SCIENCE: 'data_science',
-  DESIGN: 'design',
-  DEVELOP: 'develop',
+  DATA_SCIENCE: 'Data Science',
+  DESIGN: 'Design',
+  DEVELOP: 'Development',
+  QA: 'Quality Assurance',
 };
 
 /**