You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by mi...@apache.org on 2019/01/25 17:49:50 UTC

[trafficcontrol] branch master updated: Cachegroup ui update with fallbacks (#3203)

This is an automated email from the ASF dual-hosted git repository.

mitchell852 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new f29e557  Cachegroup ui update with fallbacks (#3203)
f29e557 is described below

commit f29e557f1ad7d69143b6d8302d22d7799ac27760
Author: mattjackson220 <33...@users.noreply.github.com>
AuthorDate: Fri Jan 25 10:49:45 2019 -0700

    Cachegroup ui update with fallbacks (#3203)
    
    * updated Cache Group page in Traffic Portal for Cache Group Failovers, updated cache group API to allow control of cachegroup.fallbackToClosest through POST,PUT, and GET, updated documentation.
    
    * updated Cache Group page in Traffic Portal for Cache Group Failovers, updated cache group API to allow control of cachegroup.fallbackToClosest through POST,PUT, and GET, updated documentation.
    
    * fix needed for new cachegroup page
    
    * updated to use EDGE_LOC instead of id
    
    * updated more to use EDGE_LOC instead of id
    
    * updated so types and cachegroups pull before page load
    
    * updated to incorporate review comments
    
    * updated after review comments and linked all documentation occurrences of "Cache Group" to glossary
    
    * updated after review comments
    
    * removed markups from figure alt sections
    
    * updated so fallbacks are removed if not EDGE_LOC in TP and API throws errors if fallbacks present on non-EDGE_LOC cache group.  updated CHANGELOG
---
 CHANGELOG.md                                       |   4 +
 .../admin/quick_howto/cachegroup_fallback.rst      |  65 +++++++++
 .../admin/quick_howto/cachegroup_fallback/00.png   | Bin 0 -> 92743 bytes
 .../admin/quick_howto/cachegroup_fallback/01.png   | Bin 0 -> 113857 bytes
 .../admin/quick_howto/cachegroup_fallback/02.png   | Bin 0 -> 21157 bytes
 .../admin/quick_howto/cachegroup_fallback/03.png   | Bin 0 -> 19460 bytes
 .../admin/quick_howto/cachegroup_fallback/04.png   | Bin 0 -> 31722 bytes
 .../admin/quick_howto/cachegroup_fallback/05.png   | Bin 0 -> 29375 bytes
 docs/source/admin/quick_howto/index.rst            |   1 +
 docs/source/admin/quick_howto/multi_site.rst       |   4 +-
 docs/source/admin/traffic_ops/configuration.rst    |  26 ++--
 docs/source/admin/traffic_ops/using.rst            |  98 ++++++-------
 .../admin/traffic_portal/usingtrafficportal.rst    |  53 +++----
 docs/source/admin/traffic_stats.rst                |   2 +-
 docs/source/api/cachegroup_fallbacks.rst           |  80 +++++------
 docs/source/api/cachegroupparameters.rst           |  12 +-
 .../api/cachegroupparameters_id_parameterID.rst    |  16 +--
 docs/source/api/cachegroups.rst                    |  78 +++++-----
 docs/source/api/cachegroups_id.rst                 |  96 ++++++-------
 .../source/api/cachegroups_id_deliveryservices.rst |  20 +--
 docs/source/api/cachegroups_id_parameters.rst      |  12 +-
 docs/source/api/cachegroups_id_queue_update.rst    |  18 +--
 .../api/cachegroups_id_unassigned_parameters.rst   |  12 +-
 ...cachegroups_parameterID_parameter_available.rst |   6 +-
 docs/source/api/cachegroups_trimmed.rst            |   4 +-
 docs/source/api/caches_stats.rst                   |   2 +-
 docs/source/api/cdns_name_health.rst               |  14 +-
 docs/source/api/deliveryservices_id_health.rst     |  22 +--
 docs/source/api/origins.rst                        |  18 +--
 docs/source/faq/administration.rst                 |  12 +-
 .../traffic_ops_golang/cachegroup/cachegroups.go   |  54 ++++++-
 traffic_portal/app/src/app.js                      |   1 +
 .../directives/dragAndDrop/dragdropDirective.js    |  21 +++
 .../directives/dragAndDrop/droppableDirective.js   | 129 +++++++++++++++++
 .../app/src/common/directives/dragAndDrop/index.js |   5 +
 .../form/cacheGroup/FormCacheGroupController.js    | 159 ++++++++++++++++++---
 .../modules/form/cacheGroup/_form.cacheGroup.scss  |  48 +++++++
 .../edit/FormEditCacheGroupController.js           |   6 +-
 .../form/cacheGroup/form.cacheGroup.tpl.html       |  25 +++-
 .../cacheGroup/new/FormNewCacheGroupController.js  |   6 +-
 .../src/modules/private/cacheGroups/edit/index.js  |   6 +
 .../src/modules/private/cacheGroups/new/index.js   |   6 +
 traffic_portal/app/src/styles/main.scss            |   1 +
 43 files changed, 809 insertions(+), 333 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 38d4915..bb6bad5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,6 +22,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
 - To traffic_ops_ort.pl added the ability to handle ##OVERRIDE## delivery service ANY_MAP raw remap text to replace and comment out a base delivery service remap rules. THIS IS A TEMPORARY HACK until versioned delivery services are implemented.
 
 ### Changed
+- Traffic Ops Golang Endpoints
+  - Updated /api/1.1/cachegroups: Cache Group Fallbacks are included
+  - Updated /api/1.1/cachegroups: fixed so fallbackToClosest can be set through API
+    - Warning:  a PUT of an old Cache Group JSON without the fallbackToClosest field will result in a `null` value for that field
 - Issue 2821: Fixed "Traffic Router may choose wrong certificate when SNI names overlap"
 - traffic_ops/app/bin/checks/ToDnssecRefresh.pl now requires "user" and "pass" parameters of an operations-level user! Update your scripts accordingly! This was necessary to move to an API endpoint with proper authentication, which may be safely exposed.
 
diff --git a/docs/source/admin/quick_howto/cachegroup_fallback.rst b/docs/source/admin/quick_howto/cachegroup_fallback.rst
new file mode 100644
index 0000000..4dd9bc0
--- /dev/null
+++ b/docs/source/admin/quick_howto/cachegroup_fallback.rst
@@ -0,0 +1,65 @@
+..
+..
+.. _cachegroup-fallback-qht:
+
+*******************************
+Configure Cache Group Fallbacks
+*******************************
+
+.. seealso:: :ref:`tp-configure-cache-groups`
+
+#. Go to 'Topology', click on :term:`Cache Group`\ s, and click on your desired :term:`Cache Group` or click the :guilabel:`+` button to create a new :term:`Cache Group`.
+
+	.. figure:: cachegroup_fallback/00.png
+		:width: 60%
+		:align: center
+		:alt: Screenshot of the Traffic Portal UI depicting the Cache Groups page
+
+		Cache Groups Page
+
+#. Verify that the :term:`Cache Group` is of type EDGE_LOC. :term:`Cache Group` Failovers only apply to EDGE_LOC :term:`Cache Group`\ s.
+
+	.. figure:: cachegroup_fallback/01.png
+		:width: 60%
+		:align: center
+		:alt: Screenshot of the Traffic Portal UI depicting the Cache Group details page
+
+		Cache Group Details Page
+
+#. Once EDGE_LOC is selected, the Failover Cache Groups section will appear at the bottom of the page. If you are editing an existing :term:`Cache Group`, then the current Failovers will be listed. If creating a new :term:`Cache Group`, the Fallback to Geo Failover box will default to be checked.
+
+	.. figure:: cachegroup_fallback/02.png
+		:width: 60%
+		:align: center
+		:alt: Screenshot of the Traffic Portal UI depicting the Failover Cache Groups section of the Cache Group details page
+
+		Failover Cache Groups Section of Cache Group Details Page
+
+#. To add a new Failover to the list, select the "Add Failover :term:`Cache Group`" drop down and choose which :term:`Cache Group` you would like. While in the drop down, you can also type in order to search.
+
+	.. figure:: cachegroup_fallback/03.png
+		:width: 60%
+		:align: center
+		:alt: Screenshot of the Traffic Portal UI depicting the Failover Cache Groups section of the Cache Group details page
+
+		Add New Failover Cache Group Section of Cache Group Details Page
+
+#. The order of the Failovers is important. If you want to reorder the Failovers, you can drag and drop them into a new position. A red line will appear to show where the Failover will be dropped.
+
+	.. figure:: cachegroup_fallback/04.png
+		:width: 60%
+		:align: center
+		:alt: Screenshot of the Traffic Portal UI depicting the Failover Cache Groups Drag and Drop of the Cache Group details page
+
+		Failover Cache Groups Section Drag and Drop Functionality
+
+#. To remove a Failover, click the trash can symbol on the right hand side of the list.
+
+	.. figure:: cachegroup_fallback/05.png
+		:width: 60%
+		:align: center
+		:alt: Screenshot of the Traffic Portal UI depicting the Failover Cache Groups Delete of the Cache Group details page
+
+		Failover Cache Groups Delete
+
+#. Click the :guilabel:`Update` button (if editing existing :term:`Cache Group`) or the :guilabel:`Create` button (if creating new :term:`Cache Group`) in order to save the Failovers to the :term:`Cache Group`.
\ No newline at end of file
diff --git a/docs/source/admin/quick_howto/cachegroup_fallback/00.png b/docs/source/admin/quick_howto/cachegroup_fallback/00.png
new file mode 100644
index 0000000..6999475
Binary files /dev/null and b/docs/source/admin/quick_howto/cachegroup_fallback/00.png differ
diff --git a/docs/source/admin/quick_howto/cachegroup_fallback/01.png b/docs/source/admin/quick_howto/cachegroup_fallback/01.png
new file mode 100644
index 0000000..fc91411
Binary files /dev/null and b/docs/source/admin/quick_howto/cachegroup_fallback/01.png differ
diff --git a/docs/source/admin/quick_howto/cachegroup_fallback/02.png b/docs/source/admin/quick_howto/cachegroup_fallback/02.png
new file mode 100644
index 0000000..bf734ee
Binary files /dev/null and b/docs/source/admin/quick_howto/cachegroup_fallback/02.png differ
diff --git a/docs/source/admin/quick_howto/cachegroup_fallback/03.png b/docs/source/admin/quick_howto/cachegroup_fallback/03.png
new file mode 100644
index 0000000..b8ba5d8
Binary files /dev/null and b/docs/source/admin/quick_howto/cachegroup_fallback/03.png differ
diff --git a/docs/source/admin/quick_howto/cachegroup_fallback/04.png b/docs/source/admin/quick_howto/cachegroup_fallback/04.png
new file mode 100644
index 0000000..d26e52c
Binary files /dev/null and b/docs/source/admin/quick_howto/cachegroup_fallback/04.png differ
diff --git a/docs/source/admin/quick_howto/cachegroup_fallback/05.png b/docs/source/admin/quick_howto/cachegroup_fallback/05.png
new file mode 100644
index 0000000..d0e16ef
Binary files /dev/null and b/docs/source/admin/quick_howto/cachegroup_fallback/05.png differ
diff --git a/docs/source/admin/quick_howto/index.rst b/docs/source/admin/quick_howto/index.rst
index 65d3151..a12dea9 100644
--- a/docs/source/admin/quick_howto/index.rst
+++ b/docs/source/admin/quick_howto/index.rst
@@ -28,3 +28,4 @@ Traffic Control is a complicated system, and documenting it is not trivial. Some
 	ds_requests
 	steering
 	ciab
+	cachegroup_fallback
\ No newline at end of file
diff --git a/docs/source/admin/quick_howto/multi_site.rst b/docs/source/admin/quick_howto/multi_site.rst
index dee1401..493d32f 100644
--- a/docs/source/admin/quick_howto/multi_site.rst
+++ b/docs/source/admin/quick_howto/multi_site.rst
@@ -21,7 +21,7 @@ Configure Multi-Site Origin
 
 The following steps will take you through the procedure of setting up a Multi-Site Origin (MSO).
 
-#. Create Cache Groups for the origin locations, and assign the appropriate parent-child relationship between the mid and origin Cache Groups. Each mid Cache Group can be assigned a primary and secondary origin parent Cache Group. When the mid cache parent configuration is generated, origins in the primary Cache Groups will be listed first, followed by origins in the secondary Cache Group. Origin servers assigned to the Delivery Service that are assigned to neither the primary nor second [...]
+#. Create :term:`Cache Group`\ s for the origin locations, and assign the appropriate parent-child relationship between the mid and origin :term:`Cache Group`\ s. Each mid :term:`Cache Group` can be assigned a primary and secondary origin parent :term:`Cache Group`. When the mid cache parent configuration is generated, origins in the primary :term:`Cache Group`\ s will be listed first, followed by origins in the secondary :term:`Cache Group`. Origin servers assigned to the Delivery Servi [...]
 
 	.. figure:: multi_site/00.png
 		:scale: 100%
@@ -55,7 +55,7 @@ The following steps will take you through the procedure of setting up a Multi-Si
 
 		- If there are multiple CDNs created on the same Traffic Ops, delivery services across different CDNs may have the same OSBU configured.
 		- If several delivery services in the same CDN have the same MSO algorithm configured, they may share the same OSBU.
-		- If delivery services are assigned with different MID cache groups respectively, they can share the same OSBU.
+		- If delivery services are assigned with different MID :term:`Cache Group`\ s respectively, they can share the same OSBU.
 		- This OSBU must be valid - ATS will perform a DNS lookup on this FQDN even if IPs, not DNS, are used in the parent.config.
 		- The OSBU entered as the "Origin Server Base URL" will be sent to the origins as a host header. All origins must be configured to respond to this host.
 
diff --git a/docs/source/admin/traffic_ops/configuration.rst b/docs/source/admin/traffic_ops/configuration.rst
index da6e14b..7ca4a213 100644
--- a/docs/source/admin/traffic_ops/configuration.rst
+++ b/docs/source/admin/traffic_ops/configuration.rst
@@ -240,18 +240,18 @@ Below is a list of Traffic Server plug-ins that need to be configured in the par
 
 Below is a list of cache parameters for special configuration, which are unlikely to need changes, but may be useful in particular circumstances:
 
-+--------------------------+-------------------+-------------------------------------------------------------------------------------------------------------------------+
-|           Name           |    Config File    |                                                       Description                                                       |
-+==========================+===================+=========================================================================================================================+
-| not_a_parent             | parent.config     | This is a boolean flag and is considered 'true' if it exists and has any value except 'false'.                          |
-|                          |                   | This prevents servers with this parameter in their profile from being inserted into the ``parent.config`` generated for |
-|                          |                   | servers with this server's Cache Group as a parent of their CacheGroup. This is primarily useful for when edge caches   |
-|                          |                   | are configured to have a Cache Group of other edge caches as parents (a highly unusual configuration), and it is        |
-|                          |                   | necessary to exclude some, but not all, edges in the parent Cache Group from the ``parent.config`` (for example,        |
-|                          |                   | because they lack necessary capabilities), but still have all edges in the same Cache Group in order to take traffic    |
-|                          |                   | from ordinary Delivery Services at that Cache Group's geographic location. Once again, this is a highly unusual         |
-|                          |                   | scenario, and under ordinary circumstances this parameter should not exist.                                             |
-+--------------------------+-------------------+-------------------------------------------------------------------------------------------------------------------------+
++--------------------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------+
+|           Name           |    Config File    |                                                       Description                                                               |
++==========================+===================+=================================================================================================================================+
+| not_a_parent             | parent.config     | This is a boolean flag and is considered 'true' if it exists and has any value except 'false'.                                  |
+|                          |                   | This prevents servers with this parameter in their profile from being inserted into the ``parent.config`` generated for servers |
+|                          |                   | with this server's :term:`Cache Group` as a parent of their :term:`Cache Group`. This is primarily useful for when edge caches  |
+|                          |                   | are configured to have a :term:`Cache Group` of other edge caches as parents (a highly unusual configuration), and it is        |
+|                          |                   | necessary to exclude some, but not all, edges in the parent :term:`Cache Group` from the ``parent.config`` (for example,        |
+|                          |                   | because they lack necessary capabilities), but still have all edges in the same :term:`Cache Group` in order to take traffic    |
+|                          |                   | from ordinary Delivery Services at that :term:`Cache Group`\ 's geographic location. Once again, this is a highly unusual       |
+|                          |                   | scenario, and under ordinary circumstances this parameter should not exist.                                                     |
++--------------------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------+
 
 
 Regions, Locations and Cache Groups
@@ -266,7 +266,7 @@ All servers have to have a 'location', which is their physical location. Each lo
 
 To create these structures in Traffic Portal, first in enter your divisions under `Topology->Divisions`, then enter the regions in `Topology->Regions`, referencing the divisions entered and, finally, enter the physical locations in `Topology->Phys Locations`, referencing the regions entered.
 
-All servers also have to be part of a Cache Group. A Cache Group is a logical grouping of caches, that don't have to be in the same physical location (in fact, usually a cache group is spread across minimally 2 physical Locations for redundancy purposes), but share geographical coordinates for content routing purposes.
+All servers also have to be part of a :term:`Cache Group`. A :term:`Cache Group` is a logical grouping of caches, that don't have to be in the same physical location (in fact, usually a :term:`Cache Group` is spread across minimally 2 physical Locations for redundancy purposes), but share geographical coordinates for content routing purposes.
 
 
 
diff --git a/docs/source/admin/traffic_ops/using.rst b/docs/source/admin/traffic_ops/using.rst
index 44d4585..4929aa8 100644
--- a/docs/source/admin/traffic_ops/using.rst
+++ b/docs/source/admin/traffic_ops/using.rst
@@ -89,23 +89,23 @@ Parameters
 ----------
 Parameters and Profiles can be edited here. Hover over the tab to get the following options:
 
-+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|        Option       |                                                                             Description                                                                             |
-+=====================+=====================================================================================================================================================================+
-| Global Profile      | The table of global parameters. See :ref:`param-prof`. This is where you Create/Read/Update/Delete parameters in the Global profile                                 |
-+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| All Cache Groups    | The table of all parameters *that are assigned to a cachegroup* - this may be slow to pull up, as there can be thousands of parameters.                             |
-+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| All Profiles        | The table of all parameters *that are assigned to a profile* - this may be slow to pull up, as there can be thousands of parameters.                                |
-+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Select Profile      | Select the parameter list by profile first, then get a table of just the parameters for that profile.                                                               |
-+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Export Profile      | Profiles can be exported from one Traffic Ops instance to another using 'Select Profile' and under the "Profile Details" dialog for the desired profile             |
-+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Import Profile      | Profiles can be imported from one Traffic Ops instance to another using the button "Import Profile" after using the "Export Profile" feature                        |
-+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Orphaned Parameters | A table of parameters that are not associated to any profile of cache group. These parameters either should be deleted or associated with a profile of cache group. |
-+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
++-----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|        Option               |                                                                             Description                                                                                             |
++=============================+=====================================================================================================================================================================================+
+| Global Profile              | The table of global parameters. See :ref:`param-prof`. This is where you Create/Read/Update/Delete parameters in the Global profile                                                 |
++-----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| All :term:`Cache Group`\ s  | The table of all parameters *that are assigned to a cachegroup* - this may be slow to pull up, as there can be thousands of parameters.                                             |
++-----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| All Profiles                | The table of all parameters *that are assigned to a profile* - this may be slow to pull up, as there can be thousands of parameters.                                                |
++-----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Select Profile              | Select the parameter list by profile first, then get a table of just the parameters for that profile.                                                                               |
++-----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Export Profile              | Profiles can be exported from one Traffic Ops instance to another using 'Select Profile' and under the "Profile Details" dialog for the desired profile                             |
++-----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Import Profile              | Profiles can be imported from one Traffic Ops instance to another using the button "Import Profile" after using the "Export Profile" feature                                        |
++-----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Orphaned Parameters         | A table of parameters that are not associated to any profile of :term:`Cache Group`. These parameters either should be deleted or associated with a profile of :term:`Cache Group`. |
++-----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
 Tools
 -----
@@ -132,29 +132,29 @@ Misc
 ----
 Miscellaneous editing options. Hover over this tab to get the following options:
 
-+--------------------+-------------------------------------------------------------------------------------------+
-|       Option       |                                        Description                                        |
-+====================+===========================================================================================+
-| CDNs               | Create/Read/Update/Delete CDNs                                                            |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Cache Groups       | Create/Read/Update/Delete cache groups                                                    |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Users              | Create/Read/Update/Delete users                                                           |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Profiles           | Create/Read/Update/Delete profiles. See :ref:`working-with-profiles`                      |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Networks(ASNs)     | Create/Read/Update/Delete Autonomous System Numbers See :ref:`asn-czf`                    |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Hardware           | Get detailed hardware information (note: this should be moved to a Traffic Ops Extension) |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Data Types         | Create/Read/Update/Delete data types                                                      |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Divisions          | Create/Read/Update/Delete divisions                                                       |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Regions            | Create/Read/Update/Delete regions                                                         |
-+--------------------+-------------------------------------------------------------------------------------------+
-| Physical Locations | Create/Read/Update/Delete locations                                                       |
-+--------------------+-------------------------------------------------------------------------------------------+
++------------------------------+-------------------------------------------------------------------------------------------+
+|       Option                 |                                        Description                                        |
++==============================+===========================================================================================+
+| CDNs                         | Create/Read/Update/Delete CDNs                                                            |
++------------------------------+-------------------------------------------------------------------------------------------+
+| :term:`Cache Group`\ s       | Create/Read/Update/Delete :term:`Cache Group`\ s                                          |
++------------------------------+-------------------------------------------------------------------------------------------+
+| Users                        | Create/Read/Update/Delete users                                                           |
++------------------------------+-------------------------------------------------------------------------------------------+
+| Profiles                     | Create/Read/Update/Delete profiles. See :ref:`working-with-profiles`                      |
++------------------------------+-------------------------------------------------------------------------------------------+
+| Networks(ASNs)               | Create/Read/Update/Delete Autonomous System Numbers See :ref:`asn-czf`                    |
++------------------------------+-------------------------------------------------------------------------------------------+
+| Hardware                     | Get detailed hardware information (note: this should be moved to a Traffic Ops Extension) |
++------------------------------+-------------------------------------------------------------------------------------------+
+| Data Types                   | Create/Read/Update/Delete data types                                                      |
++------------------------------+-------------------------------------------------------------------------------------------+
+| Divisions                    | Create/Read/Update/Delete divisions                                                       |
++------------------------------+-------------------------------------------------------------------------------------------+
+| Regions                      | Create/Read/Update/Delete regions                                                         |
++------------------------------+-------------------------------------------------------------------------------------------+
+| Physical Locations           | Create/Read/Update/Delete locations                                                       |
++------------------------------+-------------------------------------------------------------------------------------------+
 
 .. index::
 	Change Log
@@ -194,7 +194,7 @@ The Health table is the default landing screen for Traffic Ops, it displays the
 
 
 :Profile:          the Profile of this server or ALL, meaning this row shows data for multiple servers, and the row shows the sum of all values.
-:Edge Cache Group: the edge cache group short name or ALL, meaning this row shows data for multiple servers, and the row shows the sum of all values.
+:Edge Cache Group: the edge :term:`Cache Group` short name or ALL, meaning this row shows data for multiple servers, and the row shows the sum of all values.
 :Host Name:        the host name of the server or ALL, meaning this row shows data for multiple servers, and the row shows the sum of all values.
 :Healthy:          indicates if this cache is healthy according to the Health Protocol. A row with ALL in any of the columns will always show a |checkmark|, this column is valid only for individual EDGE caches.
 :Admin:            shows the administrative status of the server.
@@ -394,7 +394,7 @@ The fields in the Delivery Service view are:
 |                                            | Ideally the number will reflect the amount of traffic. 1 = trial account with very little traffic, 2 = small production service. Add 1 more server for every 20 Gbps   |
 |                                            | of traffic you expect at peak. So 20 Gbps = 3, 40 Gbps = 4, 60 Gbps = 5                                                                                                |
 +--------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Initial Dispersion                         | Determines number of machines content will be placed on within a cache group. Setting too high will result in poor caching performance.                                |
+| Initial Dispersion                         | Determines number of machines content will be placed on within a :term:`Cache Group`. Setting too high will result in poor caching performance.                        |
 +--------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | Origin Server Base URL                     | The Origin Server’s base URL which includes the protocol (http or https). Example: ``http://movies.origin.com``                                                        |
 |                                            | Must be a domain only, no directories or IP addresses                                                                                                                  |
@@ -486,10 +486,10 @@ One of the most important settings when creating the delivery service is the sel
 |       Name      |                                                                                           Description                                                                                             |
 +=================+===================================================================================================================================================================================================+
 | HTTP            | HTTP Content Routing  - The Traffic Router DNS auth server returns its own IP address on DNS queries, and the client gets redirected to a specific cache                                          |
-|                 | in the nearest cache group using HTTP 302.  Use this for long sessions like HLS/HDS/Smooth live streaming, where a longer setup time is not a problem.                                            |
+|                 | in the nearest :term:`Cache Group` using HTTP 302.  Use this for long sessions like HLS/HDS/Smooth live streaming, where a longer setup time is not a problem.                                    |
 +-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | DNS             | DNS Content Routing - The Traffic Router DNS auth server returns an edge cache IP address to the client right away. The client will find the cache quickly                                        |
-|                 | but the Traffic Router can not route to a cache that already has this content in the cache group. Use this for smaller objects like web page images / objects.                                    |
+|                 | but the Traffic Router can not route to a cache that already has this content in the :term:`Cache Group`. Use this for smaller objects like web page images / objects.                            |
 +-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | HTTP_NO_CACHE   | HTTP Content Routing, but the caches will not actually cache the content, they act as just proxies. The MID tier is bypassed.                                                                     |
 +-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -924,7 +924,7 @@ Static DNS entries allow you to create other names *under* the delivery service
 
 Server Assignments
 ------------------
-Click the **Server Assignments** button at the bottom of the screen to assign servers to this delivery service.  Servers can be selected by drilling down in a tree, starting at the profile, then the cache group, and then the individual servers. Traffic Router will only route traffic for this delivery service to servers that are assigned to it.
+Click the **Server Assignments** button at the bottom of the screen to assign servers to this delivery service.  Servers can be selected by drilling down in a tree, starting at the profile, then the :term:`Cache Group`, and then the individual servers. Traffic Router will only route traffic for this delivery service to servers that are assigned to it.
 
 
 .. _asn-czf:
@@ -972,7 +972,7 @@ The CZF is an input to the Traffic Control CDN, and as such does not get generat
 
 The script that generates the CZF file is not part of Traffic Control, since it is different for each situation.
 
-.. note:: The ``"coordinates"`` section is optional and may be used by Traffic Router for localization in the case of a CZF "hit" where the zone name does not map to a Cache Group name in Traffic Ops (i.e. Traffic Router will route to the closest Cache Group(s) geographically).
+.. note:: The ``"coordinates"`` section is optional and may be used by Traffic Router for localization in the case of a CZF "hit" where the zone name does not map to a :term:`Cache Group` name in Traffic Ops (i.e. Traffic Router will route to the closest :term:`Cache Group`\ (s) geographically).
 
 .. _deep-czf:
 
@@ -1023,7 +1023,7 @@ The Deep Coverage Zone File (DCZF) format is similar to the CZF format but adds
 		}
 	}
 
-Each entry in the ``caches`` list is the hostname of an edge cache registered in Traffic Ops which will be used for "deep" caching in that Deep Coverage Zone. Unlike a regular CZF, coverage zones in the DCZF do not map to a Cache Group in Traffic Ops, so currently the deep coverage zone name only needs to be unique.
+Each entry in the ``caches`` list is the hostname of an edge cache registered in Traffic Ops which will be used for "deep" caching in that Deep Coverage Zone. Unlike a regular CZF, coverage zones in the DCZF do not map to a :term:`Cache Group` in Traffic Ops, so currently the deep coverage zone name only needs to be unique.
 
 If the Traffic Router gets a DCZF "hit" for a requested Delivery Service that has Deep Caching enabled, the client will be routed to an available "deep" cache from that zone's ``caches`` list.
 
@@ -1170,11 +1170,11 @@ Every 15 minutes the caches should run a *syncds* to get all changes needed from
 - regex_revalidate.config
 - ip_allow.config
 
-A cache will only get updated when the update flag is set for it. To set the update flag, use the *Queue Updates* menu - here you can schedule updates for a whole CDN or a cache group:
+A cache will only get updated when the update flag is set for it. To set the update flag, use the *Queue Updates* menu - here you can schedule updates for a whole CDN or a :term:`Cache Group`:
 
 #. Click **Tools > Queue Updates**.
 #. Select the CDN to queue updates for or select All.
-#. Select the cache group to queue updates for or select All.
+#. Select the :term:`Cache Group` to queue updates for or select All.
 #. Click the **Queue Updates** button.
 #. When the Queue Updates for this Server? (all) window opens, click **OK**.
 
diff --git a/docs/source/admin/traffic_portal/usingtrafficportal.rst b/docs/source/admin/traffic_portal/usingtrafficportal.rst
index 25c704b..ec00d5d 100644
--- a/docs/source/admin/traffic_portal/usingtrafficportal.rst
+++ b/docs/source/admin/traffic_portal/usingtrafficportal.rst
@@ -118,14 +118,14 @@ The cache checks page is intended to give an overview of the caches managed by T
 
 Cache Stats
 -----------
-A table showing the results of the periodic check extension scripts that are run. These can be grouped by Cache Group and/or Profile.
+A table showing the results of the periodic check extension scripts that are run. These can be grouped by :term:`Cache Group` and/or Profile.
 
 :Profile:     Name of the profile applied to the Edge-tier or Mid-tier cache server
-:Host:        'ALL' for entries grouped by cache group, or the hostname of a particular cache server
-:Cache Group: Name of the Cache Group to which this server belongs, or the name of the Cache Group that is grouped for entries grouped by Cache Group
+:Host:        'ALL' for entries grouped by :term:`Cache Group`, or the hostname of a particular cache server
+:Cache Group: Name of the :term:`Cache Group` to which this server belongs, or the name of the :term:`Cache Group` that is grouped for entries grouped by :term:`Cache Group`
 :Healthy:     True/False as determined by Traffic Monitor (See :ref:`health-proto`)
-:Status:      Status of the cache or Cache Group
-:Connections: Number of connections to this cache server or Cache Group
+:Status:      Status of the cache or :term:`Cache Group`
+:Connections: Number of connections to this cache server or :term:`Cache Group`
 :MbpsOut:     Data flow outward (toward client) in Megabits per second
 
 Services
@@ -261,7 +261,7 @@ A table of all servers (of all kinds) across all Delivery Services visible to th
 :Type: The type of server e.g. EDGE for an Edge-tier cache
 :Profile: The name of the server's profile
 :CDN: The name of the CDN to which this server is assigned (if any)
-:Cache Group: The name of the Cache Group to which this server belongs
+:Cache Group: The name of the :term:`Cache Group` to which this server belongs
 :ILO: If not empty, this is the IPv4 address of the server's Integrated Lights-Out (ILO) interface
 
 	.. seealso:: `Hewlett Packard ILO Wikipedia Page <https://en.wikipedia.org/wiki/HP_Integrated_Lights-Out>`_
@@ -327,7 +327,7 @@ Parameter management includes the ability to (where applicable):
 
 Types
 -----
-'Types' groups Delivery Services, servers and Cache Groups for various purposes. Each entry in the table shown on this page has the following fields:
+'Types' groups Delivery Services, servers and :term:`Cache Group`\ s for various purposes. Each entry in the table shown on this page has the following fields:
 
 :Name:         The name of the Type
 :Use In Table: States the use of this Type, e.g. ``server`` indicates this is a Type assigned to servers
@@ -340,7 +340,7 @@ Type management includes the ability to (where applicable):
 - delete an existing type
 - view delivery services assigned to a type
 - view servers assigned to a type
-- view cache groups assigned to a type
+- view :term:`Cache Group`\ s assigned to a type
 
 
 Statuses
@@ -367,25 +367,28 @@ Topology
 
 	'Topology' Menu
 
+.. _tp-configure-cache-groups:
+
 Cache Groups
 ------------
-'Cache Groups' are sets of cache servers, typically grouped by geographic proximity. This menu allows user to add or remove caches from Cache Groups as well as creating, updating and deleting Cache Groups themselves. Each entry in the table of Cache Groups on this page has the following fields:
+':term:`Cache Group`\ s' are sets of cache servers, typically grouped by geographic proximity. This menu allows user to add or remove caches from :term:`Cache Group`\ s as well as creating, updating and deleting :term:`Cache Group`\ s themselves. Each entry in the table of :term:`Cache Group`\ s on this page has the following fields:
 
-:Name:       The full name of this Cache Group
-:Short Name: A shorter, more human-friendly name for this Cache Group
-:Type:       The Type of this Cache Group (see :ref:`tp-configure-types`)
-:Latitude:   A geographic latitude assigned to this Cache Group
-:Longitude:  A geographic longitude assigned to this Cache Group
+:Name:                  The full name of this :term:`Cache Group`
+:Short Name:            A shorter, more human-friendly name for this :term:`Cache Group`
+:Type:                  The Type of this Cache Group (see :ref:`tp-configure-types`)
+:Latitude:              A geographic latitude assigned to this :term:`Cache Group`
+:Longitude:             A geographic longitude assigned to this :term:`Cache Group`
+:Failover Cache Groups: A list of :term:`Cache Group`\ s to fallback to in case of failure. Fallback to Geo Failover allows fallback geographically in case of failure.
 
-Cache group management includes the ability to (where applicable):
+:term:`Cache Group` management includes the ability to (where applicable):
 
-- create a new cache group
-- update an existing cache group
-- delete an existing cache group
-- queue/clear updates for all servers in a cache group
-- view cache group ASNs
-- view and assign cache group parameters
-- view cache group servers
+- create a new :term:`Cache Group`
+- update an existing :term:`Cache Group`
+- delete an existing :term:`Cache Group`
+- queue/clear updates for all servers in a :term:`Cache Group`
+- view :term:`Cache Group` ASNs
+- view and assign :term:`Cache Group` parameters
+- view :term:`Cache Group` servers
 
 
 Coordinates
@@ -405,7 +408,7 @@ Coordination management includes the ability to (where applicable):
 
 Phys Locations
 --------------
-A table of physical locations which may be assigned to servers and Cache Groups, typically for the purpose of optimizing client routing. Here they can be created, updated deleted and assigned. Each entry has the following columns:
+A table of physical locations which may be assigned to servers and :term:`Cache Group`\ s, typically for the purpose of optimizing client routing. Here they can be created, updated deleted and assigned. Each entry has the following columns:
 
 :Name:       The full name of the physical location
 :Short Name: A shorter, more human-friendly name for this physical location
@@ -433,7 +436,7 @@ Division management includes the ability to (where applicable):
 
 Regions
 -------
-Regions are groups of Cache Groups, and are themselves grouped into Divisions. Each entry in the table on this page has the following fields:
+Regions are groups of :term:`Cache Group`\ s, and are themselves grouped into Divisions. Each entry in the table on this page has the following fields:
 
 :Name:     The name of this Region
 :Division: The Division to which this Region is assigned
@@ -451,7 +454,7 @@ ASNs
 Manage Autonomous System Numbers (ASNs). Each entry in the table on this page has the following fields:
 
 :ASN:         The actual ASN
-:Cache Group: The Cache Group to which this ASN is assigned
+:Cache Group: The :term:`Cache Group` to which this ASN is assigned
 
 ASN management includes the ability to (where applicable):
 
diff --git a/docs/source/admin/traffic_stats.rst b/docs/source/admin/traffic_stats.rst
index 1e31084..343dda6 100644
--- a/docs/source/admin/traffic_stats.rst
+++ b/docs/source/admin/traffic_stats.rst
@@ -109,7 +109,7 @@ To create a graph in Grafana, you can follow these basic steps:
 
 In order for Traffic Portal users to see Grafana graphs, Grafana will need to allow anonymous access. Information on how to configure anonymous access can be found on the configuration page of the `Grafana Website  <http://docs.grafana.org/installation/configuration/#authanonymous>`_.
 
-Traffic Portal uses custom dashboards to display information about individual Delivery Services or Cache Groups. In order for the custom graphs to display correctly, the `traffic_ops_*.js <https://github.com/apache/trafficcontrol/blob/master/traffic_stats/grafana/>`_ files need to be in the ``/usr/share/grafana/public/dashboards/`` directory on the Grafana server. If your Grafana server is the same as your Traffic Stats server the RPM install process will take care of putting the files i [...]
+Traffic Portal uses custom dashboards to display information about individual Delivery Services or :term:`Cache Group`\ s. In order for the custom graphs to display correctly, the `traffic_ops_*.js <https://github.com/apache/trafficcontrol/blob/master/traffic_stats/grafana/>`_ files need to be in the ``/usr/share/grafana/public/dashboards/`` directory on the Grafana server. If your Grafana server is the same as your Traffic Stats server the RPM install process will take care of putting t [...]
 
 More information on custom scripted graphs can be found in the `scripted dashboards <http://docs.grafana.org/reference/scripting/>`_ section of the Grafana documentation.
 
diff --git a/docs/source/api/cachegroup_fallbacks.rst b/docs/source/api/cachegroup_fallbacks.rst
index c2f21d6..c10fed5 100644
--- a/docs/source/api/cachegroup_fallbacks.rst
+++ b/docs/source/api/cachegroup_fallbacks.rst
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-Retrieve fallback-related configurations for a Cache Group.
+Retrieve fallback-related configurations for a :term:`Cache Group`.
 
 :Auth. Required: Yes
 :Roles Required: None
@@ -31,13 +31,13 @@ Request Structure
 -----------------
 .. table:: Request Query Parameters
 
-	+--------------+----------+---------------------------------------------------------------------------------------------------+
-	| Name         | Required | Description                                                                                       |
-	+==============+==========+===================================================================================================+
-	| cacheGroupId |yes\ [1]_ | The integral, unique identifier of a Cache Group whose fallback configurations shall be retrieved |
-	+--------------+----------+---------------------------------------------------------------------------------------------------+
-	| fallbackId   |yes\ [1]_ | The integral, unique identifier of a fallback Cache Group                                         |
-	+--------------+----------+---------------------------------------------------------------------------------------------------+
+	+--------------+----------+-----------------------------------------------------------------------------------------------------------+
+	| Name         | Required | Description                                                                                               |
+	+==============+==========+===========================================================================================================+
+	| cacheGroupId |yes\ [1]_ | The integral, unique identifier of a :term:`Cache Group` whose fallback configurations shall be retrieved |
+	+--------------+----------+-----------------------------------------------------------------------------------------------------------+
+	| fallbackId   |yes\ [1]_ | The integral, unique identifier of a fallback :term:`Cache Group`                                         |
+	+--------------+----------+-----------------------------------------------------------------------------------------------------------+
 
 .. code-block:: http
 	:caption: Request Example
@@ -50,11 +50,11 @@ Request Structure
 
 Response Structure
 ------------------
-:cacheGroupId:   The integral, unique identifier of the Cache Group described by this entry
-:cacheGroupName: The name of the Cache Group described by this entry
-:fallbackId:     The integral, unique identifier of the Cache Group on which the Cache Group described by this entry will fall back
-:fallbackName:   The name of the Cache Group on which the Cache Group described by this entry will fall back
-:fallbackOrder:  The order of the fallback described by "fallbackId" and "fallbackName" in the list of fallbacks for the Cache Group described by this entry
+:cacheGroupId:   The integral, unique identifier of the :term:`Cache Group` described by this entry
+:cacheGroupName: The name of the :term:`Cache Group` described by this entry
+:fallbackId:     The integral, unique identifier of the :term:`Cache Group` on which the :term:`Cache Group` described by this entry will fall back
+:fallbackName:   The name of the :term:`Cache Group` on which the :term:`Cache Group` described by this entry will fall back
+:fallbackOrder:  The order of the fallback described by "fallbackId" and "fallbackName" in the list of fallbacks for the :term:`Cache Group` described by this entry
 
 .. code-block:: http
 	:caption: Response Example
@@ -88,7 +88,7 @@ Response Structure
 
 ``POST``
 ========
-Creates fallback configuration for a Cache Group.
+Creates fallback configuration for a :term:`Cache Group`.
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -98,9 +98,9 @@ Request Structure
 -----------------
 The request payload for this endpoint **must** be an array, even if only one fallback relationship is being created.
 
-:cacheGroupId:  Integral, unique identifier of a Cache Group to which to assign a fallback
-:fallbackId:    Integral, unique identifier of a Cache Group on which the Cache Group identified by ``cacheGroupId`` will fall back
-:fallbackOrder: The order of this fallback for the Cache Group identified by ``cacheGroupId``
+:cacheGroupId:  Integral, unique identifier of a :term:`Cache Group` to which to assign a fallback
+:fallbackId:    Integral, unique identifier of a :term:`Cache Group` on which the :term:`Cache Group` identified by ``cacheGroupId`` will fall back
+:fallbackOrder: The order of this fallback for the :term:`Cache Group` identified by ``cacheGroupId``
 
 .. code-block:: http
 	:caption: Request Example
@@ -117,11 +117,11 @@ The request payload for this endpoint **must** be an array, even if only one fal
 
 Response Structure
 ------------------
-:cacheGroupId:   The integral, unique identifier of the Cache Group to which this fallback was assigned
-:cacheGroupName: The name of the Cache Group to which this fallback was assigned
-:fallbackId:     The integral, unique identifier of the Cache Group on which this entries Cache Group will fall back
-:fallbackName:   The name of the Cache Group on which this entries Cache Group will fall back
-:fallbackOrder:  The order of the fallback described by "fallbackId" and "fallbackName" in the list of fallbacks for the Cache Group described by this entry
+:cacheGroupId:   The integral, unique identifier of the :term:`Cache Group` to which this fallback was assigned
+:cacheGroupName: The name of the :term:`Cache Group` to which this fallback was assigned
+:fallbackId:     The integral, unique identifier of the :term:`Cache Group` on which this entries :term:`Cache Group` will fall back
+:fallbackName:   The name of the :term:`Cache Group` on which this entries :term:`Cache Group` will fall back
+:fallbackOrder:  The order of the fallback described by "fallbackId" and "fallbackName" in the list of fallbacks for the :term:`Cache Group` described by this entry
 
 
 .. code-block:: http
@@ -160,7 +160,7 @@ Response Structure
 
 ``PUT``
 =======
-Updates an existing fallback configuration for one or more Cache Groups.
+Updates an existing fallback configuration for one or more :term:`Cache Group`\ s.
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -169,9 +169,9 @@ Updates an existing fallback configuration for one or more Cache Groups.
 Request Structure
 -----------------
 The request payload for this endpoint **must** be an array, even if only one fallback relationship is being updated.
-:cacheGroupId:  Integral, unique identifier of a Cache Group to which to assign a fallback
-:fallbackId:    Integral, unique identifier of a Cache Group on which the Cache Group identified by ``cacheGroupId`` will fall back
-:fallbackOrder: The order of this fallback for the Cache Group identified by ``cacheGroupId``
+:cacheGroupId:  Integral, unique identifier of a :term:`Cache Group` to which to assign a fallback
+:fallbackId:    Integral, unique identifier of a :term:`Cache Group` on which the :term:`Cache Group` identified by ``cacheGroupId`` will fall back
+:fallbackOrder: The order of this fallback for the :term:`Cache Group` identified by ``cacheGroupId``
 
 .. note:: The request data should be an array of these objects (and any number can be submitted per request), see the example
 
@@ -190,11 +190,11 @@ The request payload for this endpoint **must** be an array, even if only one fal
 
 Response Structure
 ------------------
-:cacheGroupId:   The integral, unique identifier of the Cache Group to which this fallback was assigned
-:cacheGroupName: The name of the Cache Group to which this fallback was assigned
-:fallbackId:     The integral, unique identifier of the Cache Group on which this entries Cache Group will fall back
-:fallbackName:   The name of the Cache Group on which this entries Cache Group will fall back
-:fallbackOrder:  The order of the fallback described by "fallbackId" and "fallbackName" in the list of fallbacks for the Cache Group described by this entry
+:cacheGroupId:   The integral, unique identifier of the :term:`Cache Group` to which this fallback was assigned
+:cacheGroupName: The name of the :term:`Cache Group` to which this fallback was assigned
+:fallbackId:     The integral, unique identifier of the :term:`Cache Group` on which this entries :term:`Cache Group` will fall back
+:fallbackName:   The name of the :term:`Cache Group` on which this entries :term:`Cache Group` will fall back
+:fallbackOrder:  The order of the fallback described by "fallbackId" and "fallbackName" in the list of fallbacks for the :term:`Cache Group` described by this entry
 
 .. code-block:: http
 	:caption: Response Example
@@ -231,7 +231,7 @@ Response Structure
 
 ``DELETE``
 ==========
-Delete fallback list assigned to a Cache Group
+Delete fallback list assigned to a :term:`Cache Group`
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -241,13 +241,13 @@ Request Structure
 -----------------
 .. table:: Request Query Parameters
 
-	+--------------+----------+---------------------------------------------------------------------------------------------------+
-	| Name         | Required | Description                                                                                       |
-	+==============+==========+===================================================================================================+
-	| cacheGroupId |yes\ [2]_ | The integral, unique identifier of a Cache Group whose fallback configurations shall be retrieved |
-	+--------------+----------+---------------------------------------------------------------------------------------------------+
-	| fallbackId   |yes\ [2]_ | The integral, unique identifier of a fallback Cache Group                                         |
-	+--------------+----------+---------------------------------------------------------------------------------------------------+
+	+--------------+----------+-----------------------------------------------------------------------------------------------------------+
+	| Name         | Required | Description                                                                                               |
+	+==============+==========+===========================================================================================================+
+	| cacheGroupId |yes\ [2]_ | The integral, unique identifier of a :term:`Cache Group` whose fallback configurations shall be retrieved |
+	+--------------+----------+-----------------------------------------------------------------------------------------------------------+
+	| fallbackId   |yes\ [2]_ | The integral, unique identifier of a fallback :term:`Cache Group`                                         |
+	+--------------+----------+-----------------------------------------------------------------------------------------------------------+
 
 .. code-block:: http
 	:caption: Request Example
@@ -283,4 +283,4 @@ Response Structure
 	}
 
 
-.. [2] At least one of "cacheGroupId" or "fallbackId" must be sent with the request. If both are sent, a single fallback relationship is deleted, whereas using only "cacheGroupId" will result in all fallbacks being removed from the Cache Group identified by that integral, unique identifier, and using only "fallbackId" will remove the Cache Group identified by *that* integral, unique identifier from all other Cache Groups' fallback lists.
+.. [2] At least one of "cacheGroupId" or "fallbackId" must be sent with the request. If both are sent, a single fallback relationship is deleted, whereas using only "cacheGroupId" will result in all fallbacks being removed from the :term:`Cache Group` identified by that integral, unique identifier, and using only "fallbackId" will remove the :term:`Cache Group` identified by *that* integral, unique identifier from all other :term:`Cache Group`\ s' fallback lists.
diff --git a/docs/source/api/cachegroupparameters.rst b/docs/source/api/cachegroupparameters.rst
index f2842a9..9fd32ec 100644
--- a/docs/source/api/cachegroupparameters.rst
+++ b/docs/source/api/cachegroupparameters.rst
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-Extract information about parameters associated with Cache Groups
+Extract information about parameters associated with :term:`Cache Group`\ s
 
 :Auth. Required: Yes
 :Roles Required: None
@@ -33,11 +33,11 @@ No available parameters
 
 Response Structure
 ------------------
-:cachegroupParameters: An array of identifying information for parameters assigned to Cache Group profiles
+:cachegroupParameters: An array of identifying information for parameters assigned to :term:`Cache Group` profiles
 
 	:parameter:    Numeric ID of the parameter
 	:last_updated: Date and time of last modification in ISO format
-	:cachegroup:   Name of the Cache Group
+	:cachegroup:   Name of the :term:`Cache Group`
 
 .. code-block:: http
 	:caption: Response Example
@@ -68,7 +68,7 @@ Response Structure
 
 ``POST``
 ========
-Assign parameter(s) to Cache Group(s).
+Assign parameter(s) to :term:`Cache Group`(s).
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -78,7 +78,7 @@ Request Structure
 -----------------
 The request data can take the form of either a single object or an array of one or more objects.
 
-:cacheGroupId: Integral, unique identifier for the Cache Group to which a parameter is being assigned
+:cacheGroupId: Integral, unique identifier for the :term:`Cache Group` to which a parameter is being assigned
 :parameterId:  Integral, unique identifier for the Parameter being assigned
 
 .. code-block:: http
@@ -101,7 +101,7 @@ Response Structure
 ------------------
 :parameter:    Numeric ID of the parameter
 :last_updated: Date and time of last modification in ISO format
-:cachegroup:   Name of the Cache Group
+:cachegroup:   Name of the :term:`Cache Group`
 
 .. code-block:: http
  	:caption: Response Example
diff --git a/docs/source/api/cachegroupparameters_id_parameterID.rst b/docs/source/api/cachegroupparameters_id_parameterID.rst
index 8f51c57..257ec87 100644
--- a/docs/source/api/cachegroupparameters_id_parameterID.rst
+++ b/docs/source/api/cachegroupparameters_id_parameterID.rst
@@ -21,7 +21,7 @@
 
 ``DELETE``
 ==========
-De-associate a parameter with a Cache Group
+De-associate a parameter with a :term:`Cache Group`
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -31,13 +31,13 @@ Request Structure
 -----------------
 .. table:: Request Path Parameters
 
-	+-------------+-----------------------------------------------------------------------------------------+
-	| Name        | Description                                                                             |
-	+=============+=========================================================================================+
-	| ID          | Unique identifier for the Cache Group which will have the parameter association deleted |
-	+-------------+-----------------------------------------------------------------------------------------+
-	| parameterID | Unique identifier for the parameter which will be removed from a Cache Group            |
-	+-------------+-----------------------------------------------------------------------------------------+
+	+-------------+-------------------------------------------------------------------------------------------------+
+	| Name        | Description                                                                                     |
+	+=============+=================================================================================================+
+	| ID          | Unique identifier for the :term:`Cache Group` which will have the parameter association deleted |
+	+-------------+-------------------------------------------------------------------------------------------------+
+	| parameterID | Unique identifier for the parameter which will be removed from a :term:`Cache Group`            |
+	+-------------+-------------------------------------------------------------------------------------------------+
 
 .. code-block:: http
 	:caption: Request Example
diff --git a/docs/source/api/cachegroups.rst b/docs/source/api/cachegroups.rst
index 765c01c..d07aac0 100644
--- a/docs/source/api/cachegroups.rst
+++ b/docs/source/api/cachegroups.rst
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-Extract information about all Cache Groups.
+Extract information about all :term:`Cache Group`\ s.
 
 :Auth. Required: Yes
 :Roles Required: None
@@ -31,11 +31,11 @@ Request Structure
 -----------------
 .. table:: Request Query Parameters
 
-	+------+----------+----------------------------------------------------------------------------------------------+
-	| Name | Required | Description                                                                                  |
-	+======+==========+==============================================================================================+
-	| type | no       | Return only Cache Groups that are of the type identified by this integral, unique identifier |
-	+------+----------+----------------------------------------------------------------------------------------------+
+	+------+----------+--------------------------------------------------------------------------------------------------------+
+	| Name | Required | Description                                                                                            |
+	+======+==========+========================================================================================================+
+	| type | no       | Return only :term:`Cache Group`\ s that are of the type identified by this integral, unique identifier |
+	+------+----------+--------------------------------------------------------------------------------------------------------+
 
 .. code-block:: http
 	:caption: Request Example
@@ -49,19 +49,19 @@ Request Structure
 
 Response Structure
 ------------------
-:fallbackToClosest:             If ``true``, Traffic Router will direct clients to peers of this Cache Group in the event that it becomes unavailable.
-:id:                            A numeric, unique identifier for the Cache Group
+:fallbackToClosest:             If ``true``, Traffic Router will direct clients to peers of this :term:`Cache Group` in the event that it becomes unavailable.
+:id:                            A numeric, unique identifier for the :term:`Cache Group`
 :lastUpdated:                   The time and date at which this entry was last updated in ISO format
-:latitude:                      Latitude for the Cache Group
-:longitude:                     Longitude for the Cache Group
-:name:                          The name of the Cache Group entry
-:parentCachegroupId:            ID of this Cache Group's parent Cache Group (if any)
-:parentCachegroupName:          Name of this Cache Group's parent Cache Group (if any)
-:secondaryParentCachegroupId:   ID of this Cache Group's secondary parent Cache Group (if any)
-:secondaryParentCachegroupName: Name of this Cache Group's secondary parent Cache Group (if any)
-:shortName:                     Abbreviation of the Cache Group name
-:typeId:                        Unique identifier for the 'Type' of Cache Group entry
-:typeName:                      The name of the type of Cache Group entry
+:latitude:                      Latitude for the :term:`Cache Group`
+:longitude:                     Longitude for the :term:`Cache Group`
+:name:                          The name of the :term:`Cache Group` entry
+:parentCachegroupId:            ID of this :term:`Cache Group`\ 's parent :term:`Cache Group` (if any)
+:parentCachegroupName:          Name of this :term:`Cache Group`\ 's parent :term:`Cache Group` (if any)
+:secondaryParentCachegroupId:   ID of this :term:`Cache Group`\ 's secondary parent :term:`Cache Group` (if any)
+:secondaryParentCachegroupName: Name of this :term:`Cache Group`\ 's secondary parent :term:`Cache Group` (if any)
+:shortName:                     Abbreviation of the :term:`Cache Group` name
+:typeId:                        Unique identifier for the 'Type' of :term:`Cache Group` entry
+:typeName:                      The name of the type of :term:`Cache Group` entry
 
 .. note:: The default value of ``fallbackToClosest`` is 'true', and if it is 'null' Traffic Control components will still interpret it as 'true'.
 
@@ -102,7 +102,7 @@ Response Structure
 
 ``POST``
 ========
-Creates a cache group
+Creates a :term:`Cache Group`
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -110,18 +110,18 @@ Creates a cache group
 
 Request Structure
 -----------------
-:fallbackToClosest: If ``true``, the Traffic Router will fall back on the 'closest' Cache Group to this one, when this one fails
+:fallbackToClosest: If ``true``, the Traffic Router will fall back on the 'closest' :term:`Cache Group` to this one, when this one fails
 
 	.. note:: The default value of ``fallbackToClosest`` is 'true', and if it is 'null' Traffic Control components will still interpret it as 'true'.
 
-:latitude:                    An optional field which, if present, will define the latitude for the Cache Group to ISO-standard double specification\ [1]_
+:latitude:                    An optional field which, if present, will define the latitude for the :term:`Cache Group` to ISO-standard double specification\ [1]_
 :localizationMethods:         Array of enabled localization methods (as strings)
-:longitude:                   An optional field which, if present, will define the longitude for the Cache Group to ISO-standard double specification\ [1]_
-:name:                        The name of the Cache Group
-:parentCachegroupId:          An optional field which, if present, should be an integral, unique identifier for this Cache Group's primary parent
-:secondaryParentCachegroupId: An optional field which, if present, should be an integral, unique identifier for this Cache Group's secondary parent
+:longitude:                   An optional field which, if present, will define the longitude for the :term:`Cache Group` to ISO-standard double specification\ [1]_
+:name:                        The name of the :term:`Cache Group`
+:parentCachegroupId:          An optional field which, if present, should be an integral, unique identifier for this :term:`Cache Group`\ 's primary parent
+:secondaryParentCachegroupId: An optional field which, if present, should be an integral, unique identifier for this :term:`Cache Group`\ 's secondary parent
 :shortName:                   An abbreviation of the ``name``
-:typeId:                      An integral, unique identifier for the type of Cache Group; one of:
+:typeId:                      An integral, unique identifier for the type of :term:`Cache Group`; one of:
 
 	EDGE_LOC
 		Indicates a group of Edge-tier caches
@@ -156,19 +156,19 @@ Request Structure
 
 Response Structure
 ------------------
-:fallbackToClosest:             If ``true``, Traffic Router will direct clients to peers of this Cache Group in the event that it becomes unavailable.
-:id:                            A numeric, unique identifier for the Cache Group
+:fallbackToClosest:             If ``true``, Traffic Router will direct clients to peers of this :term:`Cache Group` in the event that it becomes unavailable.
+:id:                            A numeric, unique identifier for the :term:`Cache Group`
 :lastUpdated:                   The time and date at which this entry was last updated in ISO format
-:latitude:                      Latitude for the Cache Group
-:longitude:                     Longitude for the Cache Group
-:name:                          The name of the Cache Group entry
-:parentCachegroupId:            ID of this Cache Group's parent Cache Group (if any)
-:parentCachegroupName:          Name of this Cache Group's parent Cache Group (if any)
-:secondaryParentCachegroupId:   ID of this Cache Group's secondary parent Cache Group (if any)
-:secondaryParentCachegroupName: Name of this Cache Group's secondary parent Cache Group (if any)
-:shortName:                     Abbreviation of the Cache Group name
-:typeId:                        Unique identifier for the 'Type' of Cache Group entry
-:typeName:                      The name of the type of Cache Group entry
+:latitude:                      Latitude for the :term:`Cache Group`
+:longitude:                     Longitude for the :term:`Cache Group`
+:name:                          The name of the :term:`Cache Group` entry
+:parentCachegroupId:            ID of this :term:`Cache Group`\ 's parent :term:`Cache Group` (if any)
+:parentCachegroupName:          Name of this :term:`Cache Group`\ 's parent :term:`Cache Group` (if any)
+:secondaryParentCachegroupId:   ID of this :term:`Cache Group`\ 's secondary parent :term:`Cache Group` (if any)
+:secondaryParentCachegroupName: Name of this :term:`Cache Group`\ 's secondary parent :term:`Cache Group` (if any)
+:shortName:                     Abbreviation of the :term:`Cache Group` name
+:typeId:                        Unique identifier for the 'Type' of :term:`Cache Group` entry
+:typeName:                      The name of the type of :term:`Cache Group` entry
 
 
 .. code-block:: http
@@ -209,7 +209,7 @@ Response Structure
 		"lastUpdated": "2018-11-07 22:11:50+00"
 	}}
 
-.. [1] While these fields are technically optional, note that if they are not specified many things may break. For this reason, Traffic Portal requires them when creating or editing Cache Groups.
+.. [1] While these fields are technically optional, note that if they are not specified many things may break. For this reason, Traffic Portal requires them when creating or editing :term:`Cache Group`\ s.
 
 .. This doesn't appear to exist anymore - can't reproduce in CIAB nor production
 .. ``/api/1.1/cachegroups/:parameter_id/parameter/available``
diff --git a/docs/source/api/cachegroups_id.rst b/docs/source/api/cachegroups_id.rst
index bbf7725..f79b715 100644
--- a/docs/source/api/cachegroups_id.rst
+++ b/docs/source/api/cachegroups_id.rst
@@ -18,7 +18,7 @@
 **********************
 ``cachegroups/{{ID}}``
 **********************
-Extracts information about a single Cache Group
+Extracts information about a single :term:`Cache Group`
 
 ``GET``
 =======
@@ -33,16 +33,16 @@ Request Structure
 	+--------------+---------------------------------------------------------------+
 	| Parameter    | Description                                                   |
 	+==============+===============================================================+
-	| ID           | The integral, unique identifier of a Cache Group              |
+	| ID           | The integral, unique identifier of a :term:`Cache Group`      |
 	+--------------+---------------------------------------------------------------+
 
 Response Structure
 ------------------
-:fallbackToClosest:   If ``true``, Traffic Router will direct clients to peers of this Cache Group in the event that it becomes unavailable
-:id:                  Integral, unique identifier for the Cache Group
-:lastUpdated:         The date and time at which this Cache Group was last updated, in an ISO-like format
-:latitude:            Latitude of the Cache Group
-:localizationMethods: An array of strings that name the localization methods enabled for this Cache Group. Each of the three available localization methods may be present, with the following meanings:
+:fallbackToClosest:   If ``true``, Traffic Router will direct clients to peers of this :term:`Cache Group` in the event that it becomes unavailable
+:id:                  Integral, unique identifier for the :term:`Cache Group`
+:lastUpdated:         The date and time at which this :term:`Cache Group` was last updated, in an ISO-like format
+:latitude:            Latitude of the :term:`Cache Group`
+:localizationMethods: An array of strings that name the localization methods enabled for this :term:`Cache Group`. Each of the three available localization methods may be present, with the following meanings:
 
 	CZ
 		Lookup in the Traffic Router's "Coverage Zone" file is enabled
@@ -51,15 +51,15 @@ Response Structure
 	GEO
 		Use of a geographical location-to-IP mapping database is enabled
 
-:longitude:                     Longitude of the Cache Group
-:name:                          The name of the Cache Group
-:parentCachegroupId:            Integral, unique identifier of the Cache Group that is this Cache Group's parent
-:parentCachegroupName:          The name of the Cache Group that is this Cache Group's parent
-:secondaryParentCachegroupId:   Integral, unique identifier of the Cache Group that is this Cache Group's secondary parent
-:secondaryParentCachegroupName: The name of the Cache Group that is this Cache Group's secondary parent
-:shortName:                     Abbreviation of the Cache Group Name
-:typeId:                        The integral, unique identifier for the 'Type' of Cache Group
-:typeName:                      The name of the type of this Cache Group
+:longitude:                     Longitude of the :term:`Cache Group`
+:name:                          The name of the :term:`Cache Group`
+:parentCachegroupId:            Integral, unique identifier of the :term:`Cache Group` that is this :term:`Cache Group`\ 's parent
+:parentCachegroupName:          The name of the :term:`Cache Group` that is this :term:`Cache Group`\ 's parent
+:secondaryParentCachegroupId:   Integral, unique identifier of the :term:`Cache Group` that is this :term:`Cache Group`\ 's secondary parent
+:secondaryParentCachegroupName: The name of the :term:`Cache Group` that is this :term:`Cache Group`\ 's secondary parent
+:shortName:                     Abbreviation of the :term:`Cache Group` Name
+:typeId:                        The integral, unique identifier for the 'Type' of :term:`Cache Group`
+:typeName:                      The name of the type of this :term:`Cache Group`
 
 .. note:: The default value of ``fallbackToClosest`` is 'true', and if it is 'null' Traffic Control components will still interpret it as 'true'.
 
@@ -103,7 +103,7 @@ Response Structure
 
 ``PUT``
 =======
-Update Cache Group
+Update :term:`Cache Group`
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -116,15 +116,15 @@ Request Structure
 	+--------------+---------------------------------------------------------------+
 	| Parameter    | Description                                                   |
 	+==============+===============================================================+
-	| ID           | The integral, unique identifier of a Cache Group              |
+	| ID           | The integral, unique identifier of a :term:`Cache Group`      |
 	+--------------+---------------------------------------------------------------+
 
-:fallbackToClosest: An optional field which, if present and ``true``, will cause Traffic Router to direct clients to peers of this Cache Group in the event that it becomes unavailable
+:fallbackToClosest: An optional field which, if present and ``true``, will cause Traffic Router to direct clients to peers of this :term:`Cache Group` in the event that it becomes unavailable
 
 	.. note:: The default value of ``fallbackToClosest`` is ``true``, and if it is ``null`` or ``undefined`` Traffic Control components will still interpret it as ``true``.
 
-:latitude:            An optional field which, if specified, will set the latitude of the new Cache Group\ [1]_
-:localizationMethods: An optional array of strings that name the localization methods enabled for this Cache Group. Each of the three available localization methods may be present, with the following meanings:
+:latitude:            An optional field which, if specified, will set the latitude of the new :term:`Cache Group`\ [1]_
+:localizationMethods: An optional array of strings that name the localization methods enabled for this :term:`Cache Group`. Each of the three available localization methods may be present, with the following meanings:
 
 	CZ
 		Lookup in the Traffic Router's "Coverage Zone" file will be enabled
@@ -133,12 +133,12 @@ Request Structure
 	GEO
 		Use of a geographical location-to-IP mapping database will be enabled
 
-:longitude:                 An optional field which, if specified, will set the longitude of the new Cache Group\ [1]_
-:name:                      The desired name of the Cache Group entry
-:parentCachegroup:          An optional field which, if specified, should be the integral, unique identifier of Cache Group to use as the new Cache Group's parent
-:secondaryParentCachegroup: An optional field which, if specified, should be the integral, unique identifier of Cache Group to use as the new Cache Group's parent
-:shortName:                 A more human-friendly abbreviation of the Cache Group's name
-:typeId:                    The integral, unique identifier of the desired type of the new Cache Group - by default the valid options are: "EDGE_LOC", "MID_LOC" or "ORG_LOC"
+:longitude:                 An optional field which, if specified, will set the longitude of the new :term:`Cache Group`\ [1]_
+:name:                      The desired name of the :term:`Cache Group` entry
+:parentCachegroup:          An optional field which, if specified, should be the integral, unique identifier of :term:`Cache Group` to use as the new :term:`Cache Group`\ 's parent
+:secondaryParentCachegroup: An optional field which, if specified, should be the integral, unique identifier of :term:`Cache Group` to use as the new :term:`Cache Group`\ 's parent
+:shortName:                 A more human-friendly abbreviation of the :term:`Cache Group`\ 's name
+:typeId:                    The integral, unique identifier of the desired type of the new :term:`Cache Group` - by default the valid options are: "EDGE_LOC", "MID_LOC" or "ORG_LOC"
 
 	.. note:: Rather than the actual name of the type, be sure to use the "database ID" of the desired type. Typically this will require looking up the types via the API first, as the IDs of even these default types is not deterministic.
 
@@ -157,11 +157,11 @@ Request Structure
 
 Response Structure
 ------------------
-:fallbackToClosest:   If ``true``, Traffic Router will direct clients to peers of this Cache Group in the event that it becomes unavailable
-:id:                  Integral, unique identifier for the Cache Group
-:lastUpdated:         The date and time at which this Cache Group was last updated, in an ISO-like format
-:latitude:            Latitude of the Cache Group
-:localizationMethods: An array of strings that name the localization methods enabled for this Cache Group. Each of the three available localization methods may be present, with the following meanings:
+:fallbackToClosest:   If ``true``, Traffic Router will direct clients to peers of this :term:`Cache Group` in the event that it becomes unavailable
+:id:                  Integral, unique identifier for the :term:`Cache Group`
+:lastUpdated:         The date and time at which this :term:`Cache Group` was last updated, in an ISO-like format
+:latitude:            Latitude of the :term:`Cache Group`
+:localizationMethods: An array of strings that name the localization methods enabled for this :term:`Cache Group`. Each of the three available localization methods may be present, with the following meanings:
 
 	CZ
 		Lookup in the Traffic Router's "Coverage Zone" file is enabled
@@ -170,15 +170,15 @@ Response Structure
 	GEO
 		Use of a geographical location-to-IP mapping database is enabled
 
-:longitude:                     Longitude of the Cache Group
-:name:                          The name of the Cache Group
-:parentCachegroupId:            Integral, unique identifier of the Cache Group that is this Cache Group's parent
-:parentCachegroupName:          The name of the Cache Group that is this Cache Group's parent
-:secondaryParentCachegroupId:   Integral, unique identifier of the Cache Group that is this Cache Group's secondary parent
-:secondaryParentCachegroupName: The name of the Cache Group that is this Cache Group's secondary parent
-:shortName:                     Abbreviation of the Cache Group Name
-:typeId:                        The integral, unique identifier for the 'Type' of Cache Group
-:typeName:                      The name of the type of this Cache Group
+:longitude:                     Longitude of the :term:`Cache Group`
+:name:                          The name of the :term:`Cache Group`
+:parentCachegroupId:            Integral, unique identifier of the :term:`Cache Group` that is this :term:`Cache Group`\ 's parent
+:parentCachegroupName:          The name of the :term:`Cache Group` that is this :term:`Cache Group`\ 's parent
+:secondaryParentCachegroupId:   Integral, unique identifier of the :term:`Cache Group` that is this :term:`Cache Group`\ 's secondary parent
+:secondaryParentCachegroupName: The name of the :term:`Cache Group` that is this :term:`Cache Group`\ 's secondary parent
+:shortName:                     Abbreviation of the :term:`Cache Group` Name
+:typeId:                        The integral, unique identifier for the 'Type' of :term:`Cache Group`
+:typeName:                      The name of the type of this :term:`Cache Group`
 
 .. code-block:: http
 	:caption: Response Example
@@ -220,11 +220,11 @@ Response Structure
 		"lastUpdated": "2018-11-14 19:14:28+00"
 	}}
 
-.. [1] While these fields are technically optional, note that if they are not specified many things may break. For this reason, Traffic Portal requires them when creating or editing Cache Groups.
+.. [1] While these fields are technically optional, note that if they are not specified many things may break. For this reason, Traffic Portal requires them when creating or editing :term:`Cache Group`\ s.
 
 ``DELETE``
 ==========
-Delete Cache Group. Cache Groups which have assigned servers or child Cache Groups cannot be deleted.
+Delete :term:`Cache Group`. :term:`Cache Group`\ s which have assigned servers or child :term:`Cache Group`\ s cannot be deleted.
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -234,11 +234,11 @@ Request Structure
 -----------------
 .. table:: Request Path Parameters
 
-	+--------------+----------------------------------------------------------------+
-	| Parameter    | Description                                                    |
-	+==============+================================================================+
-	| ID           | The integral, unique identifier of a Cache Group to be deleted |
-	+--------------+----------------------------------------------------------------+
+	+--------------+------------------------------------------------------------------------+
+	| Parameter    | Description                                                            |
+	+==============+========================================================================+
+	| ID           | The integral, unique identifier of a :term:`Cache Group` to be deleted |
+	+--------------+------------------------------------------------------------------------+
 
 Response Structure
 ------------------
diff --git a/docs/source/api/cachegroups_id_deliveryservices.rst b/docs/source/api/cachegroups_id_deliveryservices.rst
index 845bc9a..208e39d 100644
--- a/docs/source/api/cachegroups_id_deliveryservices.rst
+++ b/docs/source/api/cachegroups_id_deliveryservices.rst
@@ -21,7 +21,7 @@
 
 ``POST``
 ========
-Assigns a Cache Group to one or more Delivery Services
+Assigns a :term:`Cache Group` to one or more Delivery Services
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -31,13 +31,13 @@ Request Structure
 -----------------
 .. table::Request Path Parameters
 
-	+------+-------------------------------------------------------------------+
-	| Name |           Description                                             |
-	+======+===================================================================+
-	|  ID  | The integral, unique identifier of the Cache Group being assigned |
-	+------+-------------------------------------------------------------------+
+	+------+---------------------------------------------------------------------------+
+	| Name |           Description                                                     |
+	+======+===========================================================================+
+	|  ID  | The integral, unique identifier of the :term:`Cache Group` being assigned |
+	+------+---------------------------------------------------------------------------+
 
-:deliveryServices:  The integral, unique identifiers of the Delivery Services to which the Cache Group is being assigned
+:deliveryServices:  The integral, unique identifiers of the Delivery Services to which the :term:`Cache Group` is being assigned
 
 .. code-block:: http
 	:caption: Request Example
@@ -54,9 +54,9 @@ Request Structure
 
 Response Structure
 ------------------
-:deliveryServices: An array of *all* Delivery Services to which the Cache Group is assigned (**not** just the one(s) to which it was assigned via the request)
-:id:               The Cache Group's ID
-:serverNames:      An array of the (short) hostnames of all servers in the Cache Group
+:deliveryServices: An array of *all* Delivery Services to which the :term:`Cache Group` is assigned (**not** just the one(s) to which it was assigned via the request)
+:id:               The :term:`Cache Group`\ 's ID
+:serverNames:      An array of the (short) hostnames of all servers in the :term:`Cache Group`
 
 .. code-block:: http
 	:caption: Response Example
diff --git a/docs/source/api/cachegroups_id_parameters.rst b/docs/source/api/cachegroups_id_parameters.rst
index 0f5378c..757d02c 100644
--- a/docs/source/api/cachegroups_id_parameters.rst
+++ b/docs/source/api/cachegroups_id_parameters.rst
@@ -18,7 +18,7 @@
 *********************************
 ``cachegroups/{{ID}}/parameters``
 *********************************
-Gets all the parameters associated with a Cache Group
+Gets all the parameters associated with a :term:`Cache Group`
 
 .. seealso:: :ref:`param-prof`
 
@@ -32,11 +32,11 @@ Request Structure
 -----------------
 .. table:: Request Path Parameters
 
-	+-----------+--------------------------------------------------+
-	| Parameter | Description                                      |
-	+===========+==================================================+
-	| ID        | The integral, unique identifier of a Cache Group |
-	+-----------+--------------------------------------------------+
+	+-----------+----------------------------------------------------------+
+	| Parameter | Description                                              |
+	+===========+==========================================================+
+	| ID        | The integral, unique identifier of a :term:`Cache Group` |
+	+-----------+----------------------------------------------------------+
 
 
 Response Structure
diff --git a/docs/source/api/cachegroups_id_queue_update.rst b/docs/source/api/cachegroups_id_queue_update.rst
index ce016ba..89f95fe 100644
--- a/docs/source/api/cachegroups_id_queue_update.rst
+++ b/docs/source/api/cachegroups_id_queue_update.rst
@@ -21,7 +21,7 @@
 
 ``POST``
 ========
-Queue or dequeue updates for all servers assigned to a cache group limited to a specific CDN.
+Queue or dequeue updates for all servers assigned to a :term:`Cache Group` limited to a specific CDN.
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
@@ -31,11 +31,11 @@ Request Structure
 -----------------
 .. table:: Request Path Parameters
 
-	+------+-------------------------------------------------------------------------------------------------+
-	| Name | Description                                                                                     |
-	+======+=================================================================================================+
-	| ID   | The integral, unique identifier for the Cache Group for which updates are being queued/dequeued |
-	+------+-------------------------------------------------------------------------------------------------+
+	+------+---------------------------------------------------------------------------------------------------------+
+	| Name | Description                                                                                             |
+	+======+=========================================================================================================+
+	| ID   | The integral, unique identifier for the :term:`Cache Group` for which updates are being queued/dequeued |
+	+------+---------------------------------------------------------------------------------------------------------+
 
 :action: The action to perform; one of "queue" or "dequeue"
 :cdn:    The full name of the CDN in need of update queue/dequeue\ [1]_
@@ -59,10 +59,10 @@ Request Structure
 Response Structure
 ------------------
 :action:         The action processed, one of "queue" or "dequeue"
-:cachegroupId:   The integral, unique identifier of the Cache Group for which updates were queued/dequeued
-:cachegroupName: The name of the Cache Group for which updates were queued/dequeued
+:cachegroupId:   The integral, unique identifier of the :term:`Cache Group` for which updates were queued/dequeued
+:cachegroupName: The name of the :term:`Cache Group` for which updates were queued/dequeued
 :cdn:            The name of the CDN to which the queue/dequeue operation was restricted
-:serverNames:    An array of the (short) hostnames of the servers within the Cache Group which are also assigned to the CDN specified in the ``"cdn"`` field
+:serverNames:    An array of the (short) hostnames of the servers within the :term:`Cache Group` which are also assigned to the CDN specified in the ``"cdn"`` field
 
 .. code-block:: http
 	:caption: Response Example
diff --git a/docs/source/api/cachegroups_id_unassigned_parameters.rst b/docs/source/api/cachegroups_id_unassigned_parameters.rst
index 42fd375..bcf4b6f 100644
--- a/docs/source/api/cachegroups_id_unassigned_parameters.rst
+++ b/docs/source/api/cachegroups_id_unassigned_parameters.rst
@@ -18,7 +18,7 @@
 ********************************************
 ``cachegroups/{{id}}/unassigned_parameters``
 ********************************************
-Gets all the parameters NOT associated with a specific Cache Group
+Gets all the parameters NOT associated with a specific :term:`Cache Group`
 
 .. seealso:: :ref:`param-prof`
 
@@ -32,11 +32,11 @@ Request Structure
 -----------------
 .. table:: Request Path Parameters
 
-	+------------------+----------+-----------------------+
-	|       Name       | Required | Description           |
-	+==================+==========+=======================+
-	| ``id``           | yes      | Cache Group ID        |
-	+------------------+----------+-----------------------+
+	+------------------+----------+------------------------+
+	|       Name       | Required | Description            |
+	+==================+==========+========================+
+	| ``id``           | yes      | :term:`Cache Group` ID |
+	+------------------+----------+------------------------+
 
 
 Response Structure
diff --git a/docs/source/api/cachegroups_parameterID_parameter_available.rst b/docs/source/api/cachegroups_parameterID_parameter_available.rst
index c0e35bd..242a22c 100644
--- a/docs/source/api/cachegroups_parameterID_parameter_available.rst
+++ b/docs/source/api/cachegroups_parameterID_parameter_available.rst
@@ -25,7 +25,7 @@
 
 ``GET``
 =======
-Gets a list of Cache Groups which are available to have a specific parameter assigned to them
+Gets a list of :term:`Cache Group`\ s which are available to have a specific parameter assigned to them
 
 :Auth. Required: Yes
 :Roles Required: None
@@ -43,8 +43,8 @@ Request Structure
 
 Response Structure
 ------------------
-:id:   An integral, unique identifier for the Cache Group
-:name: The name of the Cache Group
+:id:   An integral, unique identifier for the :term:`Cache Group`
+:name: The name of the :term:`Cache Group`
 
 .. code-block:: json
 	:caption: Response Example
diff --git a/docs/source/api/cachegroups_trimmed.rst b/docs/source/api/cachegroups_trimmed.rst
index dd462c3..db82dd3 100644
--- a/docs/source/api/cachegroups_trimmed.rst
+++ b/docs/source/api/cachegroups_trimmed.rst
@@ -18,7 +18,7 @@
 ***********************
 ``cachegroups/trimmed``
 ***********************
-Extract just the names of all Cache Groups.
+Extract just the names of all :term:`Cache Group`\ s.
 
 ``GET``
 =======
@@ -32,7 +32,7 @@ No parameters available
 
 Response Structure
 ------------------
-:name: The name of the Cache Group                    |
+:name: The name of the :term:`Cache Group`                    |
 
 .. code-block:: http
 	:caption: Response Example
diff --git a/docs/source/api/caches_stats.rst b/docs/source/api/caches_stats.rst
index ea3195c..1369875 100644
--- a/docs/source/api/caches_stats.rst
+++ b/docs/source/api/caches_stats.rst
@@ -37,7 +37,7 @@ No parameters available.
 
 Response Structure
 ------------------
-:cachegroup:  The name of the Cache Group to which this cache belongs
+:cachegroup:  The name of the :term:`Cache Group` to which this cache belongs
 :connections: Current number of TCP connections maintained by the cache
 :healthy:     ``true`` if Traffic Monitor has marked the cache as "healthy", ``false`` otherwise
 
diff --git a/docs/source/api/cdns_name_health.rst b/docs/source/api/cdns_name_health.rst
index 7f2da1e..b6c168c 100644
--- a/docs/source/api/cdns_name_health.rst
+++ b/docs/source/api/cdns_name_health.rst
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-Retrieves the health of all Cache Groups for a given CDN.
+Retrieves the health of all :term:`Cache Group`\ s for a given CDN.
 
 :Auth. Required: Yes
 :Roles Required: None
@@ -39,14 +39,14 @@ Request Structure
 
 Response Structure
 ------------------
-:cachegroups:  An array of objects describing the health of each Cache Group
+:cachegroups:  An array of objects describing the health of each :term:`Cache Group`
 
-	:name:    The name of the Cache Group
-	:offline: The number of OFFLINE caches in the Cache Group
-	:online:  The number of ONLINE caches in the Cache Group
+	:name:    The name of the :term:`Cache Group`
+	:offline: The number of OFFLINE caches in the :term:`Cache Group`
+	:online:  The number of ONLINE caches in the :term:`Cache Group`
 
-:totalOffline: Total number of OFFLINE caches across all Cache Groups which are assigned to the CDN defined by the ``name`` request path parameter
-:totalOnline:  Total number of ONLINE caches across all Cache Groups which are assigned to the CDN defined by the ``name`` request path parameter
+:totalOffline: Total number of OFFLINE caches across all :term:`Cache Group`\ s which are assigned to the CDN defined by the ``name`` request path parameter
+:totalOnline:  Total number of ONLINE caches across all :term:`Cache Group`\ s which are assigned to the CDN defined by the ``name`` request path parameter
 
 .. code-block:: http
 	:caption: Response Example
diff --git a/docs/source/api/deliveryservices_id_health.rst b/docs/source/api/deliveryservices_id_health.rst
index 0007f07..2eda5cd 100644
--- a/docs/source/api/deliveryservices_id_health.rst
+++ b/docs/source/api/deliveryservices_id_health.rst
@@ -23,7 +23,7 @@
 
 ``GET``
 =======
-Retrieves the health of all Cache Groups assigned to a particular Delivery Service
+Retrieves the health of all :term:`Cache Group`\ s assigned to a particular Delivery Service
 
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"\ [1]_
@@ -33,20 +33,20 @@ Request Structure
 -----------------
 .. table:: Request Path Parameters
 
-	+------+--------------------------------------------------------------------------------------------------+
-	| Name | Description                                                                                      |
-	+======+==================================================================================================+
-	| ID   | The integral, unique identifier of the Delivery service for which Cache Groups will be displayed |
-	+------+--------------------------------------------------------------------------------------------------+
+	+------+------------------------------------------------------------------------------------------------------------+
+	| Name | Description                                                                                                |
+	+======+============================================================================================================+
+	| ID   | The integral, unique identifier of the Delivery service for which :term:`Cache Group`\ s will be displayed |
+	+------+------------------------------------------------------------------------------------------------------------+
 
 
 Response Structure
 ------------------
-:cachegroups: An array of objects that represent the health of each Cache Group assigned to this Delivery Service
+:cachegroups: An array of objects that represent the health of each :term:`Cache Group` assigned to this Delivery Service
 
-	:name:    The name of the Cache Group represented by this object
-	:offline: The number of offline cache servers within this Cache Group
-	:online:  The number of online cache servers within this Cache Group
+	:name:    The name of the :term:`Cache Group` represented by this object
+	:offline: The number of offline cache servers within this :term:`Cache Group`
+	:online:  The number of online cache servers within this :term:`Cache Group`
 
 :totalOffline: Total number of offline cache servers assigned to this Delivery Service
 :totalOnline:  Total number of online cache servers assigned to this Delivery Service
@@ -80,4 +80,4 @@ Response Structure
 		]
 	}}
 
-.. [1] Users with the roles "admin" and/or "operations" will be able to the see Cache Groups associated with *any* Delivery Services, whereas any other user will only be able to see the Cache Groups associated with Delivery Services their Tenant is allowed to see.
+.. [1] Users with the roles "admin" and/or "operations" will be able to the see :term:`Cache Group`\ s associated with *any* Delivery Services, whereas any other user will only be able to see the :term:`Cache Group`\ s associated with Delivery Services their Tenant is allowed to see.
diff --git a/docs/source/api/origins.rst b/docs/source/api/origins.rst
index cdece7d..8b529d1 100644
--- a/docs/source/api/origins.rst
+++ b/docs/source/api/origins.rst
@@ -35,7 +35,7 @@ Request Structure
 	+-----------------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 	| Name            | Required | Description                                                                                                                                                                          |
 	+=================+==========+======================================================================================================================================================================================+
-	| cachegroup      | no       | Return only origins within the Cache Group identified by this integral, unique identifier                                                                                            |
+	| cachegroup      | no       | Return only origins within the :term:`Cache Group` identified by this integral, unique identifier                                                                                    |
 	+-----------------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 	| coordinate      | no       | Return only origins located at the geographic coordinates identified by this integral, unique identifier                                                                             |
 	+-----------------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -66,8 +66,8 @@ Request Structure
 
 Response Structure
 ------------------
-:cachegroup:        The name of the Cache Group to which the origin belongs
-:cachegroupId:      An integral, unique identifier for the Cache Group to which the origin belongs
+:cachegroup:        The name of the :term:`Cache Group` to which the origin belongs
+:cachegroupId:      An integral, unique identifier for the :term:`Cache Group` to which the origin belongs
 :coordinate:        The name of a coordinate pair that defines the origin's geographic location
 :coordinateID:      An integral, unique identifier for the coordinate pair that defines the origin's geographic location
 :deliveryService:   The 'xml_id' of the Delivery Service to which the origin belongs
@@ -137,7 +137,7 @@ Creates a new origin definition.
 
 Request Structure
 -----------------
-:cachegroupId:      An optional, integral, unique identifier that identifies a Cache Group to which the new origin shall belong
+:cachegroupId:      An optional, integral, unique identifier that identifies a :term:`Cache Group` to which the new origin shall belong
 :coordinateID:      An optional, integral, unique identifier of a coordinate pair that shall define the origin's geographic location
 :deliveryServiceId: The integral, unique identifier of the Delivery Service to which the new origin shall belong
 :fqdn:              The Fully Qualified Domain Name (FQDN) of the origin
@@ -177,8 +177,8 @@ Request Structure
 
 Response Structure
 ------------------
-:cachegroup:        The name of the Cache Group to which the origin belongs
-:cachegroupId:      An integral, unique identifier for the Cache Group to which the origin belongs
+:cachegroup:        The name of the :term:`Cache Group` to which the origin belongs
+:cachegroupId:      An integral, unique identifier for the :term:`Cache Group` to which the origin belongs
 :coordinate:        The name of a coordinate pair that defines the origin's geographic location
 :coordinateID:      An integral, unique identifier for the coordinate pair that defines the origin's geographic location
 :deliveryService:   The 'xml_id' of the Delivery Service to which the origin belongs
@@ -258,7 +258,7 @@ Request Structure
 	|  id  | yes      | The integral, unique identifier of the origin definition being edited |
 	+------+----------+-----------------------------------------------------------------------+
 
-:cachegroupId:      An optional, integral, unique identifier that identifies a Cache Group to which the new origin shall belong
+:cachegroupId:      An optional, integral, unique identifier that identifies a :term:`Cache Group` to which the new origin shall belong
 :coordinateID:      An optional, integral, unique identifier of a coordinate pair that shall define the origin's geographic location
 :deliveryServiceId: The integral, unique identifier of the Delivery Service to which the new origin shall belong
 :fqdn:              The Fully Qualified Domain Name (FQDN) of the origin
@@ -295,8 +295,8 @@ Request Structure
 
 Response Structure
 ------------------
-:cachegroup:        The name of the Cache Group to which the origin belongs
-:cachegroupId:      An integral, unique identifier for the Cache Group to which the origin belongs
+:cachegroup:        The name of the :term:`Cache Group` to which the origin belongs
+:cachegroupId:      An integral, unique identifier for the :term:`Cache Group` to which the origin belongs
 :coordinate:        The name of a coordinate pair that defines the origin's geographic location
 :coordinateID:      An integral, unique identifier for the coordinate pair that defines the origin's geographic location
 :deliveryService:   The 'xml_id' of the Delivery Service to which the origin belongs
diff --git a/docs/source/faq/administration.rst b/docs/source/faq/administration.rst
index 277633f..9daec15 100644
--- a/docs/source/faq/administration.rst
+++ b/docs/source/faq/administration.rst
@@ -20,20 +20,20 @@ Running a Traffic Control CDN
 
 Cache Group
 -------------------
-  A cache group is a logical group of caches that Traffic Router tries to use as a combined cache. Traffic Router treats all servers in a cache group as though they are in the same physical location, though they are in fact only in the same region (network). A cache group has one single set of geographical coordinates even if the caches that make up the cache group are in different physical locations. The caches in a cache group are not aware of the other caches in the group - there is n [...]
+  A :term:`Cache Group` is a logical group of caches that Traffic Router tries to use as a combined cache. Traffic Router treats all servers in a :term:`Cache Group` as though they are in the same physical location, though they are in fact only in the same region (network). A :term:`Cache Group` has one single set of geographical coordinates even if the caches that make up the :term:`Cache Group` are in different physical locations. The caches in a :term:`Cache Group` are not aware of th [...]
 
-  There are two types of cache groups: EDGE and MID. Traffic Control is a two tier system, where the clients get directed to the EDGE cache group. On cache miss, the cache in the EDGE cache group obtains content from a MID cache group, rather than the origin, which is shared with multiple EDGEs. EDGE cache groups are configured to have one single parent cache group.
+  There are two types of :term:`Cache Group`\ s: EDGE and MID. Traffic Control is a two tier system, where the clients get directed to the EDGE :term:`Cache Group`. On cache miss, the cache in the EDGE :term:`Cache Group` obtains content from a MID :term:`Cache Group`, rather than the origin, which is shared with multiple EDGEs. EDGE :term:`Cache Group`\ s are configured to have one single parent :term:`Cache Group`.
 
   ..  Note:: Often the EDGE to MID relationship is based on network distance, and does not necessarily match the geographic distance.
 
-  A cache group serves a particular part of the network as defined in the coverage zone file. See :ref:`asn-czf`.
+  A :term:`Cache Group` serves a particular part of the network as defined in the coverage zone file. See :ref:`asn-czf`.
 
   Consider the example CDN below:
 
   .. image:: cache_groups_1.png
 	:align: center
 
-  There are two MID tier cache groups, each assigned with three EDGEs. The lax, den and chi EDGE locations are configured with the West MID as their parent, and the nyc, phl, and hou EDGEs, are configured with the East MID as their parent. On a cache miss, the EDGEs use their assigned parent.
+  There are two MID tier :term:`Cache Group`\ s, each assigned with three EDGEs. The lax, den and chi EDGE locations are configured with the West MID as their parent, and the nyc, phl, and hou EDGEs, are configured with the East MID as their parent. On a cache miss, the EDGEs use their assigned parent.
 
 All caches (and other servers) are assigned a Profile in Traffic Ops.
 
@@ -65,10 +65,10 @@ Why is my CRConfig.json rejected?
 	* Add Physical Locations
 		You will need at least one.
 
-	* Add Mid tier Cache Groups
+	* Add Mid tier :term:`Cache Group`\ s
 		You will need at least one.
 
-	* Add Edge tier Cache Groups
+	* Add Edge tier :term:`Cache Group`\ s
 		You will need at least one.
 
 	* Add Traffic Monitors
diff --git a/traffic_ops/traffic_ops_golang/cachegroup/cachegroups.go b/traffic_ops/traffic_ops_golang/cachegroup/cachegroups.go
index f5c1bf3..1ab8789 100644
--- a/traffic_ops/traffic_ops_golang/cachegroup/cachegroups.go
+++ b/traffic_ops/traffic_ops_golang/cachegroup/cachegroups.go
@@ -164,12 +164,19 @@ func (cg TOCacheGroup) Validate() error {
 	}
 
 	if cg.Fallbacks != nil {
+		isValid, err := cg.isAllowedToFallback(*cg.TypeID)
+		if err != nil {
+			return err
+		}
+		if !isValid {
+			return errors.New("the cache group " + *cg.Name + " is not allowed to have fallbacks.  It must be of type EDGE_LOC.")
+		}
+
 		for _, fallback := range *cg.Fallbacks {
-			isValid, err := cg.isValidCacheGroupFallback(fallback)
+			isValid, err = cg.isValidCacheGroupFallback(fallback)
 			if err != nil {
 				return err
 			}
-
 			if !isValid {
 				return errors.New("the cache group " + fallback + " is not valid as a fallback.  It must exist as a cache group and be of type EDGE_LOC.")
 			}
@@ -205,6 +212,11 @@ func (cg *TOCacheGroup) Create() (error, error, int) {
 		return nil, errors.New("cg create: creating coord:" + err.Error()), http.StatusInternalServerError
 	}
 
+	if cg.FallbackToClosest == nil {
+		fbc := true
+		cg.FallbackToClosest = &fbc
+	}
+
 	resultRows, err := cg.ReqInfo.Tx.Tx.Query(
 		insertQuery(),
 		cg.Name,
@@ -213,6 +225,7 @@ func (cg *TOCacheGroup) Create() (error, error, int) {
 		cg.TypeID,
 		cg.ParentCachegroupID,
 		cg.SecondaryParentCachegroupID,
+		cg.FallbackToClosest,
 	)
 	if err != nil {
 		return api.ParseDBError(err)
@@ -297,6 +310,23 @@ AND (type.name = 'EDGE_LOC')
 	return isValid, nil
 }
 
+func (cg *TOCacheGroup) isAllowedToFallback(cacheGroupType int) (bool, error) {
+	var isValid bool
+	query := `SELECT(
+SELECT type.name 
+FROM type 
+WHERE type.id = $1 
+AND (type.name = 'EDGE_LOC')
+) IS NOT NULL;`
+
+	err := cg.ReqInfo.Tx.Tx.QueryRow(query, cacheGroupType).Scan(&isValid)
+	if err != nil {
+		log.Errorf("received error: %++v from cachegroup fallback validation query execution", err)
+		return false, err
+	}
+	return isValid, nil
+}
+
 func (cg *TOCacheGroup) createCoordinate() (*int, error) {
 	var coordinateID *int
 	if cg.Latitude != nil && cg.Longitude != nil {
@@ -398,6 +428,7 @@ func (cg *TOCacheGroup) Read() ([]interface{}, error, error, int) {
 			&s.TypeID,
 			&s.LastUpdated,
 			pq.Array(&cgfs),
+			&s.FallbackToClosest,
 		); err != nil {
 			return nil, nil, errors.New("cg read: scanning: " + err.Error()), http.StatusInternalServerError
 		}
@@ -428,6 +459,7 @@ func (cg *TOCacheGroup) Update() (error, error, int) {
 		cg.ParentCachegroupID,
 		cg.SecondaryParentCachegroupID,
 		cg.TypeID,
+		cg.FallbackToClosest,
 		cg.ID,
 	)
 	if err != nil {
@@ -555,8 +587,9 @@ short_name,
 coordinate,
 type,
 parent_cachegroup_id,
-secondary_parent_cachegroup_id
-) VALUES($1,$2,$3,$4,$5,$6)
+secondary_parent_cachegroup_id,
+fallback_to_closest
+) VALUES($1,$2,$3,$4,$5,$6,$7)
 RETURNING id,last_updated`
 	return query
 }
@@ -581,7 +614,8 @@ cgs.name AS secondary_parent_cachegroup_name,
 type.name AS type_name,
 cachegroup.type AS type_id,
 cachegroup.last_updated,
-(SELECT coalesce(array_agg(CAST(cg2.name as text) ORDER BY cgf.set_order ASC), '{}') AS fallbacks FROM cachegroup cg2 INNER JOIN cachegroup_fallbacks cgf ON cgf.backup_cg = cg2.id WHERE cgf.primary_cg = cachegroup.id)
+(SELECT coalesce(array_agg(CAST(cg2.name as text) ORDER BY cgf.set_order ASC), '{}') AS fallbacks FROM cachegroup cg2 INNER JOIN cachegroup_fallbacks cgf ON cgf.backup_cg = cg2.id WHERE cgf.primary_cg = cachegroup.id),
+cachegroup.fallback_to_closest
 FROM cachegroup
 LEFT JOIN coordinate ON coordinate.id = cachegroup.coordinate
 INNER JOIN type ON cachegroup.type = type.id
@@ -590,6 +624,12 @@ LEFT JOIN cachegroup AS cgs ON cachegroup.secondary_parent_cachegroup_id = cgs.i
 	return query
 }
 
+// select type name so checks are based on name instead of id
+func selectTypeNameQuery() string {
+	query := `SELECT name FROM type WHERE id = $1;`
+	return query
+}
+
 // update query
 func updateQuery() string {
 	// to disambiguate struct scans, the named
@@ -602,7 +642,9 @@ short_name=$2,
 coordinate=$3,
 parent_cachegroup_id=$4,
 secondary_parent_cachegroup_id=$5,
-type=$6 WHERE id=$7 RETURNING last_updated`
+type=$6,
+fallback_to_closest=$7
+WHERE id=$8 RETURNING last_updated`
 	return query
 }
 
diff --git a/traffic_portal/app/src/app.js b/traffic_portal/app/src/app.js
index 0e0f5c9..7c2b4e4 100644
--- a/traffic_portal/app/src/app.js
+++ b/traffic_portal/app/src/app.js
@@ -400,6 +400,7 @@ var trafficPortal = angular.module('trafficPortal', [
 
         // directives
         require('./common/directives/match').name,
+        require('./common/directives/dragAndDrop').name,
 
         // services
         require('./common/service/application').name,
diff --git a/traffic_portal/app/src/common/directives/dragAndDrop/dragdropDirective.js b/traffic_portal/app/src/common/directives/dragAndDrop/dragdropDirective.js
new file mode 100644
index 0000000..d4d08c6
--- /dev/null
+++ b/traffic_portal/app/src/common/directives/dragAndDrop/dragdropDirective.js
@@ -0,0 +1,21 @@
+var DndEnable = function($compile) {
+    return {
+        restrict: 'A',  // use as an Attribute only
+        replace: false,
+        terminal: true, //this setting is crucial since I'm adding attributes that need to be compiled
+        priority: 1050, // "me first", ng-repeat priority is 1000
+        link: function(scope, element, attrs) {
+            if (attrs.dndEnable) { // if dnd-enable evaluates to true
+                if (attrs.pageid === 'cacheGroupFallback') {
+                    element.attr('dragsmart', 'handleDrag(fb)');
+                    element.attr('droppable', 'true');
+                    element.attr('drop', 'handleDrop(fb)');
+                }
+            }
+            element.removeAttr('dnd-enable'); // prevent infinite loop on compile
+            $compile(element)(scope);
+        }
+    };
+};
+
+module.exports = DndEnable;
\ No newline at end of file
diff --git a/traffic_portal/app/src/common/directives/dragAndDrop/droppableDirective.js b/traffic_portal/app/src/common/directives/dragAndDrop/droppableDirective.js
new file mode 100644
index 0000000..6712d3e
--- /dev/null
+++ b/traffic_portal/app/src/common/directives/dragAndDrop/droppableDirective.js
@@ -0,0 +1,129 @@
+var DroppableDirective = function () {
+    return {
+        scope: {
+            drop: '&',
+            dragsmart: '&',
+            bin: '='
+        },
+        link: function(scope, element) {
+            var el = element[0];
+
+            el.addEventListener(
+                'dragover',
+                function(e) {
+                    e.dataTransfer.dropEffect = 'move';
+                    // allows us to drop
+                    if (e.preventDefault) e.preventDefault();
+                    this.classList.add('over');
+                    var rect = e.target.getBoundingClientRect();
+                    var y = e.offsetY;
+                    if (y <= (rect.height / 2)) {
+                        if (e.target.classList.contains('drop-child')) {
+                            e.target.parentElement.style.borderTop = '2px solid red';
+                            e.target.parentElement.style.borderBottom = '';
+                        } else {
+                            e.target.style.borderTop = '2px solid red';
+                            e.target.style.borderBottom = '';
+                        }
+                        scope.$parent.$parent.moveAbove = true;
+                    } else {
+                        if (e.target.classList.contains('drop-child')) {
+                            e.target.parentElement.style.borderBottom = '2px solid red';
+                            e.target.parentElement.style.borderTop = '';
+                        } else {
+                            e.target.style.borderBottom = '2px solid red';
+                            e.target.style.borderTop = '';
+                        }
+                        scope.$parent.$parent.moveAbove = false;
+                    }
+                    return false;
+                },
+                false
+            );
+
+            el.addEventListener(
+                'dragenter',
+                function(e) {
+                    this.classList.add('over');
+                    if (e.preventDefault) e.preventDefault();
+                    return false;
+                },
+                false
+            );
+
+            el.addEventListener(
+                'dragleave',
+                function(e) {
+                    this.classList.remove('over');
+                    if (e.target.classList.contains('drop-child')) {
+                        e.target.parentElement.style.borderTop = '';
+                        e.target.parentElement.style.borderBottom = '';
+                    } else {
+                        e.target.style.borderTop = '';
+                        e.target.style.borderBottom = '';
+                    }
+                    return false;
+                },
+                false
+            );
+
+            el.addEventListener(
+                'drop',
+                function(e) {
+                    if (e.stopPropagation) e.stopPropagation();
+                    if (e.preventDefault) e.preventDefault(); // *needed* for firefox
+                    this.classList.remove('over');
+                    if (e.target.classList.contains('drop-child')) {
+                        e.target.parentElement.style.borderTop = '';
+                        e.target.parentElement.style.borderBottom = '';
+                    } else {
+                        e.target.style.borderTop = '';
+                        e.target.style.borderBottom = '';
+                    }
+                    var from = e.dataTransfer.getData("Text");
+                    if (from != this.textContent) { // ignore drop on self
+                        scope.$apply(function(scope) {
+                            var fn = scope.drop();
+                            if ('undefined' !== typeof fn) {
+                                fn();
+                            }
+                        });
+                    }
+                    return false;
+                },
+                false
+            );
+
+            el.draggable = true;
+
+            el.addEventListener(
+                'dragstart',
+                function (e) {
+                    if (e.stopPropagation) e.stopPropagation();
+                    e.dataTransfer.effectAllowed = 'move';
+                    e.dataTransfer.setData('Text',this.textContent);  // some value *required* for firefox; "Text" - not "text/plain" for IE
+                    this.classList.add('drag');
+                    scope.$apply(function (scope) {
+                        var fn = scope.dragsmart();
+                        if ('undefined' !== typeof fn) {
+                            fn();
+                        }
+                    });
+                    return false;
+                },
+                false
+            );
+
+            el.addEventListener(
+                'dragend',
+                function (e) {
+                    this.classList.remove('drag');
+                    return false;
+                },
+                false
+            );
+        }
+    };
+};
+
+module.exports = DroppableDirective;
\ No newline at end of file
diff --git a/traffic_portal/app/src/common/directives/dragAndDrop/index.js b/traffic_portal/app/src/common/directives/dragAndDrop/index.js
new file mode 100644
index 0000000..8e0c771
--- /dev/null
+++ b/traffic_portal/app/src/common/directives/dragAndDrop/index.js
@@ -0,0 +1,5 @@
+//application directives
+module.exports = angular.module('trafficPortal.directives.dragAndDrop',[])
+    .directive('dndEnable', require('./dragdropDirective'))
+    .directive('droppable', require('./droppableDirective'))
+;
\ No newline at end of file
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js b/traffic_portal/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
index 47537d6..9b61802 100644
--- a/traffic_portal/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
@@ -17,24 +17,16 @@
  * under the License.
  */
 
-var FormCacheGroupController = function(cacheGroup, $scope, $location, formUtils, locationUtils, cacheGroupService, typeService) {
+var FormCacheGroupController = function(cacheGroup, types, cacheGroups, $scope, $location, formUtils, locationUtils, cacheGroupService) {
 
-    var getCacheGroups = function() {
-        cacheGroupService.getCacheGroups({ orderby: 'name' })
-            .then(function(result) {
-                $scope.cacheGroups = result;
-            });
-    };
+    $scope.types = types;
 
-    var getTypes = function() {
-        typeService.getTypes({ useInTable: 'cachegroup' })
-            .then(function(result) {
-                $scope.types = result;
-            });
-    };
+    $scope.cacheGroups = cacheGroups;
 
     $scope.cacheGroup = cacheGroup;
 
+    $scope.cacheGroupFallbackUpdated = false;
+
     $scope.viewAsns = function() {
         $location.path($location.path() + '/asns');
     };
@@ -63,6 +55,10 @@ var FormCacheGroupController = function(cacheGroup, $scope, $location, formUtils
         GEO: false
     };
 
+    $scope.cacheGroupFallbackOptions = [];
+
+    $scope.selectedCacheGroupFallbackOptions = [];
+
     $scope.setLocalizationMethods = function(cacheGroup) {
         var methods = [];
         var keys = Object.keys($scope.localizationMethods);
@@ -90,14 +86,143 @@ var FormCacheGroupController = function(cacheGroup, $scope, $location, formUtils
         }
     };
 
+    var initCacheGroupFallbackGeo = function() {
+        if (cacheGroup.fallbackToClosest == null || cacheGroup.fallbackToClosest === '') {
+            cacheGroup.fallbackToClosest = true;
+        }
+    };
+
+    function CacheGroupFallbackOption(index, group) {
+        this.index = index;
+        this.group = group;
+    }
+
+    // Creates a list of available Fallback options and a list of previously selected Fallback options
+    $scope.getFallbackOptions = function() {
+        for (var i = 0; i < $scope.cacheGroups.length; i++) {
+            var cg = $scope.cacheGroups[i];
+            // Fallbacks are required to be of type EDGE_LOC and a cachegroup cannot fallback to itself so these are skipped and the loop is continued
+            if (!$scope.isEdgeLoc(cg.typeId) || cg.name == cacheGroup.name) continue;
+            var fb = new CacheGroupFallbackOption(i, $scope.cacheGroups[i].name);
+            // If the fallback has not been used yet, it is added to the list of available fallbacks
+            if (cacheGroup.fallbacks == null || cacheGroup.fallbacks.indexOf(cg.name) < 0) {
+                $scope.cacheGroupFallbackOptions.push(fb);
+            } else {
+                // If fallback has been selected previously then it is added to the list of selected fallbacks
+                $scope.selectedCacheGroupFallbackOptions.push(fb);
+            }
+        }
+    };
+
+    $scope.fallbackSelected = '';
+
+    $scope.draggedFallback = '';
+
+    $scope.droppedFallback = '';
+
+    $scope.moveAbove = true;
+
+    // Updates the list of already selected fallbacks and removes the newly selected fallback from the list of available fallbacks
+    $scope.updateFallbacks = function(cacheGroup) {
+        if (cacheGroup.fallbacks == null) {
+            cacheGroup.fallbacks = new Array();
+        }
+        // Add selected fallback to selected list if it is not already there
+        if (cacheGroup.fallbacks.indexOf($scope.fallbackSelected) === -1) {
+            cacheGroup.fallbacks.push($scope.fallbackSelected);
+        }
+        // Update list of available fallbacks so it does not include the newly selected fallback
+        for (var i = 0; i < $scope.cacheGroupFallbackOptions.length; i++) {
+            var fbo = $scope.cacheGroupFallbackOptions[i];
+            if (fbo.group === $scope.fallbackSelected) {
+                // Removes selected fallback from list of availables
+                $scope.cacheGroupFallbackOptions.splice($scope.cacheGroupFallbackOptions.indexOf(fbo), 1);
+                // Adds selected fallback to list of selected
+                $scope.selectedCacheGroupFallbackOptions.push(fbo);
+                break;
+            }
+        }
+        $scope.fallbackSelected = '';
+    };
+
+    $scope.updateForNewType = function() {
+        // removes Cache Group fallbacks if type has changed and is no longer EDGE_LOC
+        if (!$scope.isEdgeLoc(cacheGroup.typeId)) {
+            let currentFallbacksCount = cacheGroup.fallbacks.length;
+            for (var i = 0; i < currentFallbacksCount; i++) {
+                // removes fallbacks at position 0 since array is changing every loop
+                $scope.removeFallback(cacheGroup.fallbacks[0]);
+            }
+        }
+    };
+
+    $scope.save = function(cacheGroup) {
+        $scope.setLocalizationMethods(cacheGroup);
+        cacheGroupService.createCacheGroup(cacheGroup);
+        $scope.cacheGroupFallbackUpdated = false;
+    };
+
+    $scope.removeFallback = function(fb) {
+        cacheGroup.fallbacks.splice(cacheGroup.fallbacks.indexOf(fb), 1);
+        $scope.cacheGroupFallbackUpdated = true;
+        for (var i = 0; i < $scope.selectedCacheGroupFallbackOptions.length; i++) {
+            var fbo = $scope.selectedCacheGroupFallbackOptions[i];
+            if (fbo.group === fb) {
+                $scope.selectedCacheGroupFallbackOptions.splice($scope.selectedCacheGroupFallbackOptions.indexOf(fbo), 1);
+                for (var j = 0; j < $scope.cacheGroupFallbackOptions.length; j++) {
+                    if ($scope.cacheGroupFallbackOptions[j].index > fbo.index) {
+                        $scope.cacheGroupFallbackOptions.splice(j, 0, fbo);
+                        break;
+                    } else if (j === $scope.cacheGroupFallbackOptions.length - 1) {
+                        $scope.cacheGroupFallbackOptions.splice(j + 1, 0, fbo);
+                        break;
+                    }
+                }
+                break;
+            }
+        }
+    };
+
+    $scope.handleDrag = function(fb) {
+        $scope.draggedFallback = fb;
+    };
+
+    $scope.handleDrop = function(fb) {
+        $scope.droppedFallback = fb;
+        var draggedIndex = cacheGroup.fallbacks.indexOf($scope.draggedFallback);
+        var droppedIndex = cacheGroup.fallbacks.indexOf($scope.droppedFallback);
+        var newIndex = droppedIndex;
+        if (draggedIndex < droppedIndex) {
+            newIndex = droppedIndex - 1;
+        }
+        if (!$scope.moveAbove) {
+            newIndex = newIndex + 1;
+        }
+        cacheGroup.fallbacks.splice(draggedIndex, 1);
+        cacheGroup.fallbacks.splice(newIndex, 0, $scope.draggedFallback);
+        $scope.cacheGroupFallbackUpdated = true;
+    };
+
+    $scope.isEdgeLoc = function(id) {
+        var selectedType = '';
+        if ($scope.types != null) {
+            for (var i = 0; i < $scope.types.length; i++) {
+                if ($scope.types[i].id == id) {
+                    selectedType = $scope.types[i].name;
+                    break;
+                }
+            }
+        }
+        return selectedType == 'EDGE_LOC';
+    };
+
     var init = function () {
         initLocalizationMethods();
-        getCacheGroups();
-        getTypes();
+        $scope.getFallbackOptions();
+        initCacheGroupFallbackGeo();
     };
     init();
-
 };
 
-FormCacheGroupController.$inject = ['cacheGroup', '$scope', '$location', 'formUtils', 'locationUtils', 'cacheGroupService', 'typeService'];
+FormCacheGroupController.$inject = ['cacheGroup', 'types', 'cacheGroups', '$scope', '$location', 'formUtils', 'locationUtils', 'cacheGroupService', 'typeService'];
 module.exports = FormCacheGroupController;
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/_form.cacheGroup.scss b/traffic_portal/app/src/common/modules/form/cacheGroup/_form.cacheGroup.scss
new file mode 100644
index 0000000..6c2bae6
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/_form.cacheGroup.scss
@@ -0,0 +1,48 @@
+.allFallbacks{
+  margin-top: 10px;
+}
+
+.geoFallback {
+  padding-top: 8px;
+  padding-bottom: 20px;
+}
+
+.fallback {
+  border: 1px solid;
+  border-color: #ccc;
+  width: 100%;
+  height: 28px;
+  padding: 5px 8px;
+  font-size: 12px;
+  line-height: 1.428571429;
+  color: #555555;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+
+  &:hover {
+    background: rgba(38, 185, 154, 0.07);
+    border-top: 1px solid rgba(38, 185, 154, 0.11);
+    border-bottom: 1px solid rgba(38, 185, 154, 0.11);
+    cursor: move; cursor: -moz-grab; cursor: -webkit-grab; cursor: grab;
+  }
+}
+
+.fallback-grip {
+  float:left;
+  padding-top: 4px;
+  padding-right: 10px;
+}
+
+.fallback-list {
+  display:inline;
+  float:left;
+  width:90%;
+  align-items:center;
+}
+
+.fallback-delete {
+  display:inline-block;
+  float:right;
+  width:5%;
+}
\ No newline at end of file
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js b/traffic_portal/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
index d458b3c..b74ad05 100644
--- a/traffic_portal/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
@@ -17,10 +17,10 @@
  * under the License.
  */
 
-var FormEditCacheGroupController = function(cacheGroup, $scope, $controller, $uibModal, $anchorScroll, locationUtils, cacheGroupService) {
+var FormEditCacheGroupController = function(cacheGroup, types, cacheGroups, $scope, $controller, $uibModal, $anchorScroll, locationUtils, cacheGroupService) {
 
     // extends the FormCacheGroupController to inherit common methods
-    angular.extend(this, $controller('FormCacheGroupController', { cacheGroup: cacheGroup, $scope: $scope }));
+    angular.extend(this, $controller('FormCacheGroupController', { cacheGroup: cacheGroup, types: types, cacheGroups: cacheGroups, $scope: $scope }));
 
     $scope.cacheGroupName = angular.copy(cacheGroup.name);
 
@@ -127,5 +127,5 @@ var FormEditCacheGroupController = function(cacheGroup, $scope, $controller, $ui
 
 };
 
-FormEditCacheGroupController.$inject = ['cacheGroup', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'cacheGroupService'];
+FormEditCacheGroupController.$inject = ['cacheGroup', 'types', 'cacheGroups', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'cacheGroupService'];
 module.exports = FormEditCacheGroupController;
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html b/traffic_portal/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
index 39e4687..469c244 100644
--- a/traffic_portal/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
@@ -75,7 +75,7 @@ under the License.
             <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.type), 'has-feedback': hasError(cacheGroupForm.type)}">
                 <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select name="type" class="form-control" ng-model="cacheGroup.typeId" ng-options="type.id as type.name for type in types" required>
+                    <select name="type" class="form-control" ng-model="cacheGroup.typeId" ng-options="type.id as type.name for type in types" ng-change="updateForNewType()" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.type, 'required')">Required</small>
@@ -128,10 +128,29 @@ under the License.
                     <input type="checkbox" name="GeoEnabled" ng-model="localizationMethods.GEO"> Geo-IP Database</input>
                 </div>
             </div>
+            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.fallbacks), 'has-feedback': hasError(cacheGroupForm.fallbacks)}" ng-hide="!isEdgeLoc(cacheGroup.typeId)">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Failover Cache Groups</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select name="fallbackOptions" class="form-control" ng-model="fallbackSelected" ng-options="cachegroup.group as cachegroup.group for cachegroup in cacheGroupFallbackOptions" ng-change="updateFallbacks(cacheGroup)">
+                        <option value="">Add Failover Cache Group...</option>
+                    </select>
+                    <div class="allFallbacks" id="allFallbacks">
+                        <div class="fallback" ng-repeat="fb in cacheGroup.fallbacks" dnd-enable="true" pageid="cacheGroupFallback">
+                            <i class="fa fa-ellipsis-v fallback-grip drop-child" aria-hidden="true"></i>
+                            <div class="fallback-list drop-child">{{ $index + 1 }}.&nbsp&nbsp&nbsp&nbsp&nbsp{{fb}}</div>
+                            <div class="fallback-delete drop-child fa fa-trash-o" align="right" ng-click="removeFallback(fb)">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="geoFallback">
+                        <input type="checkbox" ng-model="cacheGroup.fallbackToClosest"> Fallback to Geo Failover</input>
+                    </div>
+                </div>
+            </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(cacheGroup)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="cacheGroupForm.$pristine || cacheGroupForm.$invalid" ng-click="save(cacheGroup)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-success" ng-disabled="(cacheGroupForm.$pristine || cacheGroupForm.$invalid) && !cacheGroupFallbackUpdated" ng-click="save(cacheGroup)">{{settings.saveLabel}}</button>
             </div>
         </form>
     </div>
-</div>
+</div>
\ No newline at end of file
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js b/traffic_portal/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
index 98bf564..8d34630 100644
--- a/traffic_portal/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
@@ -17,10 +17,10 @@
  * under the License.
  */
 
-var FormNewCacheGroupController = function(cacheGroup, $scope, $controller, cacheGroupService) {
+var FormNewCacheGroupController = function(cacheGroup, types, cacheGroups, $scope, $controller, cacheGroupService) {
 
     // extends the FormCacheGroupController to inherit common methods
-    angular.extend(this, $controller('FormCacheGroupController', { cacheGroup: cacheGroup, $scope: $scope }));
+    angular.extend(this, $controller('FormCacheGroupController', { cacheGroup: cacheGroup, types: types, cacheGroups: cacheGroups, $scope: $scope }));
 
     $scope.cacheGroupName = 'New';
 
@@ -36,5 +36,5 @@ var FormNewCacheGroupController = function(cacheGroup, $scope, $controller, cach
 
 };
 
-FormNewCacheGroupController.$inject = ['cacheGroup', '$scope', '$controller', 'cacheGroupService'];
+FormNewCacheGroupController.$inject = ['cacheGroup', 'types', 'cacheGroups', '$scope', '$controller', 'cacheGroupService'];
 module.exports = FormNewCacheGroupController;
diff --git a/traffic_portal/app/src/modules/private/cacheGroups/edit/index.js b/traffic_portal/app/src/modules/private/cacheGroups/edit/index.js
index b20f8ed..0453ceb 100644
--- a/traffic_portal/app/src/modules/private/cacheGroups/edit/index.js
+++ b/traffic_portal/app/src/modules/private/cacheGroups/edit/index.js
@@ -29,6 +29,12 @@ module.exports = angular.module('trafficPortal.private.cacheGroups.edit', [])
                         resolve: {
                             cacheGroup: function($stateParams, cacheGroupService) {
                                 return cacheGroupService.getCacheGroup($stateParams.cacheGroupId);
+                            },
+                            types: function(typeService) {
+                                return typeService.getTypes({ useInTable: 'cachegroup' });
+                            },
+                            cacheGroups: function(cacheGroupService) {
+                                return cacheGroupService.getCacheGroups({ orderby: 'name' });
                             }
                         }
                     }
diff --git a/traffic_portal/app/src/modules/private/cacheGroups/new/index.js b/traffic_portal/app/src/modules/private/cacheGroups/new/index.js
index 2a8a03a..9de26a2 100644
--- a/traffic_portal/app/src/modules/private/cacheGroups/new/index.js
+++ b/traffic_portal/app/src/modules/private/cacheGroups/new/index.js
@@ -29,6 +29,12 @@ module.exports = angular.module('trafficPortal.private.cacheGroups.new', [])
                         resolve: {
                             cacheGroup: function() {
                                 return {};
+                            },
+                            types: function(typeService) {
+                                return typeService.getTypes({ useInTable: 'cachegroup' });
+                            },
+                            cacheGroups: function(cacheGroupService) {
+                                return cacheGroupService.getCacheGroups({ orderby: 'name' });
                             }
                         }
                     }
diff --git a/traffic_portal/app/src/styles/main.scss b/traffic_portal/app/src/styles/main.scss
index 834f203..d860e59 100755
--- a/traffic_portal/app/src/styles/main.scss
+++ b/traffic_portal/app/src/styles/main.scss
@@ -30,6 +30,7 @@ $fa-font-path: "../assets/fonts";
 @import "../common/modules/dialog/import/dialog.import";
 @import "../common/modules/dialog/text/dialog.text";
 @import "../common/modules/header/header";
+@import "../common/modules/form/cacheGroup/form.cacheGroup";
 @import "../common/modules/form/form";
 @import "../common/modules/message/message";
 @import "../common/modules/navigation/navigation";