You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficcontrol.apache.org by GitBox <gi...@apache.org> on 2018/02/21 18:27:28 UTC

[GitHub] dewrich closed pull request #1893: DS Requests

dewrich closed pull request #1893: DS Requests
URL: https://github.com/apache/incubator-trafficcontrol/pull/1893
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/docs/source/admin/quick_howto/ds_requests.rst b/docs/source/admin/quick_howto/ds_requests.rst
new file mode 100644
index 0000000000..997935e793
--- /dev/null
+++ b/docs/source/admin/quick_howto/ds_requests.rst
@@ -0,0 +1,81 @@
+..
+..
+.. Licensed under the Apache License, Version 2.0 (the "License");
+.. you may not use this file except in compliance with the License.
+.. You may obtain a copy of the License at
+..
+..     http://www.apache.org/licenses/LICENSE-2.0
+..
+.. Unless required by applicable law or agreed to in writing, software
+.. distributed under the License is distributed on an "AS IS" BASIS,
+.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+.. See the License for the specific language governing permissions and
+.. limitations under the License.
+..
+
+.. _ds_requests:
+
+Delivery Service Requests
+=========================
+
+When enabled in traffic_portal_properties.json, delivery service requests are created when ALL users attempt to create, update or delete a delivery service.
+This allows users with higher level permissions (ops or admin) to review the changes for completeness and accuracy before deploying the changes.
+In addition, most delivery service changes require cache config updates (aka queue updates) and/or a cdn snapshot. Both of these actions are reserved for users with elevated permissions.
+
+A list of the delivery service requests associated with your tenant can be found here:
+
+``https://traffic-portal.domain.com/#!/delivery-service-requests``
+
+.. image:: ../traffic_portal/images/tp_table_ds_requests.png
+
+Who Can Create a Delivery Service Request and How?
+##################################################
+
+Users with the Portal role (or above) can create delivery service requests by doing one of three things:
+
+1. Creating a new delivery service
+2. Updating an existing delivery service
+3. Deleting an exiting delivery service
+
+By performing one of these actions, a delivery service request will be created for you with a status of draft or submitted. You determine the status of your request. Only change the status of your request to submitted once the request is ready for review and deployment.
+
+Who Can Fulfill a Delivery Service Request and How?
+###################################################
+
+Users with elevated permissions (Operations or above) can fulfill (apply the changes) or reject the delivery service request. In fact, they can do all of the following:
+
+Update the contents of the delivery service request
+***************************************************
+
+Optional. This will update the "Last Edited By" field to indicate who last updated the request.
+
+Assign or unassign the delivery service request
+***********************************************
+
+Optional. Assignment is currently limited to current user. This is optional as fulfillment will auto-assign the request to the user doing the fulfillment.
+
+Reject the delivery service request
+***********************************
+
+Rejecting a delivery service request will set status to ``rejected`` and the request can no longer be modified. This will auto-assign the request to the user doing the rejection.
+
+Fulfill the delivery service request
+************************************
+
+Fulfilling a delivery service request will show the requested changes and, once committed, will apply the desired changes and set status to ``pending``. The request is pending because many types of changes will require cache config updates (aka queue updates) and/or a cdn snapshot. Once queue updates and/or cdn snapshot is complete, the request should be marked ``complete``.
+
+Complete the delivery service request
+*************************************
+
+Only after the delivery service request has been fulfilled and the changes have been applied can a delivery service request be marked as complete. Marking a delivery service as complete is currently a manual step because some changes require cache config updates (aka queue updates) and/or a cdn snapshot.
+Once that is done and the changes have been deployed, the request status should be changed from ``pending`` to ``complete``.
+
+
+Delete the delivery service request
+***********************************
+
+Delivery service requests with a status of draft or submitted can always be deleted entirely if appropriate.
+
+
+
+
diff --git a/docs/source/admin/quick_howto/index.rst b/docs/source/admin/quick_howto/index.rst
index 96f098fd28..d04a019892 100644
--- a/docs/source/admin/quick_howto/index.rst
+++ b/docs/source/admin/quick_howto/index.rst
@@ -18,11 +18,25 @@ Quick How To Guides
 
 Traffic Control is a complicated system, and documenting it is not trivial. Sometimes a picture says more than a thousand words, so here are some screen shot based tutorials on how to use some of the more involved features.
 
+Traffic Ops
+===========
+
 .. toctree::
-  :maxdepth: 3
 
   multi_site.rst
   dnssec.rst
   federations.rst
   regionalgeo.rst
   steering.rst
+
+Traffic Portal
+==============
+
+.. toctree::
+
+  ds_requests.rst
+
+
+
+
+
diff --git a/docs/source/admin/traffic_ops/using.rst b/docs/source/admin/traffic_ops/using.rst
index e8f68eac58..b5849753ec 100644
--- a/docs/source/admin/traffic_ops/using.rst
+++ b/docs/source/admin/traffic_ops/using.rst
@@ -291,138 +291,130 @@ Delivery Service
 ================
 The fields in the Delivery Service view are:
 
-.. Sorry for the width of this table, don't know how to make the bullet lists work otherwise. Just set your monitor to 2560*1600, and put on your glasses.
-
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|                  Name                 |                                                                                                    Description                                                                                                    |
-+=======================================+===================================================================================================================================================================================================================+
-| Active                                | When this is set to false Traffic Router will not serve DNS or HTTP responses for this delivery service.                                                                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Cache URL expression                  | Cache URL rule to apply to this delivery service. See `ATS documentation on cacheurl <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/cacheurl.en.html>`_. [1]_                               |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| CDN                                   | The CDN in which the delivery service belongs to.                                                                                                                                                                 |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Check Path                            | A path (ex: /crossdomain.xml) to verify the connection to the origin server with. This can be used by Check Extension scripts to do periodic health checks against the delivery service.                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Content Routing Type                  | The type of content routing this delivery service will use. See :ref:`rl-ds-types`.                                                                                                                               |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Deep Caching                          | (for HTTP routed delivery services only) When to do deep caching for this delivery service (see :ref:`Deep Caching <rl-deep-cache>` for more details):                                                            |
-|                                       |                                                                                                                                                                                                                   |
-|                                       | - NEVER                                                                                                                                                                                                           |
-|                                       | - ALWAYS                                                                                                                                                                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Delivery Service DNS TTL              | The Time To Live on the DNS record for the Traffic Router A and AAAA records (``<routing-name>.<deliveryservice>.<cdn-domain>``).                                                                                 |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Delivery Servics URLs                 | (Read Only) An example of how the delivery URL may start. This could be multiple rows if multiple HOST_REGEXP entries have been entered.                                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Display Name                          | A human-readable name for the delivery service.                                                                                                                                                                   |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNS Bypass CNAME                      | (For DNS routed delivery services only) This is a CNAME to respond to DNS requests with when a Delivery Service is unavailable.                                                                                   |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNS Bypass Ip                         | (For DNS routed delivery services only) This is the address to respond to A requests with when the max Bps or Max Tps for this delivery service are exceeded.                                                     |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNS Bypass IPv6                       | (For DNS routed delivery services only) This is the address to respond to AAAA requests with when the max Bps or Max Tps for this delivery service are exceeded.                                                  |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNS Bypass TTL                        | (For DNS routed delivery services only) This is the TTL to use for DNS Bypass responses when a delivery service is unavailable.                                                                                   |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DSCP Tag                              | The DSCP value to mark IP packets to the client with.                                                                                                                                                             |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Edge Header Rewrite Rules             | Header Rewrite rules to apply for this delivery service at the EDGE tier. See :ref:`rl-header-rewrite`. [1]_                                                                                                      |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Limit?                            | Some services are intended to be limited by geography. The possible settings are are:                                                                                                                             |
-|                                       |                                                                                                                                                                                                                   |
-|                                       | - None - Do not limit by geography.                                                                                                                                                                               |
-|                                       | - CZF only - If the requesting IP is not in the Coverage Zone File, do not serve the request.                                                                                                                     |
-|                                       | - CZF + US - If the requesting IP is not in the Coverage Zone File or not in the United States, do not serve the request.                                                                                         |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Limit Redirect URL                | (for HTTP routed delivery services only) This is the URL Traffic Router will redirect to when Geo Limit Failure. See :ref:`rl-tr-ngb`                                                                             |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Limit Countries                   | A comma delimited list of Country Codes that will be allowed to make requests from the Delivery Service                                                                                                           |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Miss Default Latitude             | Default Latitude for this delivery service. When client localization fails for both Coverage Zone and Geo Lookup, the client will be routed as if it was at this lat.                                             |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Miss Default Longitude            | Default Longitude for this delivery service. When client localization fails for both Coverage Zone and Geo Lookup, the client will be routed as if it was at this long.                                           |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geolocation Provider                  | An ordered list of Geolocation Providers to be used in make geo location decisions.                                                                                                                               |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Global Max Mbps                       | The maximum bits per second this delivery service can serve across all EDGE caches before traffic will be diverted to the bypass destination. For a DNS delivery service, the Bypass Ipv4 or Ipv6  will be used   |
-|                                       | (depending on whether this was a A or AAAA request), and for HTTP delivery services the Bypass FQDN will be used.                                                                                                 |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Global Max TPS                        | The maximum transactions this delivery service can serve across all EDGE caches before traffic will be diverted to the bypass destination. For a DNS delivery service, the Bypass Ipv4 or Ipv6  will be used      |
-|                                       | (depending on whether this was a A or AAAA request), and for HTTP delivery services the Bypass FQDN will be used.                                                                                                 |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| HTTP Bypass FQDN                      | (for HTTP routed delivery services only) This is the FQDN Traffic Router will redirect to (with the same path) when the max Bps or Max Tps for this deliveryservice are exceeded.                                 |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Info URL                              | Info URL  for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                                   |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Initial Dispersion                    | For HTTP delivery services - the number of caches that will be used by Traffic Router.  Traffic Router will consistently return the same caches as long as they are healthy.                                      |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| IPv6 Routing Enabled                  | When set to yes, the Traffic Router will respond to AAAA DNS requests for the routed name of this delivery service. Otherwise, only A records will be served.                                                     |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Key (XML ID)                          | A unique string that identifies this delivery service.                                                                                                                                                            |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Logs Enabled?                         | Whether or not Traffic Logs is enabled for the delivery service.  This feature is currently incomplete without Traffic Logs                                                                                       |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Long Description                      | Long description for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                            |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Long Description 2                    | Another Long Description                                                                                                                                                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Long Description 3                    | Another Long Description                                                                                                                                                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Max DNS Answers                       | For DNS delivery services - the max number of DNS answers that will be returned by Traffic Router.                                                                                                                |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Mid Header Rewrite Rules              | Header Rewrite rules to apply for this delivery service at the MID tier. See :ref:`rl-header-rewrite`. [1]_                                                                                                       |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Multi Site Origin                     | Enable the Multi Site Origin feature for this delivery service. See :ref:`rl-multi-site-origin`                                                                                                                   |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Origin Server Base URL                | The Origin Server's base URL. This includes the protocol (http or https). Example: ``http://movies.origin.com``                                                                                                   |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Origin Shield (Pipe Delimited String) | Origin Shield string.                                                                                                                                                                                             |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Profile                               | The profile for this delivery service.                                                                                                                                                                            |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Protocol                              | The protocol to serve this delivery service to the clients with:                                                                                                                                                  |
-|                                       |                                                                                                                                                                                                                   |
-|                                       | -  0 http                                                                                                                                                                                                         |
-|                                       | -  1 https                                                                                                                                                                                                        |
-|                                       | -  2 both http and https                                                                                                                                                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Query String Handling                 | How to treat query strings:                                                                                                                                                                                       |
-|                                       |                                                                                                                                                                                                                   |
-|                                       | - 0 use in cache key and hand up to origin - this means each unique query string is treated as a unique URL.                                                                                                      |
-|                                       | - 1 Do not use in cache key, but pass up to origin - this means 2 URLs that are the same except for the query string will match, and cache HIT, while the origin still sees original query string in the request. |
-|                                       | - 2 Drop at edge - this means 2 URLs that are the same except for  the query string will match, and cache HIT, while the origin will not see original query string in the request.                                |
-|                                       |                                                                                                                                                                                                                   |
-|                                       | **Note:** Choosing to drop query strings at the edge will preclude the use of a Regex Remap Expression. See :ref:`rl-regex-remap`.                                                                                |
-|                                       | To set the qstring without the use of regex remap, or for further options, see :ref:`rl-qstring-handling`.                                                                                                        |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Range Request Handling                | How to treat range requests:                                                                                                                                                                                      |
-|                                       |                                                                                                                                                                                                                   |
-|                                       | - 0 Do not cache (ranges requested from files that are already cached due to a non range request will be a HIT)                                                                                                   |
-|                                       | - 1 Use the `background_fetch <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/background_fetch.en.html>`_ plugin.                                                                            |
-|                                       | - 2 Use the cache_range_requests plugin.                                                                                                                                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Raw Remap Text                        | For HTTP and DNS deliveryservices, this will get added to the end of the remap line on the cache verbatim. For ANY_MAP deliveryservices this is the remap line. [1]_                                              |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Regex Remap Expression                | Regex Remap rule to apply to this delivery service at the Edge tier. See `ATS documentation on regex_remap <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/regex_remap.en.html>`_. [1]_      |
-|                                       |                                                                                                                                                                                                                   |
-|                                       | **Note:** you will not be able to save a Regex Remap Expression if you have Query String Handling set to drop query strings at the edge. See :ref:`rl-regex-remap`.                                               |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Regional Geo-Blocking                 | `See documentation here <../quick_howto/regionalgeo.html>`_                                                                                                                                                       |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Routing Name                          | The routing name to use for the delivery FQDN, i.e. ``<routing-name>.<deliveryservice>.<cdn-domain>``. It must be a valid hostname without periods. [2]_                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Signing Algorithm                     |                                                                                                                                                                                                                   |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| SSL Key Version                       | The most recent version for SSL keys, this is incremented each time new certificates or generated or pasted in traffic ops                                                                                        |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Tenant                                | By selecting a tenant for the delivery service, you restrict access of that delivery service to only those users that belong to the same tenant or a parent tenant.                                               |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Traffic Router Request Headers        | Additional request header to be logged by Traffic Router                                                                                                                                                          |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Traffic Router Response Headers       | Reponse headers to be returned by Traffic Router for each request                                                                                                                                                 |
-+---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|                       Name                       |                                                                                                     Description                                                                                                     |
++==================================================+=====================================================================================================================================================================================================================+
+| Active                                           | When this is set to no Traffic Router will not serve DNS or HTTP responses for this delivery service.                                                                                                               |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Content Routing Type                             | The type of content routing this delivery service will use. See :ref:`rl-ds-types`.                                                                                                                                 |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Key(XML ID)                                      | A unique string that identifies this delivery service.                                                                                                                                                              |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Display Name                                     | Delivery Service Name.                                                                                                                                                                                              |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Tenant                                           | Dropdown to choose the appropriate tenant for your delivery service.                                                                                                                                                |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| CDN                                              | Dropdown to choose the CDN that the delivery service will use.                                                                                                                                                      |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Origin Server Base URL                           | The Origin Server's base URL. This includes the protocol (http or https). Example: ``http://movies.origin.com``                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Protocol                                         | The protocol to serve this delivery service to the clients with:                                                                                                                                                    |
+|                                                  |                                                                                                                                                                                                                     |
+|                                                  | -  0 http                                                                                                                                                                                                           |
+|                                                  | -  1 https                                                                                                                                                                                                          |
+|                                                  | -  2 both http and https                                                                                                                                                                                            |
+|                                                  | -  3 http to https                                                                                                                                                                                                  |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Long Description                                 | Long description for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                              |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Delivery Service URLs                            | List of URLs derived from Protocol + Routing Name + XML ID + CDN Domain                                                                                                                                             |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **Advanced**                                     |                                                                                                                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Routing Name                                     | The routing name to use for the delivery FQDN, i.e. ``<routing-name>.<deliveryservice>.<cdn-domain>``. It must be a valid hostname without periods. [2]_                                                            |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| DSCP Tag                                         | The DSCP value to mark IP packets to the client with.                                                                                                                                                               |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| IPv6 Routing Enabled?                            | When set to yes, the Traffic Router will respond to AAAA DNS requests for the routed name of this delivery service. Otherwise, only A records will be served.                                                       |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Range Request Handling                           | (experimental)  How to treat range requests:                                                                                                                                                                        |
+|                                                  |                                                                                                                                                                                                                     |
+|                                                  | - 0 Do not cache (ranges requested from files taht are already cached due to a non range request will be a HIT)                                                                                                     |
+|                                                  | - 1 Use the `background_fetch <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/background_fetch.en.html>`_ plugin.                                                                              |
+|                                                  | - 2 Use the cache_range_requests plugin.                                                                                                                                                                            |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Query String Handling                            | How to treat query strings:                                                                                                                                                                                         |
+|                                                  |                                                                                                                                                                                                                     |
+|                                                  | - 0 use in cache key and hand up to origin -this means each unique query string Is treated as a unique URL.                                                                                                         |
+|                                                  | - 1 Do not use in cache key, but pass up to origin - this means a 2 URLs that are the same except for the query string will match, and cache HIT, while the origin still sees original query string in the request. |
+|                                                  | - 2 Drop at edge - this means a 2 URLs that are the same except for  the query string will match, and cache HIT, while the origin will not see original query string in the request.                                |
+|                                                  |                                                                                                                                                                                                                     |
+|                                                  | **Note:** Choosing to drop query strings at the edge will preclude the use of a Regex Remap Expression. See :ref:`rl-regex-remap`.                                                                                  |
+|                                                  | To set the qstring without the use of regex remap, or for further options, see :ref:`rl-qstring-handling`.                                                                                                          |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Use Multi Site Origin Feature                    | Enable the Multi Site Origin feature for this delivery service. See :ref:`rl-multi-site-origin`                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Logs Enabled                                     |                                                                                                                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Geo Provider                                     | ip geolocation provider                                                                                                                                                                                             |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Geo Miss Default Latitude                        | Default Latitude for this delivery service. When client localization fails for both Coverage Zone and Geo Lookup, this the client will be routed as if it was at this lat.                                          |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Geo Miss Default Longitude                       | Default Longitude for this delivery service. When client localization fails for bot Coverage Zone and Geo Lookup, this the client will be routed as if it was at this long.                                         |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Geo Limit?                                       | Some services are intended to be limited by geography. The possible settings are are:                                                                                                                               |
+|                                                  |                                                                                                                                                                                                                     |
+|                                                  | - None - Do not limit by geography.                                                                                                                                                                                 |
+|                                                  | - CZF only - If the requesting IP is not in the Coverage Zone File, do not serve the request.                                                                                                                       |
+|                                                  | - CZF + US - If the requesting IP is not in the Coverage Zone File or not in the United States, do not serve the request.                                                                                           |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Geo Limit Countries                              | (for HTTP routed delivery services only) Do not serve the request to specific countries.                                                                                                                            |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Geo Limit Redirect URL                           | (for HTTP routed delivery services only) This is the URL Traffic Router will redirect to when Geo Limit Failure. See :ref:`rl-tr-ngb`                                                                               |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Signing Algorithm                                | See :ref:`rl-signed-urls`.                                                                                                                                                                                          |
+|                                                  | None                                                                                                                                                                                                                |
+|                                                  | URL Signature Keys                                                                                                                                                                                                  |
+|                                                  | URI Signing Keys                                                                                                                                                                                                    |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Bypass Ipv4                                      | (For DNS routed delivery services only) This is the address to respond to A requests with when the the max Bps or Max Tps for this delivery service are exceeded.                                                   |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Bypass IPv6                                      | (For DNS routed delivery services only) This is the address to respond to AAAA requests with when the the max Bps or Max Tps for this delivery service are exceeded.                                                |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| DNS Bypass Cname                                 |                                                                                                                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| DNS Bypass TTL                                   |                                                                                                                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Max DNS Answers                                  |                                                                                                                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Delivery Service DNS TTL                         | The Time To Live on the DNS record for the Traffic Router A and AAAA records (``<routing-name>.<deliveryservice>.<cdn-domain>``).                                                                                   |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Delivery Service Profile                         | The profile for this delivery service.                                                                                                                                                                              |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Global Max Mbps                                  | The maximum bits per second this delivery service can serve across all EDGE caches before traffic will be diverted to the bypass destination. For a DNS delivery service, the Bypass Ipv4 or Ipv6  will be used     |
+|                                                  | (depending on whether this was a A or AAAA request), and for HTTP delivery services the Bypass FQDN will be used.                                                                                                   |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Global Max TPS                                   | The maximum transactions per se this delivery service can serve across all EDGE caches before traffic will be diverted to the bypass destination. For a DNS delivery service, the Bypass Ipv4 or Ipv6  will be used |
+|                                                  | (depending on whether this was a A or AAAA request), and for HTTP delivery services the Bypass FQDN will be used.                                                                                                   |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Signed URLs                                      | Use Signed URLs? See :ref:`rl-signed-urls`.                                                                                                                                                                         |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Edge Header Rewrite Rules                        | Header Rewrite rules to apply for this delivery service at the EDGE tier. See :ref:`rl-header-rewrite`. [1]_                                                                                                        |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Mid Header Rewrite Rules                         | Header Rewrite rules to apply for this delivery service at the MID tier. See :ref:`rl-header-rewrite`. [1]_                                                                                                         |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Traffic Router Additional Response Headers       |                                                                                                                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Traffic Router Log Request Headers               |                                                                                                                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Regex Remap Expression                           | Regex Remap rule to apply to this delivery service at the Edge tier. See `ATS documentation on regex_remap <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/regex_remap.en.html>`_. [1]_        |
+|                                                  |                                                                                                                                                                                                                     |
+|                                                  | **Note:** you will not be able to save a Regex Remap Expression if you have Query String Handling set to drop query strings at the edge. See :ref:`rl-regex-remap`.                                                 |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Cache URL expression                             | Cache URL rule to apply to this delivery service. See `ATS documentation on cacheurl <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/cacheurl.en.html>`_. [1]_                                 |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Raw remap text                                   | For HTTP and DNS deliveryservices, this will get added to the end of the remap line on the cache verbatim. For ANY_MAP deliveryservices this is the remap line. [1]_                                                |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Long Description 2                               | Customer description for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                          |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Long Description 3                               | Service description for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                           |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Info URL                                         | Info URL  for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                                     |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Check Path                                       | A path (ex: /crossdomain.xml) to verify the connection to the origin server with. This can be used by Check Extension scripts to do periodic health checks against the delivery service.                            |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Origin Shield (Pipe Delimited String)            | Experimental. Origin Shield string.                                                                                                                                                                                 |
++--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
 .. [1] These fields are not validated by Traffic Ops to be correct syntactically, and can cause Traffic Server to not start if invalid. Please use with caution.
 .. [2] It is not recommended to change the Routing Name of a Delivery Service after deployment because this changes its Delivery FQDN (i.e. ``<routing-name>.<deliveryservice>.<cdn-domain>``), which means that SSL certificates may need to be updated and clients using the Delivery Service will need to be transitioned to the new Delivery URL.
@@ -466,8 +458,7 @@ One of the most important settings when creating the delivery service is the sel
 | CLIENT_STEERING | Simliar to STEERING except that a client can send a request to Traffic Router with a query param of `trred=false` and Traffic Router will return a HTTP 200 reponse with a body that contians a list of Delivery Service URLs that the client connect to.  Therefore the client is doing the steering, not the Traffic Router. |
 +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
-
-.. Note:: Once created, the Traffic Ops user interface does not allow you to change the delivery service type; the drop down is greyed out. There are many things that can go wrong when changing the type, and it is safer to delete the delivery service, and recreate it.
+.. _rl-federations:
 
 Federations
 +++++++++++
diff --git a/docs/source/admin/traffic_portal/images/tp_menu.png b/docs/source/admin/traffic_portal/images/tp_menu.png
new file mode 100644
index 0000000000..79d8d74a4e
Binary files /dev/null and b/docs/source/admin/traffic_portal/images/tp_menu.png differ
diff --git a/docs/source/admin/traffic_portal/images/tp_menu_admin.png b/docs/source/admin/traffic_portal/images/tp_menu_admin.png
new file mode 100644
index 0000000000..fdb5b1f996
Binary files /dev/null and b/docs/source/admin/traffic_portal/images/tp_menu_admin.png differ
diff --git a/docs/source/admin/traffic_portal/images/tp_menu_monitor.png b/docs/source/admin/traffic_portal/images/tp_menu_monitor.png
new file mode 100644
index 0000000000..1dab37df2a
Binary files /dev/null and b/docs/source/admin/traffic_portal/images/tp_menu_monitor.png differ
diff --git a/docs/source/admin/traffic_portal/images/tp_menu_other.png b/docs/source/admin/traffic_portal/images/tp_menu_other.png
new file mode 100644
index 0000000000..d0c29b254c
Binary files /dev/null and b/docs/source/admin/traffic_portal/images/tp_menu_other.png differ
diff --git a/docs/source/admin/traffic_portal/images/tp_menu_services.png b/docs/source/admin/traffic_portal/images/tp_menu_services.png
new file mode 100644
index 0000000000..d887b16e0c
Binary files /dev/null and b/docs/source/admin/traffic_portal/images/tp_menu_services.png differ
diff --git a/docs/source/admin/traffic_portal/images/tp_menu_tools.png b/docs/source/admin/traffic_portal/images/tp_menu_tools.png
new file mode 100644
index 0000000000..301109a145
Binary files /dev/null and b/docs/source/admin/traffic_portal/images/tp_menu_tools.png differ
diff --git a/docs/source/admin/traffic_portal/images/tp_table_ds_requests.png b/docs/source/admin/traffic_portal/images/tp_table_ds_requests.png
new file mode 100644
index 0000000000..ae4ed39885
Binary files /dev/null and b/docs/source/admin/traffic_portal/images/tp_table_ds_requests.png differ
diff --git a/docs/source/admin/traffic_portal/tp_bottom_menu.png b/docs/source/admin/traffic_portal/tp_bottom_menu.png
deleted file mode 100644
index 7733d2724e..0000000000
Binary files a/docs/source/admin/traffic_portal/tp_bottom_menu.png and /dev/null differ
diff --git a/docs/source/admin/traffic_portal/tp_menu.png b/docs/source/admin/traffic_portal/tp_menu.png
deleted file mode 100644
index 9ff46a4ae0..0000000000
Binary files a/docs/source/admin/traffic_portal/tp_menu.png and /dev/null differ
diff --git a/docs/source/admin/traffic_portal/usingtrafficportal.rst b/docs/source/admin/traffic_portal/usingtrafficportal.rst
index 9e9a566b73..5bbf079f5c 100644
--- a/docs/source/admin/traffic_portal/usingtrafficportal.rst
+++ b/docs/source/admin/traffic_portal/usingtrafficportal.rst
@@ -24,132 +24,96 @@
 Traffic Portal - Using
 %%%%%%%%%%%%%%%%%%%%%%
 
+Traffic Portal is the official replacement for the legacy Traffic Ops UI. Traffic Portal consumes the Traffic Ops API. The following high-level items are available in the Traffic Portal menu.
 
-Traffic portal Menu
-===================
-
-.. image:: ./tp_menu.png
-
-Traffic Portal is a replacement for the Traffic Ops UI. The following tabs are available in the Traffic Portal Menu.
+.. image:: ./images/tp_menu.png
 
 .. index::
   Monitor
 
 * **Monitor**
 
-  Information on the health of the system. Click the Monitor tab to get to the following options:
-
   +---------------+------------------------------------------------------------------------------------------------------------------------------------+
   |     Option    |                                                            Description                                                             |
   +===============+====================================================================================================================================+
   | Dashboard     | A real time view into the main performance indicators of the CDNs managed by Traffic Control.                                      |
-  |               | This view is sourced directly by the Traffic Monitor data and is updated every 10 seconds.                                         |
-  |               | This is the default screen of Traffic Portal.                                                                                      |
+  |               | Each component of this view is updated at the intervals defined in tp.domain.com/traffic_portal_properties.json.                   |
+  |               | Upon successful login, this is the default landing page of Traffic Portal.                                                         |
   |               | See :ref:`tp-dashboard` for details.                                                                                               |
   +---------------+------------------------------------------------------------------------------------------------------------------------------------+
   | Cache Checks  | A real time view into the status of each cache.                                                                                    |
-  |               | This view is sourced by the Traffic Monitor data and is updated on demand.                                                         |
+  |               | This view is sourced by the Traffic Monitor data thru the Traffic Ops API and is updated on demand.                                |
   |               | See :ref:`tp-cache-checks` for details.                                                                                            |
   +---------------+------------------------------------------------------------------------------------------------------------------------------------+
-  | Cache Stats   | A table showing the results of the periodic check extension scripts that are run. See :ref:`tp-cache-stats`                        |
+  | Cache Stats   | A table showing the results of the periodic check extension scripts that are run. See :ref:`tp-cache-stats` for details.           |
   +---------------+------------------------------------------------------------------------------------------------------------------------------------+
 
-* **Configure**
-
-  The main Delivery Service table. This is where you Create/Read/Update/Delete Delivery Services of all types. Hover over to get the following sub option:
+* **Services**
 
-  +-------------------+--------------------------------------------------------------------+
-  |       Option      |             Description                                            |
-  +===================+====================================================================+
-  | Cache Groups      | Add/Edit/Delete Cache Groups.                                      |
-  +-------------------+--------------------------------------------------------------------+
-  | Delivery Services | Add/Edit/Delete Delivery Services.                                 |
-  +-------------------+--------------------------------------------------------------------+
-  | Servers           | Add/Edit/Delete Servers.  Queue/Clear Server updates.              |
-  +-------------------+--------------------------------------------------------------------+
+  +----------------------------------+-----------------------------------------------------------------------------------------------------------------+
+  |     Option                       |                                              Description                                                        |
+  +==================================+=================================================================================================================+
+  | Delivery Services                | Settings for your delivery services. Only the delivery services defined by a user's tenancy are visible.        |
+  |                                  | See :ref:`tp-delivery-services` for details.                                                                    |
+  +----------------------------------+-----------------------------------------------------------------------------------------------------------------+
+  | Delivery Service Requests        | If enabled in tp.domain.com/traffic_portal_properties.json, all delivery service changes (create, update and    |
+  |                                  | delete) are captured as a delivery service request and must be reviewed before fulfillment/deployment.          |
+  |                                  | See :ref:`tp-delivery-service-requests` for details.                                                            |
+  +----------------------------------+-----------------------------------------------------------------------------------------------------------------+
 
 * **Admin**
 
-  The main Servers table. This is where you Create/Read/Update/Delete servers of all types.  Click the main tab to get to the main table, and hover over to get these sub options:
-
   +-------------------+------------------------------------------------------------------------------------------+
   |       Option      |                                       Description                                        |
   +===================+==========================================================================================+
-  | ASNs              | Create/Read/Update/Delete Autonomous System Numbers See :ref:`tp-asn-czf`                |
+  | ASNs              | Manage autonomous system numbers (ASN). See :ref:`tp-asns`                               |
+  +-------------------+------------------------------------------------------------------------------------------+
+  | Cache Groups      | Manage cache groups. See :ref:`tp-cache-groups`                                          |
   +-------------------+------------------------------------------------------------------------------------------+
-  | CDNs              | Create/Read/Update/Delete CDNs, Manage Federations(:ref:`tp-federations`),               |
-  |                   | Manage DNSSEC Keys(:ref:`tp-manage-dnssec-keys`),                                        |
-  |                   | View Delivery Services, Profiles, and Servers                                            |
+  | CDNs              | Manage CDNs. See :ref:`tp-cdns`                                                          |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Divisions         | Create/Read/Update/Delete divisions                                                      |
+  | Divisions         | Manage divisions. See :ref:`tp-divisions`                                                |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Jobs              | View/Create Invalidate Content Jobs                                                      |
+  | Jobs              | Manage invalidate content jobs. See :ref:`tp-jobs`                                       |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Phys Locations    | Create/Read/Update/Delete locations                                                      |
+  | Phys Locations    | Manage physical locations. See :ref:`tp-phys-locations`                                  |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Parameters        | Create/Read/Update/Delete Parameters                                                     |
+  | Parameters        | Manage parameters. See :ref:`tp-parameters`                                              |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Profiles          | Create/Read/Update/Delete profiles. See :ref:`tp-working-with-profiles`                  |
+  | Profiles          | Manage profiles. See :ref:`tp-profiles`                                                  |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Regions           | Create/Read/Update/Delete regions                                                        |
+  | Regions           | Manage regions. See :ref:`tp-regions`                                                    |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Statuses          | Create/Read/Update/Delete server statuses                                                |
+  | Servers           | Manage servers. See :ref:`tp-servers`                                                    |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Tenants           | Create/Read/Update/Delete CDN tenants                                                    |
+  | Statuses          | Manage server statuses. See :ref:`tp-statuses`                                           |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Types             | Create/Read/Update/Delete data types                                                     |
+  | Tenants           | Manage tenants. See :ref:`tp-tenants`                                                    |
   +-------------------+------------------------------------------------------------------------------------------+
-  | Users             | Create/Read/Update/Delete users                                                          |
+  | Types             | Manage types. See :ref:`tp-types`                                                        |
+  +-------------------+------------------------------------------------------------------------------------------+
+  | Users             | Manage users. See :ref:`tp-users`                                                        |
   +-------------------+------------------------------------------------------------------------------------------+
 
 * **Tools**
 
-  Tools for working with Traffic Ops and it's servers. Hover over this tab to get the following options:
-
-  +--------------------+-----------------------------------------------------------------------------------------------------------------------------------+
-  |       Option       |                                                            Description                                                            |
-  +====================+===================================================================================================================================+
-  | Generate ISO       | Generate a bootable image for any of the servers in the Servers table (or any server for that matter). See :ref:`tp-generate-iso` |
-  +--------------------+-----------------------------------------------------------------------------------------------------------------------------------+
+  +--------------------+-----------------------------------------------------------------------------------------+
+  |       Option       |                                    Description                                          |
+  +====================+=========================================================================================+
+  | Generate ISO       | Generate a bootable image for any of the servers in the Servers table (or any server    |
+  |                    | for that matter). See :ref:`tp-gen-iso`                                                 |
+  +--------------------+-----------------------------------------------------------------------------------------+
 
 
 * **Other**
 
-  Miscellaneous editing options. Hover over this tab to get the following options:
-
-  +--------------------+-------------------------------------------------------------------------------------------+
-  |       Option       |                                        Description                                        |
-  +====================+===========================================================================================+
-  | Grafana            | Link to your Grafana instance                                                             |
-  +--------------------+-------------------------------------------------------------------------------------------+
-  | Docs               | Link to trafficcontrol.apache.org                                                         |
-  +--------------------+-------------------------------------------------------------------------------------------+
-
-
-.. index::
-  Change Log
-
-* **ChangeLog**
-
-  Displayed at the top right of every page. The Changelog table displays the changes that are being made to the Traffic Ops database through the Traffic Portal. This tab will show the number of changes since you last visited this tab in (brackets) since the last time you visited this tab. There are currently no sub menus for this tab.
-
-* **Bottom Menu Icons**
-
-  .. image:: ./tp_bottom_menu.png
+  Custom menu items. By default, you get a link to Traffic Control docs. See :ref:`tp-menu-other`
 
-  Hover over each icon to see the following options:
-
-  +---------------+---------------------------------------------------------------------+
-  |     Option    |                             Description                             |
-  +===============+=====================================================================+
-  | Logout        | Logout of Traffic Portal                                            |
-  +---------------+---------------------------------------------------------------------+
-  | User Profile  | Read/Update your user information                                   |
-  +---------------+---------------------------------------------------------------------+
-  | Release Info  | Release notes for the most recent releases of Traffic Portal        |
-  +---------------+---------------------------------------------------------------------+
-  | Popout        | Open the current window in a new tab.  0                            |
-  +---------------+---------------------------------------------------------------------+
+  +--------------------+-----------------------------------------------------------------------------------------+
+  |       Option       |                                        Description                                      |
+  +====================+=========================================================================================+
+  | Docs               | Link to trafficcontrol.apache.org                                                       |
+  +--------------------+-----------------------------------------------------------------------------------------+
 
 
 .. index::
@@ -158,17 +122,19 @@ Traffic Portal is a replacement for the Traffic Ops UI. The following tabs are a
 Monitor
 =======
 
+.. image:: ./images/tp_menu_monitor.png
+
 .. _tp-dashboard:
 
 Dashboard
 +++++++++
-The Dashboard is the default landing screen for Traffic Portal, it displays various statistics about the overall health of your CDN.
+The Dashboard is the default landing page for Traffic Portal. It displays various statistics about the overall health of your CDN.
 
 
 * **Current Bandwidth**: The current bandwidth of all of your CDNs.
 * **Current Connections**: The current number of connections to all of your CDNs.
-* **Healthy Caches**: Number of healthy caches returned by the /cdns/health endpoint.  Click the link to view the healthy caches on the cache stats page.
-* **Unhealthy Caches**: Number of unhealthy caches returned by the /cdns/health endpoint.  Click the link to view the unhealthy caches on the cache stats page.
+* **Healthy Caches**: Number of healthy caches across all CDNs.  Click the link to view the healthy caches on the cache stats page.
+* **Unhealthy Caches**: Number of unhealthy caches across all CDNs.  Click the link to view the unhealthy caches on the cache stats page.
 * **Online Caches**: Number of online caches.  Traffic Monitor will not monitor the state of ONLINE servers. True health is unknown.
 * **Reported Caches**: Number of caches with REPORTED status.
 * **Offline Caches**: Number of caches with OFFLINE status.
@@ -179,16 +145,16 @@ The Dashboard is the default landing screen for Traffic Portal, it displays vari
 
 Cache Checks
 ++++++++++++
-The cache checks page is intended to give an overview of the Servers managed by Traffic Control as well as their status. This data comes from the servers/checks api endpoint.
+The cache checks page is intended to give an overview of the caches managed by Traffic Control as well as their status.
 
 +----------+-----------------------------------------------------------------------+
-| Name     |                 Description                                           |
+| Name     |                           Description                                 |
 +==========+=======================================================================+
-| HostName | Cache host name                                                       |
+| Hostname | Cache host name                                                       |
 +----------+-----------------------------------------------------------------------+
-| Profile  | The name of the profile to be applied to the cache                    |
+| Profile  | The name of the profile applied to the cache                          |
 +----------+-----------------------------------------------------------------------+
-| Status   | The status of the cache  (ONLINE, REPORTED..)                         |
+| Status   | The status of the cache  (ONLINE, REPORTED, ADMIN_DOWN, OFFLINE)      |
 +----------+-----------------------------------------------------------------------+
 | UPD      | Config updates pending for an edge or mid                             |
 +----------+-----------------------------------------------------------------------+
@@ -226,7 +192,7 @@ The cache checks page is intended to give an overview of the Servers managed by
 
 Cache Stats
 +++++++++++
-Displayes health by cache group/profile.
+Displays health by cache group/profile.
 
 +--------------+-----------------------------------------------------------------------+
 | Name         |                 Description                                           |
@@ -235,890 +201,567 @@ Displayes health by cache group/profile.
 +--------------+-----------------------------------------------------------------------+
 | Host         | ALL or grouped by profile                                             |
 +--------------+-----------------------------------------------------------------------+
-| CacheGroup   | Cache Group Name                                                      |
+| Cache Group  | Cache Group Name                                                      |
 +--------------+-----------------------------------------------------------------------+
-| Healthy      | true/false                                                            |
+| Healthy      | True/False as determined by Traffic Monitor                           |
 +--------------+-----------------------------------------------------------------------+
-| Status       | Status of the cache or cacheGroup                                     |
+| Status       | Status of the cache or cache group                                    |
 +--------------+-----------------------------------------------------------------------+
 | Connections  | Number of connections                                                 |
 +--------------+-----------------------------------------------------------------------+
 | MbpsOut      | MbpsOut                                                               |
 +--------------+-----------------------------------------------------------------------+
 
-Delivery Services
-=================
-The fields in the Delivery Service view are:
-
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|                       Name                       |                                                                                                     Description                                                                                                     |
-+==================================================+=====================================================================================================================================================================================================================+
-| Active                                           | When this is set to no Traffic Router will not serve DNS or HTTP responses for this delivery service.                                                                                                               |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Content Routing Type                             | The type of content routing this delivery service will use. See :ref:`tp-ds-types`.                                                                                                                                 |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Key(XML ID)                                      | A unique string that identifies this delivery service.                                                                                                                                                              |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Display Name                                     | Delivery Service Name.                                                                                                                                                                                              |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Tenant                                           | Dropdown to choose the appropriate tenant for your delivery service.                                                                                                                                                |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| CDN                                              | Dropdown to choose the CDN that the delivery service will use.                                                                                                                                                      |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Origin Server Base URL                           | The Origin Server's base URL. This includes the protocol (http or https). Example: ``http://movies.origin.com``                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Protocol                                         | The protocol to serve this delivery service to the clients with:                                                                                                                                                    |
-|                                                  |                                                                                                                                                                                                                     |
-|                                                  | -  0 http                                                                                                                                                                                                           |
-|                                                  | -  1 https                                                                                                                                                                                                          |
-|                                                  | -  2 both http and https                                                                                                                                                                                            |
-|                                                  | -  3 http to https                                                                                                                                                                                                  |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Long Description                                 | Long description for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                              |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Delivery Service URLs                            | List of URLs derived from Protocol + Routing Name + XML ID + CDN Domain                                                                                                                                             |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **Advanced**                                     |                                                                                                                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Routing Name                                     | The routing name to use for the delivery FQDN, i.e. ``<routing-name>.<deliveryservice>.<cdn-domain>``. It must be a valid hostname without periods. [2]_                                                            |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DSCP Tag                                         | The DSCP value to mark IP packets to the client with.                                                                                                                                                               |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| IPv6 Routing Enabled?                            | When set to yes, the Traffic Router will respond to AAAA DNS requests for the routed name of this delivery service. Otherwise, only A records will be served.                                                       |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Range Request Handling                           | (experimental)  How to treat range requests:                                                                                                                                                                        |
-|                                                  |                                                                                                                                                                                                                     |
-|                                                  | - 0 Do not cache (ranges requested from files taht are already cached due to a non range request will be a HIT)                                                                                                     |
-|                                                  | - 1 Use the `background_fetch <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/background_fetch.en.html>`_ plugin.                                                                              |
-|                                                  | - 2 Use the cache_range_requests plugin.                                                                                                                                                                            |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Query String Handling                            | How to treat query strings:                                                                                                                                                                                         |
-|                                                  |                                                                                                                                                                                                                     |
-|                                                  | - 0 use in cache key and hand up to origin -this means each unique query string Is treated as a unique URL.                                                                                                         |
-|                                                  | - 1 Do not use in cache key, but pass up to origin - this means a 2 URLs that are the same except for the query string will match, and cache HIT, while the origin still sees original query string in the request. |
-|                                                  | - 2 Drop at edge - this means a 2 URLs that are the same except for  the query string will match, and cache HIT, while the origin will not see original query string in the request.                                |
-|                                                  |                                                                                                                                                                                                                     |
-|                                                  | **Note:** Choosing to drop query strings at the edge will preclude the use of a Regex Remap Expression. See :ref:`tp-regex-remap`.                                                                                  |
-|                                                  | To set the qstring without the use of regex remap, or for further options, see :ref:`tp-qstring-handling`.                                                                                                          |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Use Multi Site Origin Feature                    | Enable the Multi Site Origin feature for this delivery service. See :ref:`rl-multi-site-origin`                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Logs Enabled                                     |                                                                                                                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Provider                                     | ip geolocation provider                                                                                                                                                                                             |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Miss Default Latitude                        | Default Latitude for this delivery service. When client localization fails for both Coverage Zone and Geo Lookup, this the client will be routed as if it was at this lat.                                          |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Miss Default Longitude                       | Default Longitude for this delivery service. When client localization fails for bot Coverage Zone and Geo Lookup, this the client will be routed as if it was at this long.                                         |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Limit?                                       | Some services are intended to be limited by geography. The possible settings are are:                                                                                                                               |
-|                                                  |                                                                                                                                                                                                                     |
-|                                                  | - None - Do not limit by geography.                                                                                                                                                                                 |
-|                                                  | - CZF only - If the requesting IP is not in the Coverage Zone File, do not serve the request.                                                                                                                       |
-|                                                  | - CZF + US - If the requesting IP is not in the Coverage Zone File or not in the United States, do not serve the request.                                                                                           |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Limit Countries                              | (for HTTP routed delivery services only) Do not serve the request to specific countries.                                                                                                                            |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Geo Limit Redirect URL                           | (for HTTP routed delivery services only) This is the URL Traffic Router will redirect to when Geo Limit Failure. See :ref:`rl-tr-ngb`                                                                               |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Signing Algorithm                                | See :ref:`tp-signed-urls`.                                                                                                                                                                                          |
-| Signing Algorithm                                | None                                                                                                                                                                                                                |
-|                                                  | URL Signature Keys                                                                                                                                                                                                  |
-|                                                  | URI Signing Keys                                                                                                                                                                                                    |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Bypass Ipv4                                      | (For DNS routed delivery services only) This is the address to respond to A requests with when the the max Bps or Max Tps for this delivery service are exceeded.                                                   |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Bypass IPv6                                      | (For DNS routed delivery services only) This is the address to respond to AAAA requests with when the the max Bps or Max Tps for this delivery service are exceeded.                                                |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNS Bypass Cname                                 |                                                                                                                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNS Bypass TTL                                   |                                                                                                                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Max DNS Answers                                  |                                                                                                                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Delivery Service DNS TTL                         | The Time To Live on the DNS record for the Traffic Router A and AAAA records (``<routing-name>.<deliveryservice>.<cdn-domain>``).                                                                                   |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Delivery Service Profile                         | The profile for this delivery service.                                                                                                                                                                              |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Global Max Mbps                                  | The maximum bits per second this delivery service can serve across all EDGE caches before traffic will be diverted to the bypass destination. For a DNS delivery service, the Bypass Ipv4 or Ipv6  will be used     |
-|                                                  | (depending on whether this was a A or AAAA request), and for HTTP delivery services the Bypass FQDN will be used.                                                                                                   |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Global Max TPS                                   | The maximum transactions per se this delivery service can serve across all EDGE caches before traffic will be diverted to the bypass destination. For a DNS delivery service, the Bypass Ipv4 or Ipv6  will be used |
-|                                                  | (depending on whether this was a A or AAAA request), and for HTTP delivery services the Bypass FQDN will be used.                                                                                                   |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Signed URLs                                      | Use Signed URLs? See :ref:`tp-signed-urls`.                                                                                                                                                                         |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Edge Header Rewrite Rules                        | Header Rewrite rules to apply for this delivery service at the EDGE tier. See :ref:`tp-header-rewrite`. [1]_                                                                                                        |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Mid Header Rewrite Rules                         | Header Rewrite rules to apply for this delivery service at the MID tier. See :ref:`tp-header-rewrite`. [1]_                                                                                                         |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Traffic Router Additional Response Headers       |                                                                                                                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Traffic Router Log Request Headers               |                                                                                                                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Regex Remap Expression                           | Regex Remap rule to apply to this delivery service at the Edge tier. See `ATS documentation on regex_remap <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/regex_remap.en.html>`_. [1]_        |
-|                                                  |                                                                                                                                                                                                                     |
-|                                                  | **Note:** you will not be able to save a Regex Remap Expression if you have Query String Handling set to drop query strings at the edge. See :ref:`tp-regex-remap`.                                                 |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Cache URL expression                             | Cache URL rule to apply to this delivery service. See `ATS documentation on cacheurl <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/cacheurl.en.html>`_. [1]_                                 |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Raw remap text                                   | For HTTP and DNS deliveryservices, this will get added to the end of the remap line on the cache verbatim. For ANY_MAP deliveryservices this is the remap line. [1]_                                                |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Long Description 2                               | Customer description for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                          |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Long Description 3                               | Service description for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                           |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Info URL                                         | Info URL  for this delivery service. To be consumed from the APIs by downstream tools (Portal).                                                                                                                     |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Check Path                                       | A path (ex: /crossdomain.xml) to verify the connection to the origin server with. This can be used by Check Extension scripts to do periodic health checks against the delivery service.                            |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Origin Shield (Pipe Delimited String)            | Experimental. Origin Shield string.                                                                                                                                                                                 |
-+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. [1] These fields are not validated by Traffic Ops to be correct syntactically, and can cause Traffic Server to not start if invalid. Please use with caution.
-.. [2] It is not recommended to change the Routing Name of a Delivery Service after deployment because this changes its Delivery FQDN (i.e. ``<routing-name>.<deliveryservice>.<cdn-domain>``), which means that SSL certificates may need to be updated and clients using the Delivery Service will need to be transitioned to the new Delivery URL.
-
-.. index::
-  Delivery Service Type
-
-.. _tp-ds-types:
-
-Delivery Service Types
-++++++++++++++++++++++
-One of the most important settings when creating the delivery service is the selection of the delivery service *type*. This type determines the routing method and the primary storage for the delivery service.
-
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|       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.                                                                                                                                                                                                                                                                                                                     |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 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.                                                                                                                                                               |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 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.                                                                                                                                                                                                |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| HTTP_LIVE       | HTTP Content routing, but where for "standard" HTTP content routing the objects are stored on disk, for this delivery service type the objects are stored                                                                                                                                                                    |
-|                 | on the RAM disks. Use this for linear TV. The MID tier is bypassed for this type.                                                                                                                                                                                                                                            |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| HTTP_LIVE_NATNL | HTTP Content routing, same as HTTP_LIVE, but the MID tier is NOT bypassed.                                                                                                                                                                                                                                                   |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNS_LIVE_NATNL  | DNS Content routing, but where for "standard" DNS content routing the objects are stored on disk, for this delivery service type the objects are stored                                                                                                                                                                      |
-|                 | on the RAM disks. Use this for linear TV. The MID tier is NOT bypassed for this type.                                                                                                                                                                                                                                        |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNS_LIVE        | DNS Content routing, same as DNS_LIVE_NATNL, but the MID tier is bypassed.                                                                                                                                                                                                                                                   |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| ANY_MAP         | ANY_MAP is not known to Traffic Router. For this deliveryservice, the "Raw remap text" field in the input form will be used as the remap line on the cache.                                                                                                                                                                  |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| STEERING        | The Delivery Service will be used to route to other delivery services. The target delivery services and the routing weights for those delivery services will be defined by an admin or steering user. For more information see the `steering feature <../traffic_router.html#steering-feature>`_ documentation               |
-+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-
-
-.. Note:: Once created, the Traffic Ops user interface does not allow you to change the delivery service type; the drop down is greyed out. There are many things that can go wrong when changing the type, and it is safer to delete the delivery service, and recreate it.
-
-
-.. _tp-server:
-
-Servers
-=======
-This view shows a table of all the servers in Traffic Ops. The table columns show the most important details of the server. The **IPAddrr** column is clickable to launch an ``ssh://`` link to this server. The |graph| icon will link to a Traffic Stats graph of this server for caches, and the |info| will link to the server status pages for other server types.
-
-
-Server Types
-++++++++++++
-These are the types of servers that can be managed in Traffic Ops:
-
-+---------------+---------------------------------------------+
-|      Name     |                 Description                 |
-+===============+=============================================+
-| EDGE          | Edge Cache                                  |
-+---------------+---------------------------------------------+
-| MID           | Mid Tier Cache                              |
-+---------------+---------------------------------------------+
-| ORG           | Origin                                      |
-+---------------+---------------------------------------------+
-| CCR           | Traffic Router                              |
-+---------------+---------------------------------------------+
-| RASCAL        | Rascal health polling & reporting           |
-+---------------+---------------------------------------------+
-| TOOLS_SERVER  | Ops hosts for managment                     |
-+---------------+---------------------------------------------+
-| RIAK          | Riak keystore                               |
-+---------------+---------------------------------------------+
-| SPLUNK        | SPLUNK indexer search head etc              |
-+---------------+---------------------------------------------+
-| TRAFFIC_STATS | traffic_stats server                        |
-+---------------+---------------------------------------------+
-| INFLUXDB      | influxDb server                             |
-+---------------+---------------------------------------------+
-
-
-
-.. _tp-federations:
-
-Federations
-+++++++++++
-  Federations allow for other (federated) CDNs (at a different ISP, MSO, etc) to add a list of resolvers and a CNAME to a delivery service Traffic Portal.  When a request is made from one of federated CDN's clients, Traffic Router will return the CNAME configured in the federation mapping.  This allows the federated CDN to serve the content without the content provider changing the URL, or having to manage multiple URLs.
-
-  Before adding a federation in the Traffic Portal UI, a user with the federations role needs to be created.  This user will be assigned to the federation and will be able to add resolvers to the federation via the Traffic Ops `Federation API <../../development/traffic_ops_api/v12/federation.html>`_.
-
-
-.. index::
-  Header Rewrite
+Services
+========
 
-.. _tp-header-rewrite:
+.. image:: ./images/tp_menu_services.png
 
-Header Rewrite Options and DSCP
-+++++++++++++++++++++++++++++++
-Most header manipulation and per-delivery service configuration overrides are done using the `ATS Header Rewrite Plugin <https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/header_rewrite.en.html>`_. Traffic Control allows you to enter header rewrite rules to be applied at the edge and at the mid level. The syntax used in Traffic Ops is the same as the one described in the ATS documentation, except for some special strings that will get replaced:
+.. _tp-delivery-services:
 
-+-------------------+--------------------------+
-| Traffic Ops Entry |    Gets Replaced with    |
-+===================+==========================+
-| __RETURN__        | A newline                |
-+-------------------+--------------------------+
-| __CACHE_IPV4__    | The cache's IPv4 address |
-+-------------------+--------------------------+
-
-The deliveryservice screen also allows you to set the DSCP value of traffic sent to the client. This setting also results in a header_rewrite rule to be generated and applied to at the edge.
-
-.. Note:: The DSCP setting in the UI is *only* for setting traffic towards the client, and gets applied *after* the initial TCP handshake is complete, and the HTTP request is received (before that the cache can't determine what deliveryservice this request is for, and what DSCP to apply), so the DSCP feature can not be used for security settings - the TCP SYN-ACK is not going to be DSCP marked.
-
-
-.. index::
-  Token Based Authentication
-  Signed URLs
-
-.. _tp-signed-urls:
-
-Token Based Authentication
-++++++++++++++++++++++++++
-Token based authentication or *signed URLs* is implemented using the Traffic Server ``url_sig`` plugin. To sign a URL at the signing portal take the full URL, without any query string, and add on a query string with the following parameters:
-
-Client IP address
-        The client IP address that this signature is valid for.
-
-        ``C=<client IP address>``
-
-Expiration
-        The Expiration time (seconds since epoch) of this signature.
-
-        ``E=<expiration time in secs since unix epoch>``
-
-Algorithm
-        The Algorithm used to create the signature. Only 1 (HMAC_SHA1)
-        and 2 (HMAC_MD5) are supported at this time
-
-        ``A=<algorithm number>``
-
-Key index
-        Index of the key used. This is the index of the key in the
-        configuration file on the cache. The set of keys is a shared
-        secret between the signing portal and the edge caches. There
-        is one set of keys per reverse proxy domain (fqdn).
-
-        ``K=<key index used>``
-Parts
-        Parts to use for the signature, always excluding the scheme
-        (http://).  parts0 = fqdn, parts1..x is the directory parts
-        of the path, if there are more parts to the path than letters
-        in the parts param, the last one is repeated for those.
-        Examples:
-
-                1: use fqdn and all of URl path
-                0110: use part1 and part 2 of path only
-                01: use everything except the fqdn
-
-        ``P=<parts string (0's and 1's)>``
-
-Signature
-        The signature over the parts + the query string up to and
-        including "S=".
-
-        ``S=<signature>``
-
-.. seealso:: The url_sig `README <https://github.com/apache/trafficserver/blob/master/plugins/experimental/url_sig/README>`_.
-
-Generate URL Sig Keys
-^^^^^^^^^^^^^^^^^^^^^
-To generate a set of random signed url keys for this delivery service and store them in Traffic Vault, click the **Generate URL Sig Keys** button at the bottom of the delivery service details screen.
-
-
-.. rl-parent-selection:
-
-Parent Selection
-++++++++++++++++
-
-Parameters in the Edge (child) profile that influence this feature:
-
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-|                      Name                     |    Filename    |    Default    |                      Description                      |
-+===============================================+================+===============+=======================================================+
-| CONFIG proxy.config.                          | records.config | INT 1         | enable parent selection.  This is a required setting. |
-| http.parent_proxy_routing_enable              |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 1         | required for parent selection.                        |
-| url_remap.remap_required                      |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 0         | See                                                   |
-| http.no_dns_just_forward_to_parent            |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 1         |                                                       |
-| http.uncacheable_requests_bypass_parent       |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 1         |                                                       |
-| http.parent_proxy_routing_enable              |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 300       |                                                       |
-| http.parent_proxy.retry_time                  |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 10        |                                                       |
-| http.parent_proxy.fail_threshold              |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 4         |                                                       |
-| http.parent_proxy.total_connect_attempts      |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 2         |                                                       |
-| http.parent_proxy.per_parent_connect_attempts |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 30        |                                                       |
-| http.parent_proxy.connect_attempts_timeout    |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 0         |                                                       |
-| http.forward.proxy_auth_to_parent             |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 0         |                                                       |
-| http.parent_proxy_routing_enable              |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | STRING        |                                                       |
-| http.parent_proxy.file                        |                | parent.config |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| CONFIG proxy.config.                          | records.config | INT 3         |                                                       |
-| http.parent_proxy.connect_attempts_timeout    |                |               |                                                       |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-| algorithm                                     | parent.config  | urlhash       | The algorithm to use.                                 |
-+-----------------------------------------------+----------------+---------------+-------------------------------------------------------+
-
-
-Parameters in the Mid (parent) profile that influence this feature:
-
-+----------------+---------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|      Name      |    Filename   | Default |                                                                                    Description                                                                                    |
-+================+===============+=========+===================================================================================================================================================================================+
-| domain_name    | CRConfig.json | -       | Only parents with the same value as the edge are going to be used as parents (to keep separation between CDNs)                                                                    |
-+----------------+---------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| weight         | parent.config | 1.0     | The weight of this parent, translates to the number of replicas in the consistent hash ring. This parameter only has effect with algorithm at the client set to "consistent_hash" |
-+----------------+---------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| port           | parent.config | 80      | The port this parent is listening on as a forward proxy.                                                                                                                          |
-+----------------+---------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| use_ip_address | parent.config | 0       | 1 means use IP(v4) address of this parent in the parent.config, 0 means use the host_name.domain_name concatenation.                                                              |
-+----------------+---------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _tp-qstring-handling:
-
-Qstring Handling
-++++++++++++++++
-
-Delivery services have a Query String Handling option that, when set to ignore, will automatically add a regex remap to that delivery service's config.  There may be times this is not preferred, or there may be requirements for one delivery service or server(s) to behave differently.  When this is required, the psel.qstring_handling parameter can be set in either the delivery service profile or the server profile, but it is important to note that the server profile will override ALL delivery services assigned to servers with this profile parameter.  If the parameter is not set for the server profile but is present for the Delivery Service profile, this will override the setting in the delivery service.  A value of "ignore" will not result in the addition of regex remap configuration.
-
-+-----------------------+---------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|      Name             |    Filename   | Default |                                                                                    Description                                                                                    |
-+=======================+===============+=========+===================================================================================================================================================================================+
-| psel.qstring_handling | parent.config | -       | Sets qstring handling without the use of regex remap for a delivery service when assigned to a delivery service profile, and overrides qstring handling for all delivery services |
-|                       |               |         | for associated servers when assigned to a server profile. Value must be "consider" or "ignore".                                                                                   |
-+-----------------------+---------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _tp-multi-site-origin:
-
-Multi Site Origin
+Delivery Services
 +++++++++++++++++
 
-.. Note:: The configuration of this feature changed significantly between ATS version 5 and >= 6. Some configuration in Traffic Control is different as well. This documentation assumes ATS 6 or higher. See :ref:`rl-multi-site-origin-qht` for more details.
-
-Normally, the mid servers are not aware of any redundancy at the origin layer. With Multi Site Origin enabled this changes - Traffic Server (and Traffic Ops) are now made aware of the fact there are multiple origins, and can be configured to do more advanced failover and loadbalancing actions. A prerequisite for MSO to work is that the multiple origin sites serve identical content with identical paths, and both are configured to serve the same origin hostname as is configured in the deliveryservice `Origin Server Base URL` field. See the `Apache Traffic Server docs <https://docs.trafficserver.apache.org/en/latest/admin-guide/files/parent.config.en.html>`_ for more information on that cache's implementation.
-
-With This feature enabled, origin servers (or origin server VIP names for a site) are going to be entered as servers in to the Traiffic Ops UI. Server type is "ORG".
-
-Parameters in the mid profile that influence this feature:
-
-+--------------------------------------------------------------------------+----------------+------------+----------------------------------------------------------------------------------------------------+
-|                                   Name                                   |    Filename    |  Default   |                                            Description                                             |
-+==========================================================================+================+============+====================================================================================================+
-| CONFIG proxy.config. http.parent_proxy_routing_enable                    | records.config | INT 1      | enable parent selection.  This is a required setting.                                              |
-+--------------------------------------------------------------------------+----------------+------------+----------------------------------------------------------------------------------------------------+
-| CONFIG proxy.config. url_remap.remap_required                            | records.config | INT 1      | required for parent selection.                                                                     |
-+--------------------------------------------------------------------------+----------------+------------+----------------------------------------------------------------------------------------------------+
-
-
-Parameters in the deliveryservice profile that influence this feature:
-
-+---------------------------------------------+----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------+
-|                                   Name      |    Filename    |  Default        |                                                                         Description                                             |
-+=============================================+================+=================+=================================================================================================================================+
-| mso.parent_retry                            | parent.config  | \-              | Either ``simple_retry``, ``dead_server_retry`` or ``both``.                                                                     |
-+---------------------------------------------+----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------+
-| mso.algorithm                               | parent.config  | consistent_hash | The algorithm to use. ``consisten_hash``, ``strict``, ``true``, ``false``, or ``latched``.                                      |
-|                                             |                |                 |                                                                                                                                 |
-|                                             |                |                 | - ``consisten_hash`` - spreads requests across multiple parents simultaneously based on hash of content URL.                    |
-|                                             |                |                 | - ``strict`` - strict Round Robin spreads requests across multiple parents simultaneously based on order of requests.           |
-|                                             |                |                 | - ``true`` - same as strict, but ensures that requests from the same IP always go to the same parent if available.              |
-|                                             |                |                 | - ``false`` - uses only a single parent at any given time and switches to a new parent only if the current parent fails.        |
-|                                             |                |                 | - ``latched`` - same as false, but now, a failed parent will not be retried.                                                    |
-+---------------------------------------------+----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------+
-| mso.unavailable_server_retry_response_codes | parent.config  | "503"           | Quoted, comma separated list of HTTP status codes that count as a unavailable_server_retry_response_code.                       |
-+---------------------------------------------+----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------+
-| mso.max_unavailable_server_retries          | parent.config  | 1               | How many times an unavailable server will be retried.                                                                           |
-+---------------------------------------------+----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------+
-| mso.simple_retry_response_codes             | parent.config  | "404"           | Quoted, comma separated list of HTTP status codes that count as a simple retry response code.                                   |
-+---------------------------------------------+----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------+
-| mso.max_simple_retries                      | parent.config  | 1               | How many times a simple retry will be done.                                                                                     |
-+---------------------------------------------+----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------+
-
-
-
-see :ref:`rl-multi-site-origin-qht` for a *quick how to* on this feature.
-
-.. _tp-ccr-profile:
-
-Traffic Router Profile
-++++++++++++++++++++++
-
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|                   Name                  |      Config_file       |                                                                                                Description                                                                                                |
-+=========================================+========================+===========================================================================================================================================================================================================+
-| location                                | dns.zone               | Location to store the DNS zone files in the local file system of Traffic Router.                                                                                                                          |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| location                                | http-log4j.properties  | Location to find the log4j.properties file for Traffic Router.                                                                                                                                            |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| location                                | dns-log4j.properties   | Location to find the dns-log4j.properties file for Traffic Router.                                                                                                                                        |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| location                                | geolocation.properties | Location to find the log4j.properties file for Traffic Router.                                                                                                                                            |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| CDN_name                                | rascal-config.txt      | The human readable name of the CDN for this profile.                                                                                                                                                      |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| CoverageZoneJsonURL                     | CRConfig.xml           | The location (URL) to retrieve the coverage zone map file in JSON format from.                                                                                                                            |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| geolocation.polling.url                 | CRConfig.json          | The location (URL) to retrieve the geo database file from.                                                                                                                                                |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| geolocation.polling.interval            | CRConfig.json          | How often to refresh the coverage geo location database  in ms                                                                                                                                            |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| coveragezone.polling.interval           | CRConfig.json          | How often to refresh the coverage zone map in ms                                                                                                                                                          |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| coveragezone.polling.url                | CRConfig.json          | The location (URL) to retrieve the coverage zone map file in XML format from.                                                                                                                             |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.soa.expire                          | CRConfig.json          | The value for the expire field the Traffic Router DNS Server will respond with on Start of Authority (SOA) records.                                                                                       |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.soa.minimum                         | CRConfig.json          | The value for the minimum field the Traffic Router DNS Server will respond with on SOA records.                                                                                                           |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.soa.admin                           | CRConfig.json          | The DNS Start of Authority admin.  Should be a valid support email address for support if DNS is not working correctly.                                                                                   |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.soa.retry                           | CRConfig.json          | The value for the retry field the Traffic Router DNS Server will respond with on SOA records.                                                                                                             |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.soa.refresh                         | CRConfig.json          | The TTL the Traffic Router DNS Server will respond with on A records.                                                                                                                                     |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.ttls.NS                             | CRConfig.json          | The TTL the Traffic Router DNS Server will respond with on NS records.                                                                                                                                    |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.ttls.SOA                            | CRConfig.json          | The TTL the Traffic Router DNS Server will respond with on SOA records.                                                                                                                                   |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.ttls.AAAA                           | CRConfig.json          | The Time To Live (TTL) the Traffic Router DNS Server will respond with on AAAA records.                                                                                                                   |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.ttls.A                              | CRConfig.json          | The TTL the Traffic Router DNS Server will respond with on A records.                                                                                                                                     |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.ttls.DNSKEY                         | CRConfig.json          | The TTL the Traffic Router DNS Server will respond with on DNSKEY records.                                                                                                                                |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| tld.ttls.DS                             | CRConfig.json          | The TTL the Traffic Router DNS Server will respond with on DS records.                                                                                                                                    |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| api.port                                | server.xml             | The TCP port Traffic Router listens on for API (REST) access.                                                                                                                                             |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| api.cache-control.max-age               | CRConfig.json          | The value of the ``Cache-Control: max-age=`` header in the API responses of Traffic Router.                                                                                                               |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| api.auth.url                            | CRConfig.json          | The API authentication URL (https://${tmHostname}/api/1.1/user/login); ${tmHostname} is a search and replace token used by Traffic Router to construct the correct URL)                                   |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| consistent.dns.routing                  | CRConfig.json          | Control whether DNS Delivery Services use consistent hashing on the edge FQDN to select caches for answers. May improve performance if set to true; defaults to false                                     |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| dnssec.enabled                          | CRConfig.json          | Whether DNSSEC is enabled; this parameter is updated via the DNSSEC administration user interface.                                                                                                        |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| dnssec.allow.expired.keys               | CRConfig.json          | Allow Traffic Router to use expired DNSSEC keys to sign zones; default is true. This helps prevent DNSSEC related outages due to failed Traffic Control components or connectivity issues.                |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| dynamic.cache.primer.enabled            | CRConfig.json          | Allow Traffic Router to attempt to prime the dynamic zone cache; defaults to true                                                                                                                         |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| dynamic.cache.primer.limit              | CRConfig.json          | Limit the number of permutations to prime when dynamic zone cache priming is enabled; defaults to 500                                                                                                     |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| keystore.maintenance.interval           | CRConfig.json          | The interval in seconds which Traffic Router will check the keystore API for new DNSSEC keys                                                                                                              |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| keystore.api.url                        | CRConfig.json          | The keystore API URL (https://${tmHostname}/api/1.1/cdns/name/${cdnName}/dnsseckeys.json; ${tmHostname} and ${cdnName} are search and replace tokens used by Traffic Router to construct the correct URL) |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| keystore.fetch.timeout                  | CRConfig.json          | The timeout in milliseconds for requests to the keystore API                                                                                                                                              |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| keystore.fetch.retries                  | CRConfig.json          | The number of times Traffic Router will attempt to load keys before giving up; defaults to 5                                                                                                              |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| keystore.fetch.wait                     | CRConfig.json          | The number of milliseconds Traffic Router will wait before a retry                                                                                                                                        |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| signaturemanager.expiration.multiplier  | CRConfig.json          | Multiplier used in conjunction with a zone's maximum TTL to calculate DNSSEC signature durations; defaults to 5                                                                                           |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| zonemanager.threadpool.scale            | CRConfig.json          | Multiplier used to determine the number of cores to use for zone signing operations; defaults to 0.75                                                                                                     |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| zonemanager.cache.maintenance.interval  | CRConfig.json          | The interval in seconds which Traffic Router will check for zones that need to be resigned or if dynamic zones need to be expired from cache                                                              |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| zonemanager.dynamic.response.expiration | CRConfig.json          | A string (e.g.: 300s) that defines how long a dynamic zone                                                                                                                                                |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNSKEY.generation.multiplier            | CRConfig.json          | Used to deteremine when new keys need to be regenerated. Keys are regenerated if expiration is less than the generation multiplier * the TTL.  If the parameter does not exist, the default is 10.        |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| DNSKEY.effective.multiplier             | CRConfig.json          | Used when creating an effective date for a new key set.  New keys are generated with an effective date of old key expiration - (effective multiplier * TTL).  Default is 2.                               |
-+-----------------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-
-
-.. index::
-  Regex Remap Expression
-
-.. _tp-regex-remap:
-
-Regex Remap Expression
-++++++++++++++++++++++
-The regex remap expression allows to to use a regex and resulting match group(s) in order to modify the request URIs that are sent to origin. For example: ::
-
-  ^/original/(.*) http://origin.example.com/remapped/$1
-
-.. Note:: If **Query String Handling** is set to ``2 Drop at edge``, then you will not be allowed to save a regex remap expression, as dropping query strings actually relies on a regex remap of its own. However, if there is a need to both drop query strings **and** remap request URIs, this can be accomplished by setting **Query String Handling** to ``1 Do not use in cache key, but pass up to origin``, and then using a custom regex remap expression to do the necessary remapping, while simultaneously dropping query strings. The following example will capture the original request URI up to, but not including, the query string and then forward to a remapped URI: ::
-
-  ^/([^?]*).* http://origin.example.com/remapped/$1
-
-..   index::
-  HOST_REGEXP
-  PATH_REGEXP
-  HEADER_REGEXP
-  Delivery Service regexp
-
-.. _tp-ds-regexp:
-
-Delivery Service Regexp
-+++++++++++++++++++++++
-This table defines how requests are matched to the delivery service. There are 3 type of entries possible here:
-
-+---------------+----------------------------------------------------------------------+--------------+-----------+
-|      Name     |                             Description                              |   DS Type    |   Status  |
-+===============+======================================================================+==============+===========+
-| HOST_REGEXP   | This is the regular expresion to match the host part of the URL.     | DNS and HTTP | Supported |
-+---------------+----------------------------------------------------------------------+--------------+-----------+
-| PATH_REGEXP   | This is the regular expresion to match the path part of the URL.     | HTTP         | Beta      |
-+---------------+----------------------------------------------------------------------+--------------+-----------+
-| HEADER_REGEXP | This is the regular expresion to match on any header in the request. | HTTP         | Beta      |
-+---------------+----------------------------------------------------------------------+--------------+-----------+
-
-The **Order** entry defines the order in which the regular expressions get evaluated. To support ``CNAMES`` from domains outside of the Traffic Control top level DNS domain, enter multiple ``HOST_REGEXP`` lines.
-
-Example:
-  Example foo.
-
-.. Note:: In most cases is is sufficient to have just one entry in this table that has a ``HOST_REGEXP`` Type, and Order ``0``. For the *movies* delivery service in the Kabletown CDN, the entry is simply single ``HOST_REGEXP`` set to ``.*\.movies\..*``. This will match every url that has a hostname that ends with ``movies.cdn1.kabletown.net``, since ``cdn1.kabletown.net`` is the Kabletown CDN's DNS domain.
-
-.. index::
-  Static DNS Entries
-
-.. _tp-static-dns:
-
-Static DNS Entries
-++++++++++++++++++
-Static DNS entries allow you to create other names *under* the delivery service domain. You can enter any valid hostname, and create a CNAME, A or AAAA record for it by clicking the **Static DNS** button at the bottom of the delivery service details screen.
+A table of your delivery services with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Key (XML ID)                  | A unique string that identifies this delivery service.                                                                                                                                                              |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Tenant                        | The tenant that the delivery service is assigned to.                                                                                                                                                                |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Origin                        | The Origin Server's base URL. This includes the protocol (http or https). Example: ``http://movies.origin.com``                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Active                        | When this is set to false, Traffic Router will not serve DNS or HTTP responses for this delivery service.                                                                                                           |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Type                          | The type of content routing this delivery service will use. See :ref:`rl-ds-types`.                                                                                                                                 |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Protocol                      | The protocol to serve this delivery service to the clients with:                                                                                                                                                    |
+|                               |                                                                                                                                                                                                                     |
+|                               | -  HTTP                                                                                                                                                                                                             |
+|                               | -  HTTPS                                                                                                                                                                                                            |
+|                               | -  HTTP and HTTPS                                                                                                                                                                                                   |
+|                               | -  HTTP to HTTPS                                                                                                                                                                                                    |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| CDN                           | The CDN that the delivery service belongs to.                                                                                                                                                                       |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| IPv6 Enabled                  | When set to true, the Traffic Router will respond to AAAA DNS requests for the routed name of this delivery service. Otherwise, only A records will be served.                                                      |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| DSCP                          | The DSCP value to mark IP packets to the client with.                                                                                                                                                               |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Signing Algorithm             | See :ref:`rl-signed-urls`.                                                                                                                                                                                          |
+|                               |                                                                                                                                                                                                                     |
+|                               | - None                                                                                                                                                                                                              |
+|                               | - URL Signature Keys                                                                                                                                                                                                |
+|                               | - URI Signing Keys                                                                                                                                                                                                  |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Query String Handling         | How to treat query strings:                                                                                                                                                                                         |
+|                               |                                                                                                                                                                                                                     |
+|                               | - use in cache key and hand up to origin (each unique query string is treated as a unique URL.)                                                                                                                     |
+|                               | - do not use in cache key, but pass up to origin (2 URLs that are the same except for the query string will match, and cache HIT, while the origin still sees original query string in the request.)                |
+|                               | - drop at edge (2 URLs that are the same except for  the query string will match, and cache HIT, while the origin will not see original query string in the request.)                                               |
+|                               |                                                                                                                                                                                                                     |
+|                               | **Note:** Choosing to drop query strings at the edge will preclude the use of a Regex Remap Expression. See :ref:`rl-regex-remap`.                                                                                  |
+|                               | To set the qstring without the use of regex remap, or for further options, see :ref:`rl-qstring-handling`.                                                                                                          |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Last Updated                  | Timestamp when the delivery service was last updated.                                                                                                                                                               |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Delivery service management includes the ability to (where applicable):
+
+- create a new delivery service
+- clone an existing delivery service
+- update an existing delivery service
+- delete an existing delivery service
+- compare delivery services
+- manage delivery service SSL keys
+- manage delivery service URL signature keys
+- manage delivery service URI signing keys
+- view and assign delivery service servers
+- create, update and delete delivery service regexes
+- view and create delivery service invalidate content jobs
+- manage steering targets
+
+
+.. _tp-delivery-service-requests:
+
+Delivery Service Requests
++++++++++++++++++++++++++
+
+A table of your delivery service requests with the following columns:
+
+.. image:: ./images/tp_table_ds_requests.png
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Delivery Service              | A unique string that identifies the delivery service that the request is associated with. This unique string is also known as delivery service key or XML ID.                                                       |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Type                          | The type of delivery service request:                                                                                                                                                                               |
+|                               |                                                                                                                                                                                                                     |
+|                               | -  create (a request to create a new delivery service)                                                                                                                                                              |
+|                               | -  update (a request to update an existing delivery service)                                                                                                                                                        |
+|                               | -  delete (a request to delete an existing delivery service)                                                                                                                                                        |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Status                        | The status of the delivery service request:                                                                                                                                                                         |
+|                               |                                                                                                                                                                                                                     |
+|                               | -  draft (the delivery service request is NOT ready for review and fulfillment)                                                                                                                                     |
+|                               | -  submitted (the delivery service request is ready for review and fulfillment)                                                                                                                                     |
+|                               | -  rejected (the delivery service request has been rejected and cannot be modified)                                                                                                                                 |
+|                               | -  pending (the delivery service request has been fulfilled but the changes have yet to be deployed)                                                                                                                |
+|                               | -  complete (the delivery service request has been fulfilled and the changes have been deployed)                                                                                                                    |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Author                        | The user responsible for creating the delivery service request.                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Assignee                      | The user responsible for fulfilling the delivery service request. Currently, the operations role or above is required to assign delivery service requests.                                                          |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Last Edited By                | The last user to edit the delivery service request.                                                                                                                                                                 |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Created                       | Relative time indicating when the delivery service was created.                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Actions                       | Actions that can be performed on a delivery service request:                                                                                                                                                        |
+|                               |                                                                                                                                                                                                                     |
+|                               | -  fulfill (Implement the changes captured in the delivery service request. Currently limited to users with the operations role or above.)                                                                          |
+|                               | -  reject (Reject the changes captured in the delivery service request. Currently limited to users with the operations role or above.)                                                                              |
+|                               | -  delete (Delete the delivery service request. Currently limited to users with the portal role or above.)                                                                                                          |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Delivery service request management includes the ability to (where applicable):
+
+- create a new delivery service request
+- update an existing delivery service request
+- delete an existing delivery service request
+- update the status of a delivery service request
+- assign a delivery service request
+- reject a delivery service request
+- fulfill a delivery service request
+
+See :ref:`ds_requests` for details.
+
+Admin
+=====
 
-.. index::
-  Server Assignments
+.. image:: ./images/tp_menu_admin.png
 
-.. _tp-assign-edges:
+.. _tp-asns:
 
-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.
+ASNs
+++++
 
+A table of ASNs with the following columns:
 
-.. _tp-asn-czf:
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| ASN                           |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Cache Group                   |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
-The Coverage Zone File and ASN Table
-++++++++++++++++++++++++++++++++++++
-The Coverage Zone File (CZF) should contain a cachegroup name to network prefix mapping in the form: ::
+ASN management includes the ability to (where applicable):
 
-  {
-    "coverageZones": {
-      "cache-group-01": {
-        "network6": [
-          "1234:5678::\/64",
-          "1234:5679::\/64"
-        ],
-        "network": [
-          "192.168.8.0\/24",
-          "192.168.9.0\/24"
-        ]
-      }
-      "cache-group-02": {
-        "network6": [
-          "1234:567a::\/64",
-          "1234:567b::\/64"
-        ],
-        "network": [
-          "192.168.4.0\/24",
-          "192.168.5.0\/24"
-        ]
-      }
-    }
-  }
+- create a new ASN
+- update an existing ASN
+- delete an existing ASN
 
-The CZF is an input to the Traffic Control CDN, and as such does not get generated by Traffic Ops, but rather, it gets consumed by Traffic Router. Some popular IP management systems output a very similar file to the CZF but in stead of a cachegroup an ASN will be listed. Traffic Ops has the "Networks (ASNs)" view to aid with the conversion of files like that to a Traffic Control CZF file; this table is not used anywhere in Traffic Ops, but can be used to script the conversion using the API.
+.. _tp-cache-groups:
 
-The script that generates the CZF file is not part of Traffic Control, since it is different for each situation.
+Cache Groups
+++++++++++++
 
-.. _tp-working-with-profiles:
+A table of cache groups with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Short Name                    |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Type                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Latitude                      |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Longitude                     |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+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
+
+.. _tp-cdns:
+
+CDNs
+++++
+
+A table of CDNs with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Domain                        |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| DNSSEC Enabled                |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+CDN management includes the ability to (where applicable):
+
+- create a new CDN
+- update an existing CDN
+- delete an existing CDN
+- queue/clear updates on all servers in a CDN
+- diff CDN snapshot
+- create CDN snapshot
+- manage CDN DNSSEC keys
+- manage CDN federations
+- view CDN delivery services
+- view CDN profiles
+- view CDN servers
+
+.. _tp-divisions:
+
+Divisions
++++++++++
 
-Parameters and Profiles
-=======================
-Parameters are shared between profiles if the set of ``{ name, config_file, value }`` is the same. To change a value in one profile but not in others, the parameter has to be removed from the profile you want to change it in, and a new parameter entry has to be created (**Add Parameter** button at the bottom of the Parameters view), and assigned to that profile. It is easy to create new profiles from the **Misc > Profiles** view - just use the **Add/Copy Profile** button at the bottom of the profile view to copy an existing profile to a new one. Profiles can be exported from one system and imported to another using the profile view as well. It makes no sense for a parameter to not be assigned to a single profile - in that case it really has no function. To find parameters like that use the **Parameters > Orphaned Parameters** view. It is easy to create orphaned parameters by removing all profiles, or not assigning a profile directly after creating the parameter.
+A table of divisions with the following columns:
 
-.. seealso:: :ref:`rl-param-prof` in the *Configuring Traffic Ops* section.
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Division management includes the ability to (where applicable):
+
+- create a new division
+- update an existing division
+- delete an existing division
+- view division regions
+
+.. _tp-jobs:
+
+Jobs
+++++
+
+A table of invalidate content jobs with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Delivery Service              |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Asset URL                     |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Parameters                    |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Start                         |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Created By                    |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Job management includes the ability to (where applicable):
+
+- create a new invalidate content job
+
+.. _tp-phys-locations:
+
+Phys Locations
+++++++++++++++
+
+A table of physical locations with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Short Name                    |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Address                       |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| City                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| State                         |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Region                        |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Physical location management includes the ability to (where applicable):
+
+- create a new physical location
+- update an existing physical location
+- delete an existing physical location
+- view physical location servers
+
+.. _tp-parameters:
+
+Parameters
+++++++++++
+
+A table of parameters with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Config File                   |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Value                         |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Parameter management includes the ability to (where applicable):
+
+- create a new parameter
+- update an existing parameter
+- delete an existing parameter
+- view parameter profiles
+
+.. _tp-profiles:
+
+Profiles
+++++++++
+
+A table of profiles with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Type                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Routing Disabled              |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Description                   |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| CDN                           |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Profile management includes the ability to (where applicable):
+
+- create a new profile
+- update an existing profile
+- delete an existing profile
+- clone a profile
+- export a profile
+- view profile parameters
+- view profile delivery services
+- view profile servers
+
+See :ref:`rl-working-with-profiles` for details.
+
+.. _tp-regions:
+
+Regions
++++++++
+
+A table of regions with the following columns:
 
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Division                      |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Region management includes the ability to (where applicable):
+
+- create a new region
+- update an existing region
+- delete an existing region
+- view region physical locations
+
+.. _tp-servers:
 
+Servers
++++++++
+
+A table of servers with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| UPD                           |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Host                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Domain                        |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| IP                            |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| IPv6                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Status                        |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Type                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Profile                       |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| CDN                           |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Cache Group                   |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| ISO                           |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Server management includes the ability to (where applicable):
+
+- create a new server
+- update an existing server
+- delete an existing server
+- queue/clear updates on a server
+- update server status
+- view server delivery services
+- view server config files
+- clone delivery service assignments
+- assign delivery services to server
+
+.. _tp-statuses:
+
+Statuses
+++++++++
+
+A table of statuses with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Description                   |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Status management includes the ability to (where applicable):
+
+- create a new status
+- update an existing status
+- delete an existing status
+- view status servers
+
+.. _tp-tenants:
+
+Tenants
++++++++
+
+A table of tenants with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Active                        |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Parent                        |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Tenant management includes the ability to (where applicable):
+
+- create a new tenant
+- update an existing tenant
+- delete an existing tenant
+- view users assigned to a tenant
+- view delivery services assigned to a tenant
+
+.. _tp-types:
+
+Types
++++++
+
+A table of types with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Name                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Use In Table                  |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Description                   |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Type management includes the ability to (where applicable):
+
+- create a new type
+- update an existing type
+- delete an existing type
+- view delivery services assigned to a type
+- view servers assigned to a type
+- view cache groups assigned to a type
+
+.. _tp-users:
+
+Users
++++++
+
+A table of users with the following columns:
+
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|            Name               |                                                                                                     Description                                                                                                     |
++===============================+=====================================================================================================================================================================================================================+
+| Full Name                     |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Username                      |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Email                         |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Tenant                        |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Role                          |                                                                                                                                                                                                                     |
++-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+User management includes the ability to (where applicable):
+
+- register a new user
+- create a new user
+- update an existing user
+- view delivery services visible to a user
 
 Tools
-=====
+======
 
-.. index::
-  ISO
-  Generate ISO
+.. image:: ./images/tp_menu_tools.png
 
-.. _tp-generate-iso:
+.. _tp-gen-iso:
 
 Generate ISO
 ++++++++++++
 
-Generate ISO is a tool for building custom ISOs for building caches on remote hosts. Currently supports Centos 6 and 7, but if you're brave and pure of heart you MIGHT be able to get it to work with other unix-like OS's.
-
-The interface is *mostly* self explainatory as it's got hints.
-
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| Field                         |  Explaination                                                                                                                   |
-+===============================+=================================================================================================================================+
-|Choose a server from list:     | This option gets all the server names currently in the Traffic Ops database and will autofill known values.                     |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| OS Version:                   | There needs to be an _osversions.cfg_ file in the ISO directory that maps the name of a directory to a name that shows up here. |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| Hostname:                     | This is the FQDN of the server to be installed. It is required.                                                                 |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| Root password:                | If you don't put anything here it will default to the salted MD5 of "Fred". Whatever put is MD5 hashed and writte to disk.      |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| DHCP:                         | if yes, other IP settings will be ignored                                                                                       |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| IP Address:                   | Required if DHCP=no                                                                                                             |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| Netmask:                      | Required if DHCP=no                                                                                                             |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| Gateway:                      | Required if DHCP=no                                                                                                             |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| IPV6 Address:                 | Optional. /64 is assumed if prefix is omitted                                                                                   |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| IPV6 Gateway:                 | Ignored if an IPV4 gateway is specified                                                                                         |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| Network Device:               | Optional. Typical values are bond0, eth4, etc. Note: if you enter bond0, a LACP bonding config will be written                  |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| MTU:                          | If unsure, set to 1500                                                                                                          |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-| Specify disk for OS install:  | Optional. Typical values are "sda".                                                                                             |
-+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------+
-
-
-When you click the **Download ISO** button the folling occurs (all paths relative to the top level of the directory specified in _osversions.cfg_):
-
-#. Reads /etc/resolv.conf to get a list of nameservers. This is a rather ugly hack that is in place until we get a way of configuring it in the interface.
-#. Writes a file in the ks_scripts/state.out that contains directory from _osversions.cfg_ and the mkisofs string that we'll call later.
-#. Writes a file in the ks_scripts/network.cfg that is a bunch of key=value pairs that set up networking.
-#. Creates an MD5 hash of the password you specify and writes it to ks_scripts/password.cfg. Note that if you do not specify a password "Fred" is used. Also note that we have experienced some issues with webbrowsers autofilling that field.
-#. Writes out a disk configuration file to ks_scripts/disk.cfg.
-#. mkisofs is called against the directory configured in _osversions.cfg_ and an ISO is generated in memory and delivered to your webbrowser.
-
-You now have a customized ISO that can be used to install Red Hat and derivative Linux installations with some modifications to your ks.cfg file.
-
-Kickstart/Anaconda will mount the ISO at /mnt/stage2 during the install process (at least with 6).
-
-You can directly include the password file anywhere in your ks.cfg file (usually in the top) by doing %include /mnt/stage2/ks_scripts/password.cfg
-
-What we currently do is have 2 scripts, one to do hard drive configuration and one to do network configuration. Both are relatively specific to the environment they were created in, and both are *probably* wrong for other organizations, however they are currently living in the "misc" directory as examples of how to do things.
-
-We trigger those in a %pre section in ks.cfg and they will write config files to /tmp. We will then include those files in the appropriate places using  %pre.
-
-For example this is a section of our ks.cfg file: ::
-
-  %include /mnt/stage2/ks_scripts/packages.txt
-
-  %pre
-    python /mnt/stage2/ks_scripts/create_network_line.py
-    bash /mnt/stage2/ks_scripts/drive_config.sh
-  %end
-
-These two scripts will then run _before_ anaconda sets up it's internal structures, then a bit further up in the ks.cfg file (outside of the %pre %end block) we do an ::
-
-    %include /mnt/stage2/ks_scripts/password.cfg
-    ...
-    %include /tmp/network_line
-
-    %include /tmp/drive_config
-    ...
-
-This snarfs up the contents and inlines them.
-
-If you only have one kind of hardware on your CDN it is probably best to just put the drive config right in the ks.cfg.
-
-If you have simple networking needs (we use bonded interfaces in most, but not all locations and we have several types of hardware meaning different ethernet interface names at the OS level etc.) then something like this: ::
-
-  #!/bin/bash
-  source /mnt/stage2/ks_scripts/network.cfg
-  echo "network --bootproto=static --activate --ipv6=$IPV6ADDR --ip=$IPADDR --netmask=$NETMASK --gateway=$GATEWAY --ipv6gateway=$GATEWAY --nameserver=$NAMESERVER --mtu=$MTU --hostname=$HOSTNAME" >> /tmp/network.cfg
-  # Note that this is an example and may not work at all.
-
-
-You could also put this in the %pre section. Lots of ways to solve it.
-
-We have included the two scripts we use in the "misc" directory of the git repo:
-
-* kickstart_create_network_line.py
-* kickstart_drive_config.sh
-
-These scripts were written to support a very narrow set of expectations and environment and are almost certainly not suitable to just drop in, but they might provide a good starting point.
-
-.. _tp-queue-updates:
-
-Queue Updates and Snapshot CRConfig
-+++++++++++++++++++++++++++++++++++
-When changing delivery services special care has to be taken so that Traffic Router will not send traffic to caches for delivery services that the cache doesn't know about yet. In general, when adding delivery services, or adding servers to a delivery service, it is best to update the caches before updating Traffic Router and Traffic Monitor. When deleting delivery services, or deleting server assignments to delivery services, it is best to update Traffic Router and Traffic Monitor first and then the caches. Updating the cache configuration is done through the *Queue Updates* menu, and updating Traffic Monitor and  Traffic Router config is done through the *Snapshot CRConfig* menu.
-
-.. index::
-  Cache Updates
-  Queue Updates
-
-Queue Updates
-^^^^^^^^^^^^^
-Every 15 minutes the caches should run a *syncds* to get all changes needed from Traffic Ops. The files that will be updated by the syncds job are:
-
-- records.config
-- remap.config
-- parent.config
-- cache.config
-- hosting.config
-- url\_sig\_(.*)\.config
-- hdr\_rw\_(.*)\.config
-- regex_revalidate.config
-- ip_allow.config
+See :ref:`rl-generate-iso`
 
-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:
 
-  #. Click **Tools > Queue Updates**.
-  #. Select the CDN to queueu uodates for, or All.
-  #. Select the cache group to queue updates for, or All
-  #. Click the **Queue Updates** button.
-  #. When the Queue Updates for this Server? (all) window opens, click **OK**.
-
-To schedule updates for just one cache, use the "Server Checks" page, and click the |checkmark| in the *UPD* column. The UPD column of Server Checks page will change show a |clock| when updates are pending for that cache.
-
-
-.. index::
-  Snapshot CRConfig
-
-.. _tp-snapshot-crconfig:
-
-Snapshot CRConfig
-^^^^^^^^^^^^^^^^^
-
-Every 60 seconds Traffic Monitor will check with Traffic Ops to see if a new CRConfig snapshot exists; Traffic Monitor polls Traffic Ops for a new CRConfig, and Traffic Router polls Traffic Monitor for the same file. This is necessary to ensure that Traffic Monitor sees configuration changes first, which helps to ensure that the health and state of caches and delivery services propagates properly to Traffic Router. See :ref:`tp-ccr-profile` for more information on the CRConfig file.
-
-To create a new snapshot, use the *Tools > Snapshot CRConfig* menu:
-
-  #. Click **Tools > Snapshot CRConfig**.
-  #. Verify the selection of the correct CDN from the Choose CDN drop down and click **Diff CRConfig**.
-     On initial selection of this, the CRConfig Diff window says the following:
-
-     There is no existing CRConfig for [cdn] to diff against... Is this the first snapshot???
-     If you are not sure why you are getting this message, please do not proceed!
-     To proceed writing the snapshot anyway click the 'Write CRConfig' button below.
-
-     If there is an older version of the CRConfig, a window will pop up showing the differences
-     between the active CRConfig and the CRConfig about to be written.
-
-  #. Click **Write CRConfig**.
-  #. When the This will push out a new CRConfig.json. Are you sure? window opens, click **OK**.
-  #. The Successfully wrote CRConfig.json! window opens, click **OK**.
-
-
-.. index::
-  Invalidate Content
-  Purge
-
-.. _tp-purge:
-
-Invalidate Content
-==================
-Invalidating content on the CDN is sometimes necessary when the origin was mis-configured and something is cached in the CDN  that needs to be removed. Given the size of a typical Traffic Control CDN and the amount of content that can be cached in it, removing the content from all the caches may take a long time. To speed up content invalidation, Traffic Ops will not try to remove the content from the caches, but it makes the content inaccessible using the *regex_revalidate* ATS plugin. This forces a *revalidation* of the content, rather than a new get.
-
-.. Note:: This method forces a HTTP *revalidation* of the content, and not a new *GET* - the origin needs to support revalidation according to the HTTP/1.1 specification, and send a ``200 OK`` or ``304 Not Modified`` as applicable.
-
-To invalidate content:
-
-  1. Click **Tools > Invalidate Content**
-  2. Fill out the form fields:
-
-    - Select the **Delivery Service**
-    - Enter the **Path Regex** - this should be a `PCRE <http://www.pcre.org/>`_ compatible regular expression for the path to match for forcing the revalidation. Be careful to only match on the content you need to remove - revalidation is an expensive operation for many origins, and a simple ``/.*`` can cause an overload condition of the origin.
-    - Enter the **Time To Live** - this is how long the revalidation rule will be active for. It usually makes sense to make this the same as the ``Cache-Control`` header from the origin which sets the object time to live in cache (by ``max-age`` or ``Expires``). Entering a longer TTL here will make the caches do unnecessary work.
-    - Enter the **Start Time** - this is the start time when the revalidation rule will be made active. It is pre-populated with the current time, leave as is to schedule ASAP.
-
-  3. Click the **Submit** button.
-
-.. _tp-manage-dnssec-keys:
-
-Manage DNSSEC Keys
-====================
-
-In order to support `DNSSEC <https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions>`_ in Traffic Router, Traffic Ops provides some actions for managing DNSSEC keys for a CDN and associated Delivery Services.  DNSSEC Keys consist of a Key Signing Keys (KSK) which are used to sign other DNSKEY records as well as Zone Signing Keys (ZSK) which are used to sign other records.  DNSSEC Keys are stored in `Traffic Vault <../../overview/traffic_vault.html>`_ and should only be accessible to Traffic Ops.  Other applications needing access to this data, such as Traffic Router, must use the Traffic Ops `DNSSEC APIs <../../development/traffic_ops_api/v12/cdn.html#dnssec-keys>`_ to retrieve this information.
-
-To Manage DNSSEC Keys:
-  1. Click **Tools -> Manage DNSSEC Keys**
-  2. Choose a CDN and click **Manage DNSSEC Keys**
-
-    - If keys have not yet been generated for a CDN, this screen will be mostly blank with just the **CDN** and **DNSSEC Active?** fields being populated.
-    - If keys have been generated for the CDN, the Manage DNSSEC Keys screen will show the TTL and Top Level Domain (TLD) KSK Expiration for the CDN as well as DS Record information which will need to be added to the parent zone of the TLD in order for DNSSEC to work.
-
-The Manage DNSSEC Keys screen also allows a user to perform the following actions:
-
-**Activate/Deactivate DNSSEC for a CDN**
+Other
+=====
 
-Fairly straight forward, this button set the **dnssec.enabled** param to either **true** or **false** on the Traffic Router profile for the CDN.  The Activate/Deactivate option is only available if DNSSEC keys exist for CDN.  In order to active DNSSEC for a CDN a user must first generate keys and then click the **Active DNSSEC** button.
+.. image:: ./images/tp_menu_other.png
 
-**Generate Keys**
+.. _tp-menu-other:
 
-Generate Keys will generate DNSSEC keys for the CDN TLD as well as for each Delivery Service in the CDN.  It is important to note that this button will create a new KSK for the TLD and, therefore, a new DS Record.  Any time a new DS Record is created, it will need to be added to the parent zone of the TLD in order for DNSSEC to work properly.  When a user clicks the **Generate Keys** button, they will be presented with a screen with the following fields:
+Custom Menu Items
++++++++++++++++++
 
-  - **CDN:** This is not editable and displays the CDN for which keys will be generated
-  - **ZSK Expiration (Days):**  Sets how long (in days) the Zone Signing Key will be valid for the CDN and associated Delivery Services. The default is 30 days.
-  - **KSK Expiration (Days):**  Sets how long (in days) the Key Signing Key will be valid for the CDN and associated Delivery Services. The default is 365 days.
-  - **Effective Date (GMT):** The time from which the new keys will be active.  Traffic Router will use this value to determine when to start signing with the new keys and stop signing with the old keys.
+This section is configurable in tp.domain.com/traffic_portal_properties.json in the customMenu section.
 
-Once these fields have been correctly entered, a user can click Generate Keys.  The user will be presented with a confirmation screen to help them understand the impact of generating the keys.  If a user confirms, the keys will be generated and stored in Traffic Vault.
 
-**Regenerate KSK**
 
-Regenerate KSK will create a new Key Signing Key for the CDN TLD. A new DS Record will also be generated and need to be put into the parent zone in order for DNSSEC to work correctly. The **Regenerate KSK** button is only available if keys have already been generated for a CDN.  The intent of the button is to provide a mechanism for generating a new KSK when a previous one expires or if necessary for other reasons such as a security breach.  When a user goes to generate a new KSK they are presented with a screen with the following options:
 
-  - **CDN:** This is not editable and displays the CDN for which keys will be generated
-  - **KSK Expiration (Days):**  Sets how long (in days) the Key Signing Key will be valid for the CDN and associated Delivery Services. The default is 365 days.
-  - **Effective Date (GMT):** The time from which the new KSK and DS Record will be active.  Since generating a new KSK will generate a new DS Record that needs to be added to the parent zone, it is very important to make sure that an effective date is chosen that allows for time to get the DS Record into the parent zone.  Failure to get the new DS Record into the parent zone in time could result in DNSSEC errors when Traffic Router tries to sign responses.
 
-Once these fields have been correctly entered, a user can click Generate KSK.  The user will be presented with a confirmation screen to help them understand the impact of generating the KSK.  If a user confirms, the KSK will be generated and stored in Traffic Vault.
 
-Additionally, Traffic Ops also performs some systematic management of DNSSEC keys.  This management is necessary to help keep keys in sync for Delivery Services in a CDN as well as to make sure keys do not expire without human intervention.
 
-**Generation of keys for new Delivery Services**
 
-If a new Delivery Service is created and added to a CDN that has DNSSEC enabled, Traffic Ops will create DNSSEC keys for the Delivery Service and store them in Traffic Vault.
 
-**Regeneration of expiring keys for a Delivery Service**
 
-Traffic Ops has a process, controlled by cron, to check for expired or expiring keys and re-generate them.  The process runs at 5 minute intervals to check and see if keys are expired or close to expiring (withing 10 minutes by default).  If keys are expired for a Delivery Service, traffic ops will regenerate new keys and store them in Traffic Vault.  This process is the same for the CDN TLD ZSK, however Traffic Ops will not re-generate the CDN TLD KSK systematically.  The reason is that when a KSK is regenerated for the CDN TLD then a new DS Record will also be created.  The new DS Record needs to be added to the parent zone before Traffic Router attempts to sign with the new KSK in order for DNSSEC to work correctly.  Therefore, management of the KSK needs to be a manual process.
 
 
 
diff --git a/traffic_portal/app/src/app.js b/traffic_portal/app/src/app.js
index fdb5766aff..d5530d59c0 100644
--- a/traffic_portal/app/src/app.js
+++ b/traffic_portal/app/src/app.js
@@ -80,6 +80,9 @@ var trafficPortal = angular.module('trafficPortal', [
         require('./modules/private/changeLogs/list').name,
         require('./modules/private/dashboard').name,
         require('./modules/private/dashboard/view').name,
+        require('./modules/private/deliveryServiceRequests').name,
+        require('./modules/private/deliveryServiceRequests/edit').name,
+        require('./modules/private/deliveryServiceRequests/list').name,
         require('./modules/private/deliveryServices').name,
         require('./modules/private/deliveryServices/clone').name,
         require('./modules/private/deliveryServices/compare').name,
@@ -277,6 +280,7 @@ var trafficPortal = angular.module('trafficPortal', [
         require('./common/modules/table/deliveryServices').name,
         require('./common/modules/table/deliveryServiceJobs').name,
         require('./common/modules/table/deliveryServiceRegexes').name,
+        require('./common/modules/table/deliveryServiceRequests').name,
         require('./common/modules/table/deliveryServiceServers').name,
         require('./common/modules/table/deliveryServiceStaticDnsEntries').name,
         require('./common/modules/table/deliveryServiceTargets').name,
diff --git a/traffic_portal/app/src/common/api/DeliveryServiceRequestService.js b/traffic_portal/app/src/common/api/DeliveryServiceRequestService.js
new file mode 100644
index 0000000000..d2674871d4
--- /dev/null
+++ b/traffic_portal/app/src/common/api/DeliveryServiceRequestService.js
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+var DeliveryServiceRequestService = function(Restangular, $http, $q, locationUtils, messageModel, ENV) {
+
+	this.getDeliveryServiceRequests = function(queryParams) {
+		return Restangular.all('deliveryservice_requests').getList(queryParams);
+	};
+
+	this.createDeliveryServiceRequest = function(dsRequest, delay) {
+		return Restangular.service('deliveryservice_requests').post(dsRequest)
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Created request to ' + dsRequest.changeType + ' the ' + dsRequest.deliveryService.xmlId + ' delivery service' } ], delay);
+					locationUtils.navigateToPath('/delivery-service-requests');
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+				}
+			);
+	};
+
+	this.updateDeliveryServiceRequest = function(id, dsRequest) {
+		var request = $q.defer();
+
+		$http.put(ENV.api['root'] + "deliveryservice_requests/" + id, dsRequest)
+			.then(
+				function() {
+					request.resolve();
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+					request.reject();
+				}
+			);
+
+		return request.promise;
+	};
+
+	this.deleteDeliveryServiceRequest = function(id, delay) {
+		return Restangular.one("deliveryservice_requests", id).remove()
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Delivery service request deleted' } ], delay);
+					locationUtils.navigateToPath('/delivery-service-requests');
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+				}
+			);
+	};
+
+	this.assignDeliveryServiceRequest = function(id, userId) {
+		var request = $q.defer();
+
+		$http.put(ENV.api['root'] + "deliveryservice_requests/" + id + "/assign", { id: id, assigneeId: userId })
+			.then(
+				function() {
+					request.resolve();
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+					request.reject();
+				}
+			);
+
+		return request.promise;
+	};
+
+	this.updateDeliveryServiceRequestStatus = function(id, status) {
+		var request = $q.defer();
+
+		$http.put(ENV.api['root'] + "deliveryservice_requests/" + id + "/status", { id: id, status: status })
+			.then(
+				function() {
+					request.resolve();
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+					request.reject();
+				}
+			);
+
+		return request.promise;
+	};
+
+};
+
+DeliveryServiceRequestService.$inject = ['Restangular', '$http', '$q', 'locationUtils', 'messageModel', 'ENV'];
+module.exports = DeliveryServiceRequestService;
diff --git a/traffic_portal/app/src/common/api/DeliveryServiceService.js b/traffic_portal/app/src/common/api/DeliveryServiceService.js
index 40a3dc13a6..631272b7e9 100644
--- a/traffic_portal/app/src/common/api/DeliveryServiceService.js
+++ b/traffic_portal/app/src/common/api/DeliveryServiceService.js
@@ -27,11 +27,11 @@ var DeliveryServiceService = function(Restangular, $http, $q, locationUtils, htt
         return Restangular.one("deliveryservices", id).get();
     };
 
-    this.createDeliveryService = function(deliveryService) {
-        return Restangular.service('deliveryservices').post(deliveryService)
+    this.createDeliveryService = function(ds) {
+        return Restangular.service('deliveryservices').post(ds)
             .then(
                 function(response) {
-                    messageModel.setMessages([ { level: 'success', text: 'DeliveryService created' } ], true);
+                    messageModel.setMessages([ { level: 'success', text: 'Delivery Service [ ' + ds.xmlId + ' ] created' } ], true);
                     locationUtils.navigateToPath('/delivery-services/' + response.id + '?type=' + response.type);
                 },
                 function(fault) {
@@ -40,23 +40,29 @@ var DeliveryServiceService = function(Restangular, $http, $q, locationUtils, htt
             );
     };
 
-    this.updateDeliveryService = function(deliveryService) {
-        return deliveryService.put()
+    this.updateDeliveryService = function(ds, delay) {
+        var request = $q.defer();
+
+        $http.put(ENV.api['root'] + "deliveryservices/" + ds.id, ds)
             .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Delivery service updated' } ], false);
+                function(response) {
+                    var response2 = response.data.response[0];
+                    messageModel.setMessages([ { level: 'success', text: 'Delivery Service [ ' + ds.xmlId + ' ] updated' } ], delay);
+                    locationUtils.navigateToPath('/delivery-services/' + response2.id + '?type=' + response2.type);
                 },
                 function(fault) {
                     messageModel.setMessages(fault.data.alerts, false);
                 }
             );
+
+        return request.promise;
     };
 
-    this.deleteDeliveryService = function(id) {
-        return Restangular.one("deliveryservices", id).remove()
+    this.deleteDeliveryService = function(ds, delay) {
+        return Restangular.one("deliveryservices", ds.id).remove()
             .then(
                 function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Delivery service deleted' } ], true);
+                    messageModel.setMessages([ { level: 'success', text: 'Delivery service [ ' + ds.xmlId + ' ] deleted' } ], delay);
                 },
                 function(fault) {
                     messageModel.setMessages(fault.data.alerts, true);
diff --git a/traffic_portal/app/src/common/api/index.js b/traffic_portal/app/src/common/api/index.js
index 5562c53cc7..3942a76479 100644
--- a/traffic_portal/app/src/common/api/index.js
+++ b/traffic_portal/app/src/common/api/index.js
@@ -27,6 +27,7 @@ module.exports = angular.module('trafficPortal.api', [])
     .service('changeLogService', require('./ChangeLogService'))
     .service('deliveryServiceService', require('./DeliveryServiceService'))
 	.service('deliveryServiceRegexService', require('./DeliveryServiceRegexService'))
+	.service('deliveryServiceRequestService', require('./DeliveryServiceRequestService'))
     .service('deliveryServiceUrlSigKeysService', require('./DeliveryServiceUrlSigKeysService'))
     .service('deliveryServiceUriSigningKeysService', require('./DeliveryServiceUriSigningKeysService'))
     .service('deliveryServiceSslKeysService', require('./DeliveryServiceSslKeysService'))
diff --git a/traffic_portal/app/src/common/modules/form/_form.scss b/traffic_portal/app/src/common/modules/form/_form.scss
new file mode 100644
index 0000000000..a35b3c5a1f
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/_form.scss
@@ -0,0 +1,21 @@
+/*
+
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+.btn-link.request-status {
+  font-size: 20px;
+  color: #cd1323;
+}
\ No newline at end of file
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js b/traffic_portal/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
index 75bb7ad462..43374a303c 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-var FormDeliveryServiceController = function(deliveryService, type, types, $scope, $location, $uibModal, $window, formUtils, locationUtils, tenantUtils, cdnService, profileService, tenantService, propertiesModel) {
+var FormDeliveryServiceController = function(deliveryService, dsCurrent, type, types, $scope, $location, $uibModal, $window, formUtils, locationUtils, tenantUtils, cdnService, profileService, tenantService, propertiesModel) {
 
     var getCDNs = function() {
         cdnService.getCDNs()
@@ -45,15 +45,19 @@ var FormDeliveryServiceController = function(deliveryService, type, types, $scop
 
     $scope.deliveryService = deliveryService;
 
+    $scope.dsCurrent = dsCurrent; // this ds is used primarily for showing the diff between a ds request and the current DS
+
     $scope.showChartsButton = propertiesModel.properties.deliveryServices.charts.show;
 
-    $scope.manageKeys = {
-        sslKeys: deliveryService.protocol > 0,
-        urlSigKeys: deliveryService.signingAlgorithm == 'url_sig',
-        uriSigningKeys: deliveryService.signingAlgorithm == 'uri_signing'
-    };
+    $scope.dsRequestsEnabled = propertiesModel.properties.dsRequests.enabled;
+
+	$scope.manageKeys = {
+		sslKeys: deliveryService.protocol > 0,
+		urlSigKeys: deliveryService.signingAlgorithm == 'url_sig',
+		uriSigningKeys: deliveryService.signingAlgorithm == 'uri_signing'
+	};
 
-    $scope.edgeFQDNs = function(ds) {
+	$scope.edgeFQDNs = function(ds) {
         var urlString = '';
         if (_.isArray(ds.exampleURLs) && ds.exampleURLs.length > 0) {
             for (var i = 0; i < ds.exampleURLs.length; i++) {
@@ -63,6 +67,22 @@ var FormDeliveryServiceController = function(deliveryService, type, types, $scop
         return urlString;
     };
 
+    $scope.DRAFT = 0;
+    $scope.SUBMITTED = 1;
+    $scope.REJECTED = 2;
+    $scope.PENDING = 3;
+    $scope.COMPLETE = 4;
+
+    $scope.saveable = function() {
+        // this may be overriden in a child class. i.e. FormEditDeliveryServiceController
+        return true;
+    };
+
+    $scope.deletable = function() {
+        // this may be overriden in a child class. i.e. FormEditDeliveryServiceController
+        return true;
+    };
+
     $scope.types = _.filter(types, function(currentType) {
         var category;
         if (type.indexOf('ANY_MAP') != -1) {
@@ -123,27 +143,27 @@ var FormDeliveryServiceController = function(deliveryService, type, types, $scop
     ];
 
     $scope.dscps = [
-        { value: 0, label: '0  - Best Effort' },
+        { value: 0, label: '0 - Best Effort' },
         { value: 10, label: '10 - AF11' },
         { value: 12, label: '12 - AF12' },
         { value: 14, label: '14 - AF13' },
-        { value: 18, label: '18  - AF21' },
-        { value: 20, label: '20  - AF22' },
-        { value: 22, label: '22  - AF23' },
-        { value: 26, label: '26  - AF31' },
-        { value: 28, label: '28  - AF32' },
-        { value: 30, label: '30  - AF33' },
-        { value: 34, label: '34  - AF41' },
-        { value: 36, label: '36  - AF42' },
-        { value: 37, label: '37  - ' },
-        { value: 38, label: '38  - AF43' },
-        { value: 8, label: '8  - CS1' },
-        { value: 16, label: '16  - CS2' },
-        { value: 24, label: '24  - CS3' },
-        { value: 32, label: '32  - CS4' },
-        { value: 40, label: '40  - CS5' },
-        { value: 48, label: '48  - CS6' },
-        { value: 56, label: '56  - CS7' }
+        { value: 18, label: '18 - AF21' },
+        { value: 20, label: '20 - AF22' },
+        { value: 22, label: '22 - AF23' },
+        { value: 26, label: '26 - AF31' },
+        { value: 28, label: '28 - AF32' },
+        { value: 30, label: '30 - AF33' },
+        { value: 34, label: '34 - AF41' },
+        { value: 36, label: '36 - AF42' },
+        { value: 37, label: '37 - ' },
+        { value: 38, label: '38 - AF43' },
+        { value: 8, label: '8 - CS1' },
+        { value: 16, label: '16 - CS2' },
+        { value: 24, label: '24 - CS3' },
+        { value: 32, label: '32 - CS4' },
+        { value: 40, label: '40 - CS5' },
+        { value: 48, label: '48 - CS6' },
+        { value: 56, label: '56 - CS7' }
     ];
 
     $scope.deepCachingTypes = [
@@ -178,6 +198,10 @@ var FormDeliveryServiceController = function(deliveryService, type, types, $scop
         { value: 4, label: "4 - Latch on Failover" }
     ];
 
+    $scope.label = function(field, attribute) {
+        return propertiesModel.properties.defaults.deliveryservices.descriptions[field][attribute];
+    };
+
     $scope.tenantLabel = function(tenant) {
         return '-'.repeat(tenant.level) + ' ' + tenant.name;
     };
@@ -268,5 +292,5 @@ var FormDeliveryServiceController = function(deliveryService, type, types, $scop
 
 };
 
-FormDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$location', '$uibModal', '$window', 'formUtils', 'locationUtils', 'tenantUtils', 'cdnService', 'profileService', 'tenantService', 'propertiesModel'];
+FormDeliveryServiceController.$inject = ['deliveryService', 'dsCurrent', 'type', 'types', '$scope', '$location', '$uibModal', '$window', 'formUtils', 'locationUtils', 'tenantUtils', 'cdnService', 'profileService', 'tenantService', 'propertiesModel'];
 module.exports = FormDeliveryServiceController;
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js b/traffic_portal/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
index b0966d4c23..1c728d0617 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
@@ -17,35 +17,14 @@
  * under the License.
  */
 
-var FormEditDeliveryServiceController = function(deliveryService, type, types, $scope, $state, $controller, $uibModal, locationUtils, deliveryServiceService) {
+var FormEditDeliveryServiceController = function(deliveryService, type, types, $scope, $state, $controller, $uibModal, locationUtils, deliveryServiceService, deliveryServiceRequestService) {
 
 	// extends the FormDeliveryServiceController to inherit common methods
-	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: deliveryService, type: type, types: types, $scope: $scope }));
+	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: deliveryService, dsCurrent: deliveryService, type: type, types: types, $scope: $scope }));
 
-	var deleteDeliveryService = function(deliveryService) {
-		deliveryServiceService.deleteDeliveryService(deliveryService.id)
-			.then(function() {
-				locationUtils.navigateToPath('/delivery-services');
-			});
-	};
-
-	$scope.deliveryServiceName = angular.copy(deliveryService.xmlId);
-
-	$scope.settings = {
-		isNew: false,
-		saveLabel: 'Update'
-	};
-
-	$scope.save = function(deliveryService) {
-		deliveryServiceService.updateDeliveryService(deliveryService).
-			then(function() {
-				$state.reload(); // reloads all the resolves for the view
-			});
-	};
-
-	$scope.confirmDelete = function(deliveryService) {
+	var createDeliveryServiceDeleteRequest = function(deliveryService) {
 		var params = {
-			title: 'Delete Delivery Service: ' + deliveryService.displayName,
+			title: 'Delete Delivery Service: ' + deliveryService.xmlId,
 			key: deliveryService.xmlId
 		};
 		var modalInstance = $uibModal.open({
@@ -59,13 +38,97 @@ var FormEditDeliveryServiceController = function(deliveryService, type, types, $
 			}
 		});
 		modalInstance.result.then(function() {
-			deleteDeliveryService(deliveryService);
+			var dsRequest = {
+				changeType: 'delete',
+				status: 'submitted',
+				deliveryService: deliveryService
+			};
+			deliveryServiceRequestService.createDeliveryServiceRequest(dsRequest, true);
 		}, function () {
 			// do nothing
 		});
 	};
 
+	$scope.deliveryServiceName = angular.copy(deliveryService.xmlId);
+
+	$scope.settings = {
+		isNew: false,
+		isRequest: false,
+		saveLabel: 'Update',
+		deleteLabel: 'Delete'
+	};
+
+	$scope.save = function(deliveryService) {
+		if ($scope.dsRequestsEnabled) {
+			var params = {
+				title: "Delivery Service Update Request",
+				message: 'All delivery service updates must be reviewed for completeness and accuracy before deployment.<br><br>Please select the status of your delivery service update request.'
+			};
+			var modalInstance = $uibModal.open({
+				templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+				controller: 'DialogSelectController',
+				size: 'md',
+				resolve: {
+					params: function () {
+						return params;
+					},
+					collection: function() {
+						return [
+							{ id: $scope.DRAFT, name: 'Save as Draft' },
+							{ id: $scope.SUBMITTED, name: 'Submit for Review and Deployment' }
+						];
+					}
+				}
+			});
+			modalInstance.result.then(function(action) {
+				var dsRequest = {
+					changeType: 'update',
+					status: (action.id == $scope.SUBMITTED) ? 'submitted' : 'draft',
+					deliveryService: deliveryService
+				};
+				deliveryServiceRequestService.createDeliveryServiceRequest(dsRequest, true);
+			}, function () {
+				// do nothing
+			});
+		} else {
+			deliveryServiceService.updateDeliveryService(deliveryService, false).
+				then(function() {
+					$state.reload(); // reloads all the resolves for the view
+				});
+		}
+	};
+
+	$scope.confirmDelete = function(deliveryService) {
+		if ($scope.dsRequestsEnabled) {
+			createDeliveryServiceDeleteRequest(deliveryService);
+		} else {
+			var params = {
+				title: 'Delete Delivery Service: ' + deliveryService.displayName,
+				key: deliveryService.xmlId
+			};
+			var modalInstance = $uibModal.open({
+				templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+				controller: 'DialogDeleteController',
+				size: 'md',
+				resolve: {
+					params: function () {
+						return params;
+					}
+				}
+			});
+			modalInstance.result.then(function() {
+				deliveryServiceService.deleteDeliveryService(deliveryService, true)
+					.then(function() {
+						locationUtils.navigateToPath('/delivery-services');
+					});
+			}, function () {
+				// do nothing
+			});
+		}
+
+	};
+
 };
 
-FormEditDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$state', '$controller', '$uibModal', 'locationUtils', 'deliveryServiceService'];
+FormEditDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$state', '$controller', '$uibModal', 'locationUtils', 'deliveryServiceService', 'deliveryServiceRequestService'];
 module.exports = FormEditDeliveryServiceController;
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
index afdbfb2998..a4a7573c5e 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
@@ -20,10 +20,15 @@
 <div class="x_panel">
     <div class="x_title">
         <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
+            <li ng-if="!settings.isRequest"><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
+            <li ng-if="settings.isRequest"><a ng-click="navigateToPath('/delivery-service-requests')">Delivery Service Requests</a></li>
+            <li ng-if="settings.isRequest" class="active">{{changeType}}</li>
             <li class="active">{{deliveryServiceName}}</li>
         </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
+        <div class="pull-right" role="group" ng-if="settings.isRequest">
+            <button class="btn btn-link request-status" title="Edit Status" ng-disabled="!open()" ng-click="editStatus()">[ {{requestStatus}} ]</button>
+        </div>
+        <div class="pull-right" role="group" ng-show="!settings.isRequest && !settings.isNew">
             <button type="button" class="btn btn-primary" title="Delivery Service Charts" ng-if="showChartsButton" ng-click="openCharts(deliveryService)"><i class="fa fa-bar-chart fa-fw"></i></button>
             <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
                 <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
@@ -51,97 +56,124 @@
         <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('active', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('active', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.active != dsCurrent.active">Current Value: [ {{dsCurrent.active}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type), 'has-feedback': hasError(deliveryServiceForm.type)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('typeId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('typeId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.typeId != dsCurrent.typeId">Current Value: [ {{dsCurrent.type}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Key (XML ID) *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('xmlId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('xmlId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input name="xmlId" type="text" class="form-control" placeholder="Unique id used for the delivery service" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" ng-readonly="!settings.isNew" autofocus>
+                    <input name="xmlId" type="text" class="form-control" placeholder="Unique id used for the delivery service" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" ng-readonly="(!settings.isRequest && !settings.isNew) || (settings.isRequest && changeType == 'update')" autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.xmlId != dsCurrent.xmlId">Current Value: [ {{dsCurrent.xmlId}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('displayName', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('displayName', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-maxlength="48" required autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.displayName != dsCurrent.displayName">Current Value: [ {{dsCurrent.displayName}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.tenantId), 'has-feedback': hasError(deliveryServiceForm.tenantId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Tenant *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('tenantId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('tenantId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="tenantId" class="form-control" ng-model="deliveryService.tenantId" ng-options="tenant.id as tenantLabel(tenant) for tenant in tenants" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.tenantId, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.tenantId != dsCurrent.tenantId">Current Value: [ {{dsCurrent.tenant}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('cdnId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('cdnId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.cdnId != dsCurrent.cdnId">Current Value: [ {{dsCurrent.cdnName}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.orgServerFqdn), 'has-feedback': hasError(deliveryServiceForm.orgServerFqdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Server Base URL *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('orgServerFqdn', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('orgServerFqdn', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="orgServerFqdn" type="text" class="form-control" placeholder="http(s)//:" ng-model="deliveryService.orgServerFqdn" ng-pattern="/^(https?:\/\/)/" required autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'pattern')">Must start with http:// or https://</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.orgServerFqdn != dsCurrent.orgServerFqdn">Current Value: [ {{dsCurrent.orgServerFqdn}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.orgServerFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('protocol', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('protocol', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.protocol != dsCurrent.protocol">Current Value: [ {{magicNumberLabel(protocols, dsCurrent.protocol)}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('longDesc', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('longDesc', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus required>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc != dsCurrent.longDesc">Current Value: [ {{dsCurrent.longDesc}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
-            <div class="form-group" ng-if="!settings.isNew && deliveryService.exampleURLs.length > 0">
+            <div class="form-group" ng-if="!settings.isNew && !settings.isRequest">
                 <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service URLs</label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <textarea name="edgeFQDNs" rows="4" cols="17" class="form-control readonly" readonly>{{edgeFQDNs(deliveryService)}}</textarea>
@@ -151,327 +183,432 @@
             <div ng-show="advancedShowing">
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.routingName), 'has-feedback': hasError(deliveryServiceForm.routingName)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Routing Name *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('routingName', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('routingName', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <small class="input-warning" ng-show="!settings.isNew && deliveryServiceForm.routingName.$dirty">Warning: Changing the routing name may require SSL certificates to be updated.</small>
                         <input name="routingName" type="text" class="form-control" placeholder="Routing name used for the delivery service resulting in FQDN = <routing name>.<key>.<CDN domain>" ng-model="deliveryService.routingName" ng-maxlength="48" ng-pattern="/^([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/" required autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'required')">Required</small>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'maxlength')">Too Long</small>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'pattern')">Invalid. Must be a valid hostname without periods</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.routingName != dsCurrent.routingName">Current Value: [ {{dsCurrent.routingName}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.routingName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dscp), 'has-feedback': hasError(deliveryServiceForm.dscp)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">DSCP Tag *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('dscp', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('dscp', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="dscp" class="form-control" ng-model="deliveryService.dscp" ng-options="dcsp.value as dcsp.label for dcsp in dscps" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dscp, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.dscp != dsCurrent.dscp">Current Value: [ {{magicNumberLabel(dscps, dsCurrent.dscp)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('ipv6RoutingEnabled', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('ipv6RoutingEnabled', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.ipv6RoutingEnabled != dsCurrent.ipv6RoutingEnabled">Current Value: [ {{dsCurrent.ipv6RoutingEnabled}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.rangeRequestHandling), 'has-feedback': hasError(deliveryServiceForm.rangeRequestHandling)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Range Request Handling *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('rangeRequestHandling', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('rangeRequestHandling', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="rangeRequestHandling" class="form-control" ng-model="deliveryService.rangeRequestHandling" ng-options="rrh.value as rrh.label for rrh in rrhs" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.rangeRequestHandling, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.rangeRequestHandling != dsCurrent.rangeRequestHandling">Current Value: [ {{magicNumberLabel(rrhs, dsCurrent.rangeRequestHandling)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.qstringIgnore), 'has-feedback': hasError(deliveryServiceForm.qstringIgnore)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Query String Handling *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('qstringIgnore', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('qstringIgnore', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="qstringIgnore" class="form-control" ng-model="deliveryService.qstringIgnore" ng-options="qs.value as qs.label for qs in qStrings" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.qstringIgnore, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.qstringIgnore != dsCurrent.qstringIgnore">Current Value: [ {{magicNumberLabel(qStrings, dsCurrent.qstringIgnore)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.multiSiteOrigin), 'has-feedback': hasError(deliveryServiceForm.multiSiteOrigin)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Use Multi Site Origin Feature *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('multiSiteOrigin', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('multiSiteOrigin', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="multiSiteOrigin" class="form-control" ng-model="deliveryService.multiSiteOrigin" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.multiSiteOrigin, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.multiSiteOrigin != dsCurrent.multiSiteOrigin">Current Value: [ {{dsCurrent.multiSiteOrigin}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('logsEnabled', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('logsEnabled', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.logsEnabled != dsCurrent.logsEnabled">Current Value: [ {{dsCurrent.logsEnabled}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoProvider', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('geoProvider', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoProvider != dsCurrent.geoProvider">Current Value: [ {{magicNumberLabel(geoProviders, dsCurrent.geoProvider)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLat), 'has-feedback': hasError(deliveryServiceForm.missLat)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Latitude *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('missLat', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('missLat', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="missLat" type="number" class="form-control" ng-model="deliveryService.missLat" required autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLat, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.missLat != dsCurrent.missLat">Current Value: [ {{dsCurrent.missLat}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.missLat)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLong), 'has-feedback': hasError(deliveryServiceForm.missLong)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Longitude *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('missLong', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('missLong', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="missLong" type="number" class="form-control" ng-model="deliveryService.missLong" required autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLong, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.missLong != dsCurrent.missLong">Current Value: [ {{dsCurrent.missLong}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.missLong)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimit), 'has-feedback': hasError(deliveryServiceForm.geoLimit)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimit', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('geoLimit', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="geoLimit" class="form-control" ng-model="deliveryService.geoLimit" ng-options="gl.value as gl.label for gl in geoLimits" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimit, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimit != dsCurrent.geoLimit">Current Value: [ {{magicNumberLabel(geoLimits, dsCurrent.geoLimit)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitCountries), 'has-feedback': hasError(deliveryServiceForm.geoLimitCountries)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Countries</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimitCountries', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('geoLimitCountries', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="geoLimitCountries" type="text" class="form-control" ng-model="deliveryService.geoLimitCountries" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitCountries, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimitCountries != dsCurrent.geoLimitCountries">Current Value: [ {{dsCurrent.geoLimitCountries}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.geoLimitCountries)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitRedirectURL), 'has-feedback': hasError(deliveryServiceForm.geoLimitRedirectURL)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Redirect URL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimitRedirectURL', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('geoLimitRedirectURL', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="geoLimitRedirectURL" type="text" class="form-control" ng-model="deliveryService.geoLimitRedirectURL" ng-pattern="/^(https?:\/\/)/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitRedirectURL, 'pattern')">Must start with http:// or https://</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimitRedirectURL != dsCurrent.geoLimitRedirectURL">Current Value: [ {{dsCurrent.geoLimitRedirectURL}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.geoLimitRedirectURL)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.signingAlgorithm), 'has-feedback': hasError(deliveryServiceForm.signingAlgorithm)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Signing Algorithm</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('signingAlgorithm', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('signingAlgorithm', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="signingAlgorithm" class="form-control" ng-model="deliveryService.signingAlgorithm" ng-options="sa.value as sa.label for sa in signingAlgos">
                             <option value="">Select...</option>
                         </select>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.signingAlgorithm != dsCurrent.signingAlgorithm">Current Value: [ {{magicNumberLabel(signingAlgos, dsCurrent.signingAlgorithm)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassIp), 'has-feedback': hasError(deliveryServiceForm.dnsBypassIp)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass IP</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('dnsBypassIp', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('dnsBypassIp', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="dnsBypassIp" type="text" class="form-control" ng-model="deliveryService.dnsBypassIp" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassIp, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.dnsBypassIp != dsCurrent.dnsBypassIp">Current Value: [ {{dsCurrent.dnsBypassIp}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.dnsBypassIp)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassIp6), 'has-feedback': hasError(deliveryServiceForm.dnsBypassIp6)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass IPv6</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('dnsBypassIp6', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('dnsBypassIp6', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="dnsBypassIp6" type="text" class="form-control" ng-model="deliveryService.dnsBypassIp6" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassIp6, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.dnsBypassIp6 != dsCurrent.dnsBypassIp6">Current Value: [ {{dsCurrent.dnsBypassIp6}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.dnsBypassIp6)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassCname), 'has-feedback': hasError(deliveryServiceForm.dnsBypassCname)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass Cname</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('dnsBypassCname', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('dnsBypassCname', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="dnsBypassCname" type="text" class="form-control" ng-model="deliveryService.dnsBypassCname" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassCname, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.dnsBypassCname != dsCurrent.dnsBypassCname">Current Value: [ {{dsCurrent.dnsBypassCname}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.dnsBypassCname)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassTtl), 'has-feedback': hasError(deliveryServiceForm.dnsBypassTtl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass TTL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('dnsBypassTtl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('dnsBypassTtl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="dnsBypassTtl" type="number" class="form-control" ng-model="deliveryService.dnsBypassTtl" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassTtl, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.dnsBypassTtl != dsCurrent.dnsBypassTtl">Current Value: [ {{dsCurrent.dnsBypassTtl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.dnsBypassTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.maxDnsAnswers), 'has-feedback': hasError(deliveryServiceForm.maxDnsAnswers)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Max DNS Answers</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('maxDnsAnswers', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('dnsBypassTtl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="maxDnsAnswers" type="number" class="form-control" placeholder="Max number of IP addresses in DNS answer (0 means all)" ng-model="deliveryService.maxDnsAnswers" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.maxDnsAnswers, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.maxDnsAnswers != dsCurrent.maxDnsAnswers">Current Value: [ {{dsCurrent.maxDnsAnswers}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.maxDnsAnswers)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ccrDnsTtl), 'has-feedback': hasError(deliveryServiceForm.ccrDnsTtl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service DNS TTL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('ccrDnsTtl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('ccrDnsTtl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="ccrDnsTtl" type="number" class="form-control" ng-model="deliveryService.ccrDnsTtl" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ccrDnsTtl, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.ccrDnsTtl != dsCurrent.ccrDnsTtl">Current Value: [ {{dsCurrent.ccrDnsTtl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.ccrDnsTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service Profile</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('profileId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('profileId', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
                             <option value="">Select...</option>
                         </select>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.profileId != dsCurrent.profileId">Current Value: [ {{dsCurrent.profileName}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxMbps), 'has-feedback': hasError(deliveryServiceForm.globalMaxMbps)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max Mbps</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('globalMaxMbps', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('globalMaxMbps', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="globalMaxMbps" type="number" class="form-control" placeholder="Max bits per second allowed globally" ng-model="deliveryService.globalMaxMbps" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxMbps, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.globalMaxMbps != dsCurrent.globalMaxMbps">Current Value: [ {{dsCurrent.globalMaxMbps}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.globalMaxMbps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxTps), 'has-feedback': hasError(deliveryServiceForm.globalMaxTps)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max TPS</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('globalMaxTps', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('globalMaxTps', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="globalMaxTps" type="number" class="form-control" placeholder="Max transactions per second allowed globally" ng-model="deliveryService.globalMaxTps" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxTps, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.globalMaxTps != dsCurrent.globalMaxTps">Current Value: [ {{dsCurrent.globalMaxTps}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.globalMaxTps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.edgeHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.edgeHeaderRewrite)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Edge Header Rewrite Rules</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('edgeHeaderRewrite', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('edgeHeaderRewrite', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="edgeHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.edgeHeaderRewrite" ng-maxlength="2048" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.edgeHeaderRewrite, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.edgeHeaderRewrite != dsCurrent.edgeHeaderRewrite">Current Value: [ {{dsCurrent.edgeHeaderRewrite}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.edgeHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.midHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.midHeaderRewrite)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Mid Header Rewrite Rules</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('midHeaderRewrite', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('midHeaderRewrite', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="midHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.midHeaderRewrite" ng-maxlength="2048" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.midHeaderRewrite, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.midHeaderRewrite != dsCurrent.midHeaderRewrite">Current Value: [ {{dsCurrent.midHeaderRewrite}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.midHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trResponseHeaders), 'has-feedback': hasError(deliveryServiceForm.trResponseHeaders)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Additional Response Headers</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('trResponseHeaders', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('trResponseHeaders', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="trResponseHeaders" type="text" class="form-control" ng-model="deliveryService.trResponseHeaders" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trResponseHeaders, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.trResponseHeaders != dsCurrent.trResponseHeaders">Current Value: [ {{dsCurrent.trResponseHeaders}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.trResponseHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('trRequestHeaders', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('trRequestHeaders', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.trRequestHeaders != dsCurrent.trRequestHeaders">Current Value: [ {{dsCurrent.trRequestHeaders}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regexRemap), 'has-feedback': hasError(deliveryServiceForm.regexRemap)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Regex remap expression</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('regexRemap', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('regexRemap', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="regexRemap" type="text" class="form-control" ng-model="deliveryService.regexRemap" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regexRemap, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.regexRemap != dsCurrent.regexRemap">Current Value: [ {{dsCurrent.regexRemap}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.regexRemap)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('cacheurl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('cacheurl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.cacheurl != dsCurrent.cacheurl">Current Value: [ {{dsCurrent.cacheurl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('remapText', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('remapText', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.remapText != dsCurrent.remapText">Current Value: [ {{dsCurrent.remapText}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('longDesc1', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('longDesc1', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc1 != dsCurrent.longDesc1">Current Value: [ {{dsCurrent.longDesc1}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 3</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('longDesc2', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('longDesc2', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc2 != dsCurrent.longDesc2">Current Value: [ {{dsCurrent.longDesc2}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('infoUrl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('infoUrl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.infoUrl != dsCurrent.infoUrl">Current Value: [ {{dsCurrent.infoUrl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('checkPath', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('checkPath', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.checkPath != dsCurrent.checkPath">Current Value: [ {{dsCurrent.checkPath}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.originShield), 'has-feedback': hasError(deliveryServiceForm.originShield)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Shield (Pipe Delimited String)</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('originShield', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('originShield', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="originShield" type="text" class="form-control" ng-model="deliveryService.originShield" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.originShield, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.originShield != dsCurrent.originShield">Current Value: [ {{dsCurrent.originShield}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.originShield)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
@@ -480,8 +617,9 @@
 
             <div class="modal-footer">
                 <button class="btn btn-link" ng-click="advancedShowing = !advancedShowing"><span ng-show="!advancedShowing">Show</span><span ng-show="advancedShowing">Hide</span> Advanced</button>
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-danger" ng-if="!settings.isNew" ng-disabled="!deletable()" ng-click="confirmDelete(deliveryService)">{{settings.deleteLabel}}</button>
+                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid || !saveable()" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-primary" ng-if="settings.isRequest && fulfillable()" ng-disabled="deliveryServiceForm.$invalid" ng-click="fulfillRequest(deliveryService)">Fulfill Request</button>
             </div>
         </form>
     </div>
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
index 5f9763c4ca..759bd214f8 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
@@ -20,10 +20,15 @@
 <div class="x_panel">
     <div class="x_title">
         <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
+            <li ng-if="!settings.isRequest"><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
+            <li ng-if="settings.isRequest"><a ng-click="navigateToPath('/delivery-service-requests')">Delivery Service Requests</a></li>
+            <li ng-if="settings.isRequest" class="active">{{changeType}}</li>
             <li class="active">{{deliveryServiceName}}</li>
         </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
+        <div class="pull-right" role="group" ng-if="settings.isRequest">
+            <button class="btn btn-link request-status" title="Edit Status" ng-disabled="!open()" ng-click="editStatus()">[ {{requestStatus}} ]</button>
+        </div>
+        <div class="pull-right" role="group" ng-show="!settings.isRequest && !settings.isNew">
             <button type="button" class="btn btn-primary" title="Delivery Service Charts" ng-if="showChartsButton" ng-click="openCharts(deliveryService)"><i class="fa fa-bar-chart fa-fw"></i></button>
             <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
                 <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
@@ -51,97 +56,124 @@
         <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('active', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('active', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.active != dsCurrent.active">Current Value: [ {{dsCurrent.active}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type), 'has-feedback': hasError(deliveryServiceForm.type)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('typeId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('typeId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.typeId != dsCurrent.typeId">Current Value: [ {{dsCurrent.type}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Key (XML ID) *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('xmlId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('xmlId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input name="xmlId" type="text" class="form-control" placeholder="Unique id used for the delivery service" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" ng-readonly="!settings.isNew" autofocus>
+                    <input name="xmlId" type="text" class="form-control" placeholder="Unique id used for the delivery service" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" ng-readonly="(!settings.isRequest && !settings.isNew) || (settings.isRequest && changeType == 'update')" autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.xmlId != dsCurrent.xmlId">Current Value: [ {{dsCurrent.xmlId}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('displayName', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('displayName', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-maxlength="48" required autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.displayName != dsCurrent.displayName">Current Value: [ {{dsCurrent.displayName}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.tenantId), 'has-feedback': hasError(deliveryServiceForm.tenantId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Tenant *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('tenantId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('tenantId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="tenantId" class="form-control" ng-model="deliveryService.tenantId" ng-options="tenant.id as tenantLabel(tenant) for tenant in tenants" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.tenantId, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.tenantId != dsCurrent.tenantId">Current Value: [ {{dsCurrent.tenant}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('cdnId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('cdnId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.cdnId != dsCurrent.cdnId">Current Value: [ {{dsCurrent.cdnName}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.orgServerFqdn), 'has-feedback': hasError(deliveryServiceForm.orgServerFqdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Server Base URL *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('orgServerFqdn', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('orgServerFqdn', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="orgServerFqdn" type="text" class="form-control" placeholder="http(s)//:" ng-model="deliveryService.orgServerFqdn" ng-pattern="/^(https?:\/\/)/" required autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'pattern')">Must start with http:// or https://</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.orgServerFqdn != dsCurrent.orgServerFqdn">Current Value: [ {{dsCurrent.orgServerFqdn}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.orgServerFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('protocol', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('protocol', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.protocol != dsCurrent.protocol">Current Value: [ {{magicNumberLabel(protocols, dsCurrent.protocol)}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('longDesc', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('longDesc', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus required>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc != dsCurrent.longDesc">Current Value: [ {{dsCurrent.longDesc}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
-            <div class="form-group" ng-if="!settings.isNew && deliveryService.exampleURLs.length > 0">
+            <div class="form-group" ng-if="!settings.isNew && !settings.isRequest">
                 <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service URLs</label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <textarea name="edgeFQDNs" rows="4" cols="17" class="form-control readonly" readonly>{{edgeFQDNs(deliveryService)}}</textarea>
@@ -151,330 +183,435 @@
             <div ng-show="advancedShowing">
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.routingName), 'has-feedback': hasError(deliveryServiceForm.routingName)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Routing Name *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('routingName', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('routingName', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <small class="input-warning" ng-show="!settings.isNew && deliveryServiceForm.routingName.$dirty">Warning: Changing the routing name may require SSL certificates to be updated.</small>
                         <input name="routingName" type="text" class="form-control" placeholder="Routing name used for the delivery service resulting in FQDN = <routing name>.<key>.<CDN domain>" ng-model="deliveryService.routingName" ng-maxlength="48" ng-pattern="/^([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/" required autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'required')">Required</small>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'maxlength')">Too Long</small>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'pattern')">Invalid. Must be a valid hostname without periods</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.routingName != dsCurrent.routingName">Current Value: [ {{dsCurrent.routingName}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.routingName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.deepCachingType), 'has-feedback': hasError(deliveryServiceForm.deepCachingType)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Deep Caching *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('deepCachingType', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('deepCachingType', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select id="deepCachingType" name="deepCachingType" class="form-control" ng-model="deliveryService.deepCachingType" ng-options="dct.value as dct.label for dct in deepCachingTypes" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.deepCachingType, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.deepCachingType != dsCurrent.deepCachingType">Current Value: [ {{dsCurrent.deepCachingType}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dscp), 'has-feedback': hasError(deliveryServiceForm.dscp)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">DSCP Tag *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('dscp', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('dscp', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="dscp" class="form-control" ng-model="deliveryService.dscp" ng-options="dcsp.value as dcsp.label for dcsp in dscps" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dscp, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.dscp != dsCurrent.dscp">Current Value: [ {{magicNumberLabel(dscps, dsCurrent.dscp)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('ipv6RoutingEnabled', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('ipv6RoutingEnabled', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.ipv6RoutingEnabled != dsCurrent.ipv6RoutingEnabled">Current Value: [ {{dsCurrent.ipv6RoutingEnabled}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.rangeRequestHandling), 'has-feedback': hasError(deliveryServiceForm.rangeRequestHandling)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Range Request Handling *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('rangeRequestHandling', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('rangeRequestHandling', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="rangeRequestHandling" class="form-control" ng-model="deliveryService.rangeRequestHandling" ng-options="rrh.value as rrh.label for rrh in rrhs" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.rangeRequestHandling, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.rangeRequestHandling != dsCurrent.rangeRequestHandling">Current Value: [ {{magicNumberLabel(rrhs, dsCurrent.rangeRequestHandling)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.qstringIgnore), 'has-feedback': hasError(deliveryServiceForm.qstringIgnore)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Query String Handling *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('qstringIgnore', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('qstringIgnore', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="qstringIgnore" class="form-control" ng-model="deliveryService.qstringIgnore" ng-options="qs.value as qs.label for qs in qStrings" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.qstringIgnore, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.qstringIgnore != dsCurrent.qstringIgnore">Current Value: [ {{magicNumberLabel(qStrings, dsCurrent.qstringIgnore)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.multiSiteOrigin), 'has-feedback': hasError(deliveryServiceForm.multiSiteOrigin)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Use Multi Site Origin Feature *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('multiSiteOrigin', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('multiSiteOrigin', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="multiSiteOrigin" class="form-control" ng-model="deliveryService.multiSiteOrigin" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.multiSiteOrigin, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.multiSiteOrigin != dsCurrent.multiSiteOrigin">Current Value: [ {{dsCurrent.multiSiteOrigin}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('logsEnabled', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('logsEnabled', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.logsEnabled != dsCurrent.logsEnabled">Current Value: [ {{dsCurrent.logsEnabled}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.initialDispersion), 'has-feedback': hasError(deliveryServiceForm.initialDispersion)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Initial Dispersion *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('initialDispersion', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('initialDispersion', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="initialDispersion" class="form-control" ng-model="deliveryService.initialDispersion" ng-options="disp.value as disp.label for disp in dispersions" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.initialDispersion, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.initialDispersion != dsCurrent.initialDispersion">Current Value: [ {{magicNumberLabel(dispersions, dsCurrent.initialDispersion)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regionalGeoBlocking), 'has-feedback': hasError(deliveryServiceForm.regionalGeoBlocking)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Regional Geoblocking *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('regionalGeoBlocking', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('regionalGeoBlocking', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="regionalGeoBlocking" class="form-control" ng-model="deliveryService.regionalGeoBlocking" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regionalGeoBlocking, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.regionalGeoBlocking != dsCurrent.regionalGeoBlocking">Current Value: [ {{dsCurrent.regionalGeoBlocking}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoProvider', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('geoProvider', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoProvider != dsCurrent.geoProvider">Current Value: [ {{magicNumberLabel(geoProviders, dsCurrent.geoProvider)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLat), 'has-feedback': hasError(deliveryServiceForm.missLat)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Latitude *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('missLat', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('missLat', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="missLat" type="number" class="form-control" ng-model="deliveryService.missLat" required autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLat, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.missLat != dsCurrent.missLat">Current Value: [ {{dsCurrent.missLat}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.missLat)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLong), 'has-feedback': hasError(deliveryServiceForm.missLong)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Longitude *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('missLong', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('missLong', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="missLong" type="number" class="form-control" ng-model="deliveryService.missLong" required autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLong, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.missLong != dsCurrent.missLong">Current Value: [ {{dsCurrent.missLong}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.missLong)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimit), 'has-feedback': hasError(deliveryServiceForm.geoLimit)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimit', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('geoLimit', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="geoLimit" class="form-control" ng-model="deliveryService.geoLimit" ng-options="gl.value as gl.label for gl in geoLimits" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimit, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimit != dsCurrent.geoLimit">Current Value: [ {{magicNumberLabel(geoLimits, dsCurrent.geoLimit)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitCountries), 'has-feedback': hasError(deliveryServiceForm.geoLimitCountries)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Countries</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimitCountries', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('geoLimitCountries', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="geoLimitCountries" type="text" class="form-control" ng-model="deliveryService.geoLimitCountries" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitCountries, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimitCountries != dsCurrent.geoLimitCountries">Current Value: [ {{dsCurrent.geoLimitCountries}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.geoLimitCountries)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitRedirectURL), 'has-feedback': hasError(deliveryServiceForm.geoLimitRedirectURL)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Redirect URL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimitRedirectURL', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('geoLimitRedirectURL', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="geoLimitRedirectURL" type="text" class="form-control" ng-model="deliveryService.geoLimitRedirectURL" ng-pattern="/^(https?:\/\/)/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitRedirectURL, 'pattern')">Must start with http:// or https://</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimitRedirectURL != dsCurrent.geoLimitRedirectURL">Current Value: [ {{dsCurrent.geoLimitRedirectURL}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.geoLimitRedirectURL)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.signingAlgorithm), 'has-feedback': hasError(deliveryServiceForm.signingAlgorithm)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Signing Algorithm</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('signingAlgorithm', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('signingAlgorithm', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="signingAlgorithm" class="form-control" ng-model="deliveryService.signingAlgorithm" ng-options="sa.value as sa.label for sa in signingAlgos">
                             <option value="">Select...</option>
                         </select>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.signingAlgorithm != dsCurrent.signingAlgorithm">Current Value: [ {{magicNumberLabel(signingAlgos, dsCurrent.signingAlgorithm)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.httpBypassFqdn), 'has-feedback': hasError(deliveryServiceForm.httpBypassFqdn)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">HTTP Bypass FQDN</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('httpBypassFqdn', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('httpBypassFqdn', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="httpBypassFqdn" type="text" class="form-control" ng-model="deliveryService.httpBypassFqdn" ng-pattern="/^(https?:\/\/)/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.httpBypassFqdn, 'pattern')">Must start with http:// or https://</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.httpBypassFqdn != dsCurrent.httpBypassFqdn">Current Value: [ {{dsCurrent.httpBypassFqdn}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.httpBypassFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassTtl), 'has-feedback': hasError(deliveryServiceForm.dnsBypassTtl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass TTL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('dnsBypassTtl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('dnsBypassTtl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="dnsBypassTtl" type="number" class="form-control" ng-model="deliveryService.dnsBypassTtl" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassTtl, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.dnsBypassTtl != dsCurrent.dnsBypassTtl">Current Value: [ {{dsCurrent.dnsBypassTtl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.dnsBypassTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ccrDnsTtl), 'has-feedback': hasError(deliveryServiceForm.ccrDnsTtl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service DNS TTL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('ccrDnsTtl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('ccrDnsTtl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="ccrDnsTtl" type="number" class="form-control" ng-model="deliveryService.ccrDnsTtl" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ccrDnsTtl, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.ccrDnsTtl != dsCurrent.ccrDnsTtl">Current Value: [ {{dsCurrent.ccrDnsTtl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.ccrDnsTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service Profile</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('profileId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('profileId', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
                             <option value="">Select...</option>
                         </select>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.profileId != dsCurrent.profileId">Current Value: [ {{dsCurrent.profileName}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxMbps), 'has-feedback': hasError(deliveryServiceForm.globalMaxMbps)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max Mbps</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('globalMaxMbps', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('globalMaxMbps', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="globalMaxMbps" type="number" class="form-control" placeholder="Max bits per second allowed globally" ng-model="deliveryService.globalMaxMbps" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxMbps, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.globalMaxMbps != dsCurrent.globalMaxMbps">Current Value: [ {{dsCurrent.globalMaxMbps}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.globalMaxMbps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxTps), 'has-feedback': hasError(deliveryServiceForm.globalMaxTps)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max TPS</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('globalMaxTps', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('globalMaxTps', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="globalMaxTps" type="number" class="form-control" placeholder="Max transactions per second allowed globally" ng-model="deliveryService.globalMaxTps" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxTps, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.globalMaxTps != dsCurrent.globalMaxTps">Current Value: [ {{dsCurrent.globalMaxTps}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.globalMaxTps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.edgeHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.edgeHeaderRewrite)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Edge Header Rewrite Rules</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('edgeHeaderRewrite', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('edgeHeaderRewrite', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="edgeHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.edgeHeaderRewrite" ng-maxlength="2048" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.edgeHeaderRewrite, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.edgeHeaderRewrite != dsCurrent.edgeHeaderRewrite">Current Value: [ {{dsCurrent.edgeHeaderRewrite}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.edgeHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.midHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.midHeaderRewrite)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Mid Header Rewrite Rules</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('midHeaderRewrite', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('midHeaderRewrite', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="midHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.midHeaderRewrite" ng-maxlength="2048" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.midHeaderRewrite, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.midHeaderRewrite != dsCurrent.midHeaderRewrite">Current Value: [ {{dsCurrent.midHeaderRewrite}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.midHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trResponseHeaders), 'has-feedback': hasError(deliveryServiceForm.trResponseHeaders)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Additional Response Headers</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('trResponseHeaders', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('trResponseHeaders', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="trResponseHeaders" type="text" class="form-control" ng-model="deliveryService.trResponseHeaders" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trResponseHeaders, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.trResponseHeaders != dsCurrent.trResponseHeaders">Current Value: [ {{dsCurrent.trResponseHeaders}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.trResponseHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('trRequestHeaders', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('trRequestHeaders', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.trRequestHeaders != dsCurrent.trRequestHeaders">Current Value: [ {{dsCurrent.trRequestHeaders}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regexRemap), 'has-feedback': hasError(deliveryServiceForm.regexRemap)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Regex remap expression</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('regexRemap', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('regexRemap', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="regexRemap" type="text" class="form-control" ng-model="deliveryService.regexRemap" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regexRemap, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.regexRemap != dsCurrent.regexRemap">Current Value: [ {{dsCurrent.regexRemap}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.regexRemap)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('cacheurl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('cacheurl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.cacheurl != dsCurrent.cacheurl">Current Value: [ {{dsCurrent.cacheurl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('cacheurl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('cacheurl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.remapText != dsCurrent.remapText">Current Value: [ {{dsCurrent.remapText}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('longDesc1', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('longDesc1', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc1 != dsCurrent.longDesc1">Current Value: [ {{dsCurrent.longDesc1}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 3</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('longDesc2', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('longDesc2', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc2 != dsCurrent.longDesc2">Current Value: [ {{dsCurrent.longDesc2}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('infoUrl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('infoUrl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.infoUrl != dsCurrent.infoUrl">Current Value: [ {{dsCurrent.infoUrl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('checkPath', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('checkPath', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.checkPath != dsCurrent.checkPath">Current Value: [ {{dsCurrent.checkPath}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.originShield), 'has-feedback': hasError(deliveryServiceForm.originShield)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Shield (Pipe Delimited String)</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('originShield', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('originShield', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="originShield" type="text" class="form-control" ng-model="deliveryService.originShield" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.originShield, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.originShield != dsCurrent.originShield">Current Value: [ {{dsCurrent.originShield}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.originShield)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
@@ -483,8 +620,9 @@
 
             <div class="modal-footer">
                 <button class="btn btn-link" ng-click="advancedShowing = !advancedShowing"><span ng-show="!advancedShowing">Show</span><span ng-show="advancedShowing">Hide</span> Advanced</button>
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-danger" ng-if="!settings.isNew" ng-disabled="!deletable()" ng-click="confirmDelete(deliveryService)">{{settings.deleteLabel}}</button>
+                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid || !saveable()" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-primary" ng-if="settings.isRequest && fulfillable()" ng-disabled="deliveryServiceForm.$invalid" ng-click="fulfillRequest(deliveryService)">Fulfill Request</button>
             </div>
         </form>
     </div>
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
index 19cdf0fcba..3089f75858 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
@@ -20,10 +20,15 @@
 <div class="x_panel">
     <div class="x_title">
         <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
+            <li ng-if="!settings.isRequest"><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
+            <li ng-if="settings.isRequest"><a ng-click="navigateToPath('/delivery-service-requests')">Delivery Service Requests</a></li>
+            <li ng-if="settings.isRequest" class="active">{{changeType}}</li>
             <li class="active">{{deliveryServiceName}}</li>
         </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
+        <div class="pull-right" role="group" ng-if="settings.isRequest">
+            <button class="btn btn-link request-status" title="Edit Status" ng-disabled="!open()" ng-click="editStatus()">[ {{requestStatus}} ]</button>
+        </div>
+        <div class="pull-right" role="group" ng-show="!settings.isRequest && !settings.isNew">
             <button type="button" class="btn btn-primary" title="Delivery Service Charts" ng-if="showChartsButton" ng-click="openCharts(deliveryService)"><i class="fa fa-bar-chart fa-fw"></i></button>
             <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
                 <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
@@ -51,87 +56,111 @@
         <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('active', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('active', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.active != dsCurrent.active">Current Value: [ {{dsCurrent.active}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type), 'has-feedback': hasError(deliveryServiceForm.type)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('typeId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('typeId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.typeId != dsCurrent.typeId">Current Value: [ {{dsCurrent.type}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Key (XML ID) *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('xmlId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('xmlId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input name="xmlId" type="text" class="form-control" placeholder="Unique id used for the delivery service" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" ng-readonly="!settings.isNew" autofocus>
+                    <input name="xmlId" type="text" class="form-control" placeholder="Unique id used for the delivery service" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" ng-readonly="(!settings.isRequest && !settings.isNew) || (settings.isRequest && changeType == 'update')" autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.xmlId != dsCurrent.xmlId">Current Value: [ {{dsCurrent.xmlId}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('displayName', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('displayName', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-maxlength="48" required autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.displayName != dsCurrent.displayName">Current Value: [ {{dsCurrent.displayName}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.tenantId), 'has-feedback': hasError(deliveryServiceForm.tenantId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Tenant *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('tenantId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('tenantId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="tenantId" class="form-control" ng-model="deliveryService.tenantId" ng-options="tenant.id as tenantLabel(tenant) for tenant in tenants" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.tenantId, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.tenantId != dsCurrent.tenantId">Current Value: [ {{dsCurrent.tenant}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('cdnId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('cdnId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.cdnId != dsCurrent.cdnId">Current Value: [ {{dsCurrent.cdnName}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('protocol', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('protocol', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.protocol != dsCurrent.protocol">Current Value: [ {{magicNumberLabel(protocols, dsCurrent.protocol)}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('longDesc', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('longDesc', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus required>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc != dsCurrent.longDesc">Current Value: [ {{dsCurrent.longDesc}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
-            <div class="form-group" ng-if="!settings.isNew && deliveryService.exampleURLs.length > 0">
+            <div class="form-group" ng-if="!settings.isNew && !settings.isRequest">
                 <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service URLs</label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <textarea name="edgeFQDNs" rows="4" cols="17" class="form-control readonly" readonly>{{edgeFQDNs(deliveryService)}}</textarea>
@@ -141,72 +170,93 @@
             <div ng-show="advancedShowing">
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.routingName), 'has-feedback': hasError(deliveryServiceForm.routingName)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Routing Name *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('routingName', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('routingName', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <small class="input-warning" ng-show="!settings.isNew && deliveryServiceForm.routingName.$dirty">Warning: Changing the routing name may require SSL certificates to be updated.</small>
                         <input name="routingName" type="text" class="form-control" placeholder="Routing name used for the delivery service resulting in FQDN = <routing name>.<key>.<CDN domain>" ng-model="deliveryService.routingName" ng-maxlength="48" ng-pattern="/^([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/" required autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'required')">Required</small>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'maxlength')">Too Long</small>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.routingName, 'pattern')">Invalid. Must be a valid hostname without periods</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.routingName != dsCurrent.routingName">Current Value: [ {{dsCurrent.routingName}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.routingName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('ipv6RoutingEnabled', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('ipv6RoutingEnabled', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.ipv6RoutingEnabled != dsCurrent.ipv6RoutingEnabled">Current Value: [ {{dsCurrent.ipv6RoutingEnabled}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('logsEnabled', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('logsEnabled', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.logsEnabled != dsCurrent.logsEnabled">Current Value: [ {{dsCurrent.logsEnabled}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoProvider', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('geoProvider', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoProvider != dsCurrent.geoProvider">Current Value: [ {{magicNumberLabel(geoProviders, dsCurrent.geoProvider)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimit), 'has-feedback': hasError(deliveryServiceForm.geoLimit)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimit', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('geoLimit', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="geoLimit" class="form-control" ng-model="deliveryService.geoLimit" ng-options="gl.value as gl.label for gl in geoLimits" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimit, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimit != dsCurrent.geoLimit">Current Value: [ {{magicNumberLabel(geoLimits, dsCurrent.geoLimit)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitCountries), 'has-feedback': hasError(deliveryServiceForm.geoLimitCountries)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Countries</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimitCountries', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('geoLimitCountries', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="geoLimitCountries" type="text" class="form-control" ng-model="deliveryService.geoLimitCountries" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitCountries, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimitCountries != dsCurrent.geoLimitCountries">Current Value: [ {{dsCurrent.geoLimitCountries}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.geoLimitCountries)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service Profile</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('profileId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('profileId', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
                             <option value="">Select...</option>
                         </select>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.profileId != dsCurrent.profileId">Current Value: [ {{dsCurrent.profileName}} ]</small>
                     </div>
                 </div>
 
@@ -221,46 +271,61 @@
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ccrDnsTtl), 'has-feedback': hasError(deliveryServiceForm.ccrDnsTtl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service DNS TTL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('ccrDnsTtl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('ccrDnsTtl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="ccrDnsTtl" type="number" class="form-control" ng-model="deliveryService.ccrDnsTtl" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ccrDnsTtl, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.ccrDnsTtl != dsCurrent.ccrDnsTtl">Current Value: [ {{dsCurrent.ccrDnsTtl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.ccrDnsTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('longDesc1', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('longDesc1', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc1 != dsCurrent.longDesc1">Current Value: [ {{dsCurrent.longDesc1}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 3</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('longDesc2', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('longDesc2', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc2 != dsCurrent.longDesc2">Current Value: [ {{dsCurrent.longDesc2}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('infoUrl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('infoUrl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.infoUrl != dsCurrent.infoUrl">Current Value: [ {{dsCurrent.infoUrl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('checkPath', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('checkPath', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.checkPath != dsCurrent.checkPath">Current Value: [ {{dsCurrent.checkPath}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
@@ -269,8 +334,9 @@
 
             <div class="modal-footer">
                 <button class="btn btn-link" ng-click="advancedShowing = !advancedShowing"><span ng-show="!advancedShowing">Show</span><span ng-show="advancedShowing">Hide</span> Advanced</button>
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-danger" ng-if="!settings.isNew" ng-disabled="!deletable()" ng-click="confirmDelete(deliveryService)">{{settings.deleteLabel}}</button>
+                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid || !saveable()" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-primary" ng-if="settings.isRequest && fulfillable()" ng-disabled="deliveryServiceForm.$invalid" ng-click="fulfillRequest(deliveryService)">Fulfill Request</button>
             </div>
         </form>
     </div>
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
index c792ea128c..005285d465 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
@@ -20,10 +20,15 @@
 <div class="x_panel">
     <div class="x_title">
         <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
+            <li ng-if="!settings.isRequest"><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
+            <li ng-if="settings.isRequest"><a ng-click="navigateToPath('/delivery-service-requests')">Delivery Service Requests</a></li>
+            <li ng-if="settings.isRequest" class="active">{{changeType}}</li>
             <li class="active">{{deliveryServiceName}}</li>
         </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
+        <div class="pull-right" role="group" ng-if="settings.isRequest">
+            <button class="btn btn-link request-status" title="Edit Status" ng-disabled="!open()" ng-click="editStatus()">[ {{requestStatus}} ]</button>
+        </div>
+        <div class="pull-right" role="group" ng-show="!settings.isRequest && !settings.isNew">
             <button type="button" class="btn btn-primary" title="Delivery Service Charts" ng-if="showChartsButton" ng-click="openCharts(deliveryService)"><i class="fa fa-bar-chart fa-fw"></i></button>
             <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
                 <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
@@ -51,77 +56,98 @@
         <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('active', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('active', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.active != dsCurrent.active">Current Value: [ {{dsCurrent.active}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type), 'has-feedback': hasError(deliveryServiceForm.type)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('typeId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('typeId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.typeId != dsCurrent.typeId">Current Value: [ {{dsCurrent.type}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Key (XML ID) *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('xmlId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('xmlId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input name="xmlId" type="text" class="form-control" placeholder="Unique id used for the delivery service" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" ng-readonly="!settings.isNew" autofocus>
+                    <input name="xmlId" type="text" class="form-control" placeholder="Unique id used for the delivery service" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" ng-readonly="(!settings.isRequest && !settings.isNew) || (settings.isRequest && changeType == 'update')" autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.xmlId != dsCurrent.xmlId">Current Value: [ {{dsCurrent.xmlId}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('displayName', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('displayName', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-maxlength="48" required autofocus>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.displayName != dsCurrent.displayName">Current Value: [ {{dsCurrent.displayName}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.tenantId), 'has-feedback': hasError(deliveryServiceForm.tenantId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Tenant *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('tenantId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('tenantId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="tenantId" class="form-control" ng-model="deliveryService.tenantId" ng-options="tenant.id as tenantLabel(tenant) for tenant in tenants" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.tenantId, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.tenantId != dsCurrent.tenantId">Current Value: [ {{dsCurrent.tenant}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('cdnId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('cdnId', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <select name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
                         <option value="">Select...</option>
                     </select>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.cdnId != dsCurrent.cdnId">Current Value: [ {{dsCurrent.cdnName}} ]</small>
                 </div>
             </div>
 
             <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description *</label>
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                    <span uib-popover-html="label('longDesc', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('longDesc', 'title')}}</span>
+                </label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <input name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus required>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'required')">Required</small>
                     <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
+                    <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc != dsCurrent.longDesc">Current Value: [ {{dsCurrent.longDesc}} ]</small>
                     <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
 
-            <div class="form-group" ng-if="!settings.isNew && deliveryService.exampleURLs.length > 0">
+            <div class="form-group" ng-if="!settings.isNew && !settings.isRequest">
                 <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service URLs</label>
                 <div class="col-md-10 col-sm-10 col-xs-12">
                     <textarea name="edgeFQDNs" rows="4" cols="17" class="form-control readonly" readonly>{{edgeFQDNs(deliveryService)}}</textarea>
@@ -131,138 +157,183 @@
             <div ng-show="advancedShowing">
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regionalGeoBlocking), 'has-feedback': hasError(deliveryServiceForm.regionalGeoBlocking)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Regional Geoblocking *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('regionalGeoBlocking', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('regionalGeoBlocking', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="regionalGeoBlocking" class="form-control" ng-model="deliveryService.regionalGeoBlocking" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regionalGeoBlocking, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.regionalGeoBlocking != dsCurrent.regionalGeoBlocking">Current Value: [ {{dsCurrent.regionalGeoBlocking}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('logsEnabled', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('logsEnabled', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.logsEnabled != dsCurrent.logsEnabled">Current Value: [ {{dsCurrent.logsEnabled}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geolocation Provider *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoProvider', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('geoProvider', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required></select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoProvider != dsCurrent.geoProvider">Current Value: [ {{magicNumberLabel(geoProviders, dsCurrent.geoProvider)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimit), 'has-feedback': hasError(deliveryServiceForm.geoLimit)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit *</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimit', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">* {{label('geoLimit', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="geoLimit" class="form-control" ng-model="deliveryService.geoLimit" ng-options="gl.value as gl.label for gl in geoLimits" required>
                             <option value="">Select...</option>
                         </select>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimit, 'required')">Required</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimit != dsCurrent.geoLimit">Current Value: [ {{magicNumberLabel(geoLimits, dsCurrent.geoLimit)}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitCountries), 'has-feedback': hasError(deliveryServiceForm.geoLimitCountries)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Countries</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimitCountries', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('geoLimitCountries', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="geoLimitCountries" type="text" class="form-control" ng-model="deliveryService.geoLimitCountries" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitCountries, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimitCountries != dsCurrent.geoLimitCountries">Current Value: [ {{dsCurrent.geoLimitCountries}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.geoLimitCountries)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitRedirectURL), 'has-feedback': hasError(deliveryServiceForm.geoLimitRedirectURL)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Redirect URL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('geoLimitRedirectURL', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('geoLimitRedirectURL', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="geoLimitRedirectURL" type="text" class="form-control" ng-model="deliveryService.geoLimitRedirectURL" ng-pattern="/^(https?:\/\/)/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitRedirectURL, 'pattern')">Must start with http:// or https://</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.geoLimitRedirectURL != dsCurrent.geoLimitRedirectURL">Current Value: [ {{dsCurrent.geoLimitRedirectURL}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.geoLimitRedirectURL)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service Profile</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('profileId', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('profileId', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <select name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
                             <option value="">Select...</option>
                         </select>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.profileId != dsCurrent.profileId">Current Value: [ {{dsCurrent.profileName}} ]</small>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('trRequestHeaders', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('trRequestHeaders', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.trRequestHeaders != dsCurrent.trRequestHeaders">Current Value: [ {{dsCurrent.trRequestHeaders}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('cacheurl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('cacheurl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.cacheurl != dsCurrent.cacheurl">Current Value: [ {{dsCurrent.cacheurl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ccrDnsTtl), 'has-feedback': hasError(deliveryServiceForm.ccrDnsTtl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service DNS TTL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('ccrDnsTtl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('ccrDnsTtl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="ccrDnsTtl" type="number" class="form-control" ng-model="deliveryService.ccrDnsTtl" ng-pattern="/^\d+$/" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ccrDnsTtl, 'pattern')">Whole Number</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.ccrDnsTtl != dsCurrent.ccrDnsTtl">Current Value: [ {{dsCurrent.ccrDnsTtl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.ccrDnsTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('remapText', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('remapText', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.remapText != dsCurrent.remapText">Current Value: [ {{dsCurrent.remapText}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('longDesc1', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('longDesc1', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc1 != dsCurrent.longDesc1">Current Value: [ {{dsCurrent.longDesc1}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 3</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('longDesc2', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('longDesc2', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.longDesc2 != dsCurrent.longDesc2">Current Value: [ {{dsCurrent.longDesc2}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('infoUrl', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('infoUrl', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.infoUrl != dsCurrent.infoUrl">Current Value: [ {{dsCurrent.infoUrl}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
 
                 <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
-                    <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
+                    <label class="control-label col-md-2 col-sm-2 col-xs-12">
+                        <span uib-popover-html="label('checkPath', 'desc')" popover-trigger="mouseenter" popover-popup-close-delay="2000" popover-placement="top" popover-append-to-body="true" popover-class="popover-class">{{label('checkPath', 'title')}}</span>
+                    </label>
                     <div class="col-md-10 col-sm-10 col-xs-12">
                         <input name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
                         <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
+                        <small class="input-diff" ng-show="settings.isRequest && open() && deliveryService.checkPath != dsCurrent.checkPath">Current Value: [ {{dsCurrent.checkPath}} ]</small>
                         <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                     </div>
                 </div>
@@ -271,8 +342,9 @@
 
             <div class="modal-footer">
                 <button class="btn btn-link" ng-click="advancedShowing = !advancedShowing"><span ng-show="!advancedShowing">Show</span><span ng-show="advancedShowing">Hide</span> Advanced</button>
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-danger" ng-if="!settings.isNew" ng-disabled="!deletable()" ng-click="confirmDelete(deliveryService)">{{settings.deleteLabel}}</button>
+                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid || !saveable()" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+                <button type="button" class="btn btn-primary" ng-if="settings.isRequest" ng-disabled="deliveryServiceForm.$invalid || !fulfillable()" ng-click="fulfillRequest(deliveryService)">Fulfill Request</button>
             </div>
         </form>
     </div>
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js b/traffic_portal/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js
index 43c1580c4a..a1f5ad01d7 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js
@@ -17,23 +17,57 @@
  * under the License.
  */
 
-var FormNewDeliveryServiceController = function(deliveryService, type, types, $scope, $controller, deliveryServiceService) {
+var FormNewDeliveryServiceController = function(deliveryService, type, types, $scope, $controller, $uibModal, deliveryServiceService, deliveryServiceRequestService) {
 
 	// extends the FormDeliveryServiceController to inherit common methods
-	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: deliveryService, type: type, types: types, $scope: $scope }));
+	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: deliveryService, dsCurrent: deliveryService, type: type, types: types, $scope: $scope }));
 
 	$scope.deliveryServiceName = 'New';
 
 	$scope.settings = {
 		isNew: true,
+		isRequest: false,
 		saveLabel: 'Create'
 	};
 
 	$scope.save = function(deliveryService) {
-		deliveryServiceService.createDeliveryService(deliveryService);
+		if ($scope.dsRequestsEnabled) {
+			var params = {
+				title: "Delivery Service Create Request",
+				message: 'All new delivery services must be reviewed for completeness and accuracy before deployment.<br><br>Please select the status of your delivery service create request.'
+			};
+			var modalInstance = $uibModal.open({
+				templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+				controller: 'DialogSelectController',
+				size: 'md',
+				resolve: {
+					params: function () {
+						return params;
+					},
+					collection: function() {
+						return [
+							{ id: $scope.DRAFT, name: 'Save as Draft' },
+							{ id: $scope.SUBMITTED, name: 'Submit for Review and Deployment' }
+						];
+					}
+				}
+			});
+			modalInstance.result.then(function(action) {
+				var dsRequest = {
+					changeType: 'create',
+					status: (action.id == $scope.SUBMITTED) ? 'submitted' : 'draft',
+					deliveryService: deliveryService
+				};
+				deliveryServiceRequestService.createDeliveryServiceRequest(dsRequest, true);
+			}, function () {
+				// do nothing
+			});
+		} else {
+			deliveryServiceService.createDeliveryService(deliveryService);
+		}
 	};
 
 };
 
-FormNewDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$controller', 'deliveryServiceService'];
+FormNewDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$controller', '$uibModal', 'deliveryServiceService', 'deliveryServiceRequestService'];
 module.exports = FormNewDeliveryServiceController;
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
index 8d0e52f27b..48d73f159f 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
@@ -21,7 +21,7 @@
     <div class="x_title">
         <ol class="breadcrumb pull-left">
             <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{deliveryService.xmlId}}</a></li>
             <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '/jobs')">Invalidate Content Jobs</a></li>
             <li class="active">{{jobName}}</li>
         </ol>
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
index c14781274f..693ddcbcac 100644
--- a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
@@ -21,7 +21,7 @@
     <div class="x_title">
         <ol class="breadcrumb pull-left">
             <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{deliveryService.xmlId}}</a></li>
             <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '/regexes')">Regexes</a></li>
             <li class="active">{{regexPattern}}</li>
         </ol>
diff --git a/traffic_portal/app/src/common/modules/navigation/NavigationController.js b/traffic_portal/app/src/common/modules/navigation/NavigationController.js
index 234900f7c6..87ecbe0aae 100644
--- a/traffic_portal/app/src/common/modules/navigation/NavigationController.js
+++ b/traffic_portal/app/src/common/modules/navigation/NavigationController.js
@@ -25,6 +25,8 @@ var NavigationController = function($scope, $log, $state, $location, $window, $t
 
     $scope.showCacheChecks = propertiesModel.properties.cacheChecks.show;
 
+    $scope.dsRequestsEnabled = propertiesModel.properties.dsRequests.enabled;
+
     $scope.userLoaded = userModel.loaded;
 
     $scope.user = userModel.user;
diff --git a/traffic_portal/app/src/common/modules/navigation/navigation.tpl.html b/traffic_portal/app/src/common/modules/navigation/navigation.tpl.html
index 8906b7f340..be46a18c4f 100644
--- a/traffic_portal/app/src/common/modules/navigation/navigation.tpl.html
+++ b/traffic_portal/app/src/common/modules/navigation/navigation.tpl.html
@@ -32,16 +32,16 @@
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.cacheStats')}"><a href="/#!/cache-stats">Cache Stats</a></li>
                     </ul>
                 </li>
-                <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-sm fa-chevron-right"></i> Configure</span></a>
+                <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-sm fa-chevron-right"></i> Services</span></a>
                     <ul class="nav child_menu" style="display: none">
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.cacheGroups')}"><a href="/#!/cache-groups">Cache Groups</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.deliveryServices')}"><a href="/#!/delivery-services">Delivery Services</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.servers')}"><a href="/#!/servers">Servers</a></li>
+                        <li class="side-menu-category-item" ng-if="::dsRequestsEnabled" ng-class="{'current-page': isState('trafficPortal.private.deliveryServiceRequests')}"><a href="/#!/delivery-service-requests">Delivery Service Requests</a></li>
                     </ul>
                 </li>
                 <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-sm fa-chevron-right"></i> Admin</span></a>
                     <ul class="nav child_menu" style="display: none">
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.asns')}"><a href="/#!/asns">ASNs</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.cacheGroups')}"><a href="/#!/cache-groups">Cache Groups</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.cdns')}"><a href="/#!/cdns">CDNs</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.divisions')}"><a href="/#!/divisions">Divisions</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.jobs')}"><a href="/#!/jobs">Jobs</a></li>
@@ -49,6 +49,7 @@
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.parameters')}"><a href="/#!/parameters">Parameters</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.profiles')}"><a href="/#!/profiles">Profiles</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.regions')}"><a href="/#!/regions">Regions</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.servers')}"><a href="/#!/servers">Servers</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.statuses')}"><a href="/#!/statuses">Statuses</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.tenants')}"><a href="/#!/tenants">Tenants</a></li>
                         <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.types')}"><a href="/#!/types">Types</a></li>
diff --git a/traffic_portal/app/src/common/modules/table/_table.scss b/traffic_portal/app/src/common/modules/table/_table.scss
index a64e1fe330..e4c1cb9821 100644
--- a/traffic_portal/app/src/common/modules/table/_table.scss
+++ b/traffic_portal/app/src/common/modules/table/_table.scss
@@ -20,4 +20,16 @@
   .fa-flag {
     font-weight: bold;
   }
+}
+
+.action-link {
+  padding: 5px;
+}
+
+td span {
+  line-height: 19px;
+}
+
+.filter-checkbox {
+  float: left;
 }
\ No newline at end of file
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
index 055ba1992d..c1d7622168 100644
--- a/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
@@ -21,7 +21,7 @@
     <div class="x_title">
         <ol class="breadcrumb pull-left">
             <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.xmlId}}</a></li>
             <li class="active">Invalidate Content Jobs</li>
         </ol>
         <div class="pull-right">
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
index 03ec2a4b57..6fe8eed948 100644
--- a/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
@@ -21,7 +21,7 @@
     <div class="x_title">
         <ol class="breadcrumb pull-left">
             <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.xmlId}}</a></li>
             <li class="active">Regexes</li>
         </ol>
         <div class="pull-right">
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/TableDeliveryServiceRequestsController.js b/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/TableDeliveryServiceRequestsController.js
new file mode 100644
index 0000000000..c99782fc40
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/TableDeliveryServiceRequestsController.js
@@ -0,0 +1,403 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+var TableDeliveryServicesRequestsController = function(dsRequests, $scope, $state, $uibModal, $anchorScroll, $q, dateUtils, locationUtils, typeService, deliveryServiceService, deliveryServiceRequestService, messageModel, userModel) {
+
+	var createDeliveryServiceDeleteRequest = function(deliveryService) {
+		var params = {
+			title: "Delivery Service Delete Request",
+			message: 'All delivery service deletions must be reviewed.<br><br>Are you sure you want to submit a request to delete the ' + deliveryService.xmlId + ' delivery service?'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
+			controller: 'DialogConfirmController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			var dsRequest = {
+				changeType: 'delete',
+				status: 'submitted',
+				deliveryService: deliveryService
+			};
+			deliveryServiceRequestService.createDeliveryServiceRequest(dsRequest, false).
+				then(function() {
+					$scope.refresh();
+				});
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.DRAFT = 0;
+	$scope.SUBMITTED = 1;
+	$scope.REJECTED = 2;
+	$scope.PENDING = 3;
+	$scope.COMPLETE = 4;
+
+	$scope.dsRequests = dsRequests;
+
+	$scope.getRelativeTime = dateUtils.getRelativeTime;
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.fulfillable = function(request) {
+		return request.status == 'submitted';
+	};
+
+	$scope.rejectable = function(request) {
+		return request.status == 'submitted';
+	};
+
+	$scope.completeable = function(request) {
+		return request.status == 'pending';
+	};
+
+	$scope.open = function(request) {
+		return (request.status == 'draft' || request.status == 'submitted');
+	};
+
+	$scope.closed = function(request) {
+		return (request.status == 'rejected' || request.status == 'complete');
+	};
+
+	$scope.assignRequest = function(request, assign, $event) {
+		$event.stopPropagation(); // this kills the click event so it doesn't trigger anything else
+		var params = {
+			title: 'Assign Delivery Service Request',
+			message: (assign) ? 'Are you sure you want to assign this delivery service request to yourself?' : 'Are you sure you want to unassign this delivery service request?'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
+			controller: 'DialogConfirmController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			var assigneeId = (assign) ? userModel.user.id : null;
+			deliveryServiceRequestService.assignDeliveryServiceRequest(request.id, assigneeId).
+				then(function() {
+					$scope.refresh();
+				});
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.editStatus = function(request, $event) {
+		$event.stopPropagation(); // this kills the click event so it doesn't trigger anything else
+		var params = {
+			title: "Edit Delivery Service Request Status",
+			message: 'Please select the appropriate status for this request.'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+			controller: 'DialogSelectController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				},
+				collection: function() {
+					return [
+						{ id: $scope.DRAFT, name: 'Save as Draft' },
+						{ id: $scope.SUBMITTED, name: 'Submit for Review / Deployment' }
+					];
+				}
+			}
+		});
+		modalInstance.result.then(function(action) {
+			request.status = (action.id == $scope.DRAFT) ? 'draft' : 'submitted';
+			deliveryServiceRequestService.updateDeliveryServiceRequest(request.id, request).
+				then(function() {
+					$scope.refresh();
+				});
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.rejectRequest = function(request, $event) {
+		$event.stopPropagation(); // this kills the click event so it doesn't trigger anything else
+		var params = {
+			title: 'Reject Delivery Service Request',
+			message: 'Are you sure you want to reject this delivery service request?'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
+			controller: 'DialogConfirmController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			var promises = [];
+			promises.push(deliveryServiceRequestService.assignDeliveryServiceRequest(request.id, userModel.user.id));
+			promises.push(deliveryServiceRequestService.updateDeliveryServiceRequestStatus(request.id, 'rejected'));
+
+			$q.all(promises)
+				.then(
+					function() {
+						$scope.refresh();
+					});
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.completeRequest = function(request, $event) {
+		$event.stopPropagation(); // this kills the click event so it doesn't trigger anything else
+
+		if (request.assigneeId != userModel.user.id) {
+			messageModel.setMessages([ { level: 'error', text: 'Only the Assignee can mark a delivery service request as complete' } ], false);
+			$anchorScroll(); // scrolls window to top
+			return;
+		}
+
+		var params = {
+			title: 'Complete Delivery Service Request',
+			message: 'Are you sure you want to mark this delivery service request as complete?'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
+			controller: 'DialogConfirmController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			deliveryServiceRequestService.updateDeliveryServiceRequestStatus(request.id, 'complete').
+				then(function() {
+					$scope.refresh();
+				});
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.deleteRequest = function(request, $event) {
+		$event.stopPropagation(); // this kills the click event so it doesn't trigger anything else
+		var params = {
+			title: 'Delete the ' + request.deliveryService.xmlId + ' ' + request.changeType + ' request?',
+			key: request.deliveryService.xmlId + ' ' + request.changeType + ' request'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+			controller: 'DialogDeleteController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			deliveryServiceRequestService.deleteDeliveryServiceRequest(request.id, false).
+				then(function() {
+					$scope.refresh();
+				});
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.createRequest = function() {
+		var CREATE = 1,
+			UPDATE = 2,
+			DELETE = 3;
+
+		var params = {
+			title: 'Create Delivery Service Request',
+			message: 'What kind of delivery service request would you like to create?'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+			controller: 'DialogSelectController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				},
+				collection: function() {
+					return [
+						{ id: CREATE, name: 'A request for a new delivery service' },
+						{ id: UPDATE, name: 'A request to update an existing delivery service' },
+						{ id: DELETE, name: 'A request to delete an existing delivery service' }
+					];
+				}
+			}
+		});
+		modalInstance.result.then(function(action) {
+			var params,
+				modalInstance;
+
+			if (action.id == CREATE) {
+				params = {
+					title: 'Create Delivery Service',
+					message: "Please select a content routing category"
+				};
+				modalInstance = $uibModal.open({
+					templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+					controller: 'DialogSelectController',
+					size: 'md',
+					resolve: {
+						params: function () {
+							return params;
+						},
+						collection: function() {
+							// the following represent the 4 categories of delivery services
+							// the ids are arbitrary but the dialog.select dropdown needs them
+							return [
+								{ id: 1, name: 'ANY_MAP' },
+								{ id: 2, name: 'DNS' },
+								{ id: 3, name: 'HTTP' },
+								{ id: 4, name: 'STEERING' }
+							];
+						}
+					}
+				});
+				modalInstance.result.then(function(type) {
+					var path = '/delivery-services/new?type=' + type.name;
+					locationUtils.navigateToPath(path);
+				}, function () {
+					// do nothing on cancel
+				});
+			} else if (action.id == UPDATE) {
+				params = {
+					title: 'Update Delivery Service',
+					message: "Please select a delivery service to update",
+					labelFunction: function (item) {
+						return item['xmlId']
+					}
+				};
+				modalInstance = $uibModal.open({
+					templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+					controller: 'DialogSelectController',
+					size: 'md',
+					resolve: {
+						params: function () {
+							return params;
+						},
+						collection: function (deliveryServiceService) {
+							return deliveryServiceService.getDeliveryServices();
+						}
+					}
+				});
+				modalInstance.result.then(function (ds) {
+					locationUtils.navigateToPath('/delivery-services/' + ds.id + '?type=' + ds.type);
+				}, function () {
+					// do nothing on cancel
+				});
+			} else if (action.id == DELETE) {
+				params = {
+					title: 'Delete Delivery Service',
+					message: "Please select a delivery service to delete",
+					labelFunction: function (item) {
+						return item['xmlId']
+					}
+				};
+				modalInstance = $uibModal.open({
+					templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+					controller: 'DialogSelectController',
+					size: 'md',
+					resolve: {
+						params: function () {
+							return params;
+						},
+						collection: function(deliveryServiceService) {
+							return deliveryServiceService.getDeliveryServices();
+						}
+					}
+				});
+				modalInstance.result.then(function(ds) {
+					createDeliveryServiceDeleteRequest(ds);
+				}, function () {
+					// do nothing on cancel
+				});
+			}
+
+		}, function () {
+			// do nothing on cancel
+		});
+	};
+
+	$scope.editDeliveryServiceRequest = function(request) {
+		var path = '/delivery-service-requests/' + request.id + '?type=';
+		typeService.getType(request.deliveryService.typeId)
+			.then(function(result) {
+				path += result.name;
+				locationUtils.navigateToPath(path);
+			});
+	};
+
+	$scope.fulfillRequest = function(request, $event) {
+		$event.stopPropagation(); // this kills the click event so it doesn't trigger anything else
+		var path = '/delivery-service-requests/' + request.id + '?type=';
+		typeService.getType(request.deliveryService.typeId)
+			.then(function(result) {
+				path += result.name;
+				locationUtils.navigateToPath(path);
+			});
+	};
+
+	angular.element(document).ready(function () {
+		var dsRequestsTable = $('#dsRequestsTable').dataTable({
+			"paging": false,
+			"dom": '<"filter-checkbox">frtip',
+			"columnDefs": [
+				{ 'orderable': false, 'targets': 7 }
+			],
+			"aaSorting": []
+		});
+		$('div.filter-checkbox').html('<input id="showClosed" type="checkbox"><label for="showClosed">&nbsp;&nbsp;Show Closed</label>');
+
+		// only show "open" ds requests on render
+		dsRequestsTable.fnFilter('draft|submitted|pending', 2, true, false);
+
+		$('#showClosed').click(function() {
+			var checked = $('#showClosed').is(':checked');
+			if (checked) {
+				dsRequestsTable.fnFilter('', 2, true, false);
+			} else {
+				dsRequestsTable.fnFilter('draft|submitted|pending', 2, true, false);
+			}
+		});
+
+	});
+
+};
+
+TableDeliveryServicesRequestsController.$inject = ['dsRequests', '$scope', '$state', '$uibModal', '$anchorScroll', '$q', 'dateUtils', 'locationUtils', 'typeService', 'deliveryServiceService', 'deliveryServiceRequestService', 'messageModel', 'userModel'];
+module.exports = TableDeliveryServicesRequestsController;
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/index.js b/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/index.js
new file mode 100644
index 0000000000..7a1f0b51dc
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/index.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module.exports = angular.module('trafficPortal.table.deliveryServiceRequests', [])
+	.controller('TableDeliveryServiceRequestsController', require('./TableDeliveryServiceRequestsController'));
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/table.deliveryServiceRequests.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/table.deliveryServiceRequests.tpl.html
new file mode 100644
index 0000000000..0d5c9c5ad5
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceRequests/table.deliveryServiceRequests.tpl.html
@@ -0,0 +1,73 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Delivery Service Requests</li>
+        </ol>
+        <div class="pull-right" role="group">
+            <button class="btn btn-primary" title="Create Delivery Service Request" ng-click="createRequest()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="dsRequestsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Delivery Service</th>
+                <th>Type</th>
+                <th>Status</th>
+                <th>Author</th>
+                <th>Assignee</th>
+                <th>Last Edited By</th>
+                <th>Created</th>
+                <th style="text-align: right;">Actions</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editDeliveryServiceRequest(request)" ng-repeat="request in ::dsRequests" ng-class="::{'active': closed(request)}">
+                <td data-search="^{{::request.deliveryService.xmlId}}$">{{::request.deliveryService.xmlId}}</td>
+                <td data-search="^{{::request.changeType}}$">{{::request.changeType}}</td>
+                <td data-search="^{{::request.status}}$">
+                    <span ng-if="!open(request)">{{::request.status}}</span>
+                    <a ng-if="open(request)" class="link" title="Change Status" ng-click="editStatus(request, $event)">{{::request.status}}</a>
+                </td>
+                <td data-search="^{{::request.author}}$">{{::request.author}}</td>
+                <td data-search="^{{::request.assignee}}$">
+                    <span ng-show="!open(request)">{{::request.assignee}}</span>
+                    <a ng-show="open(request) && !request.assignee" class="link" title="Assign Yourself" ng-click="assignRequest(request, true, $event)">No one - assign yourself</a>
+                    <a ng-show="open(request) && request.assignee" class="link" title="Unassign" ng-click="assignRequest(request, false, $event)">{{::request.assignee}} - unassign</a>
+                </td>
+                <td data-search="^{{::request.lastEditedBy}}$">{{::request.lastEditedBy}}</td>
+                <td title="{{request.createdAt}} (UTC)" data-search="^{{::getRelativeTime(request.createdAt)}}$" data-order="{{::request.createdAt}}">{{::getRelativeTime(request.createdAt)}}</td>
+                <td style="text-align: right;">
+                    <span ng-if="fulfillable(request)"><a class="link action-link" title="Fulfill Request" ng-click="fulfillRequest(request, $event)">fulfill</a>| </span>
+                    <span ng-if="rejectable(request)"><a class="link action-link" title="Reject Request" ng-click="rejectRequest(request, $event)">reject</a>| </span>
+                    <span ng-if="completeable(request)"><a class="link action-link" title="Complete Request" ng-click="completeRequest(request, $event)">complete</a></span>
+                    <span ng-if="open(request)"><a class="link action-link" title="Delete Request" ng-click="deleteRequest(request, $event)">delete</a></span>
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
index 8453039fcb..14722094cc 100644
--- a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
@@ -21,7 +21,7 @@
     <div class="x_title">
         <ol class="breadcrumb pull-left">
             <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.xmlId}}</a></li>
             <li class="active">Servers</li>
         </ol>
         <div class="pull-right">
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
index 3538f85ba2..bd60bba782 100644
--- a/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
@@ -21,7 +21,7 @@
     <div class="x_title">
         <ol class="breadcrumb pull-left">
             <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.xmlId}}</a></li>
             <li class="active">Static DNS Entries</li>
         </ol>
         <div class="pull-right">
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
index d7044815a8..6017f1ac12 100644
--- a/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
@@ -21,7 +21,7 @@
     <div class="x_title">
         <ol class="breadcrumb pull-left">
             <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.xmlId}}</a></li>
             <li class="active">Users</li>
         </ol>
         <div class="pull-right">
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
index 3453ad8a0c..91ba83e7a8 100644
--- a/traffic_portal/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
+++ b/traffic_portal/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
@@ -22,7 +22,7 @@
         <ol class="breadcrumb pull-left">
             <li class="active">Delivery Services</li>
         </ol>
-        <div class="pull-right" role="group" ng-if="!settings.isNew">
+        <div class="pull-right" role="group">
             <button class="btn btn-primary" title="Create Delivery Service" ng-click="selectDSType()"><i class="fa fa-plus"></i></button>
             <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
             <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
diff --git a/traffic_portal/app/src/modules/private/deliveryServiceRequests/deliveryServiceRequests.tpl.html b/traffic_portal/app/src/modules/private/deliveryServiceRequests/deliveryServiceRequests.tpl.html
new file mode 100644
index 0000000000..39ac36a150
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/deliveryServiceRequests/deliveryServiceRequests.tpl.html
@@ -0,0 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<div id="deliveryServiceRequestsContainer">
+    <div ui-view="deliveryServiceRequestsContent"></div>
+</div>
diff --git a/traffic_portal/app/src/modules/private/deliveryServiceRequests/edit/FormEditDeliveryServiceRequestController.js b/traffic_portal/app/src/modules/private/deliveryServiceRequests/edit/FormEditDeliveryServiceRequestController.js
new file mode 100644
index 0000000000..e4d1619b83
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/deliveryServiceRequests/edit/FormEditDeliveryServiceRequestController.js
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+var FormEditDeliveryServiceRequestController = function(deliveryServiceRequest, deliveryService, type, types, $scope, $state, $stateParams, $controller, $uibModal, $anchorScroll, $q, locationUtils, deliveryServiceService, deliveryServiceRequestService, messageModel, userModel) {
+
+	var dsRequest = deliveryServiceRequest[0];
+		
+	// extends the FormDeliveryServiceController to inherit common methods
+	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: dsRequest.deliveryService, dsCurrent: deliveryService, type: type, types: types, $scope: $scope }));
+
+	$scope.changeType = dsRequest.changeType;
+
+	$scope.requestStatus = dsRequest.status;
+
+	$scope.deliveryServiceName = angular.copy(dsRequest.deliveryService.xmlId);
+
+	$scope.advancedShowing = true;
+
+	$scope.settings = {
+		isNew: false,
+		isRequest: true,
+		saveLabel: 'Update Request',
+		deleteLabel: 'Delete Request'
+	};
+
+	$scope.saveable = function() {
+		return (dsRequest.status == 'draft' || dsRequest.status == 'submitted');
+	};
+
+	$scope.deletable = function() {
+		return (dsRequest.status == 'draft' || dsRequest.status == 'submitted');
+	};
+
+	$scope.fulfillable = function() {
+		return dsRequest.status == 'submitted';
+	};
+
+	$scope.open = function() {
+		return (dsRequest.status == 'draft' || dsRequest.status == 'submitted' || dsRequest.status == 'pending');
+	};
+
+	$scope.magicNumberLabel = function(collection, magicNumber) {
+		var item = _.findWhere(collection, { value: magicNumber });
+		return item.label;
+	};
+
+	$scope.editStatus = function() {
+		var params = {
+			title: "Edit Delivery Service Request Status",
+			message: 'Please select the appropriate status for this request.'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+			controller: 'DialogSelectController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				},
+				collection: function() {
+					var statuses = [];
+					if (dsRequest.status == 'draft' || dsRequest.status == 'submitted') {
+						statuses.push({ id: $scope.DRAFT, name: 'Save as Draft' });
+						statuses.push({ id: $scope.SUBMITTED, name: 'Submit for Review / Deployment' });
+					} else if (dsRequest.status == 'pending') {
+						statuses.push({ id: $scope.COMPLETE, name: 'Complete' });
+					}
+					return statuses;
+				}
+			}
+		});
+		modalInstance.result.then(function(action) {
+			switch (action.id) {
+				case $scope.DRAFT:
+					dsRequest.status = 'draft';
+					deliveryServiceRequestService.updateDeliveryServiceRequest(dsRequest.id, dsRequest).
+						then(function() {
+							$state.reload();
+						});
+					break;
+				case $scope.SUBMITTED:
+					dsRequest.status = 'submitted';
+					deliveryServiceRequestService.updateDeliveryServiceRequest(dsRequest.id, dsRequest).
+						then(function() {
+							$state.reload();
+						});
+					break;
+				case $scope.COMPLETE:
+					if (dsRequest.assigneeId != userModel.user.id) {
+						messageModel.setMessages([ { level: 'error', text: 'Only the Assignee can mark a delivery service request as complete' } ], false);
+						$anchorScroll(); // scrolls window to top
+						return;
+					}
+					deliveryServiceRequestService.updateDeliveryServiceRequestStatus(dsRequest.id, 'complete').
+						then(function() {
+							$state.reload();
+						});
+			}
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.fulfillRequest = function(ds) {
+		var promises = [];
+		var params = {
+			title: 'Delivery Service ' + $scope.changeType + ': ' + ds.xmlId,
+			message: 'Are you sure you want to fulfill this delivery service request and ' + $scope.changeType + ' the ' + ds.xmlId + ' delivery service'
+		};
+		params['message'] += ($scope.changeType == 'create' || $scope.changeType == 'update') ? ' with these configuration settings?' : '?';
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
+			controller: 'DialogConfirmController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			// update the ds request if the ds request actually changed
+			if ($scope.deliveryServiceForm.$dirty) {
+				promises.push(deliveryServiceRequestService.updateDeliveryServiceRequest(dsRequest.id, dsRequest));
+			}
+			// make sure the ds request is assigned to the user that is fulfilling the request
+			promises.push(deliveryServiceRequestService.assignDeliveryServiceRequest(dsRequest.id, userModel.user.id));
+			// set the status to 'pending'
+			promises.push(deliveryServiceRequestService.updateDeliveryServiceRequestStatus(dsRequest.id, 'pending'));
+
+			// create, update or delete the ds per the ds request
+			if ($scope.changeType == 'create') {
+				deliveryServiceService.createDeliveryService(ds).
+					then(function() {
+						$q.all(promises); // after a successful create, update the ds request, assignee and status
+					});
+			} else if ($scope.changeType == 'update') {
+				deliveryServiceService.updateDeliveryService(ds, true).
+					then(function() {
+						$q.all(promises); // after a successful update, update the ds request, assignee and status
+					});
+			} else if ($scope.changeType == 'delete') {
+				// and we're going to ask even again if they really want to delete but this time they need to enter the ds name to confirm the delete
+				params = {
+					title: 'Delete Delivery Service: ' + ds.xmlId,
+					key: ds.xmlId
+				};
+				modalInstance = $uibModal.open({
+					templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+					controller: 'DialogDeleteController',
+					size: 'md',
+					resolve: {
+						params: function () {
+							return params;
+						}
+					}
+				});
+				modalInstance.result.then(function() {
+					deliveryServiceService.deleteDeliveryService(ds, true).
+					then(function() {
+						$q.all(promises) // after a successful delete, update the ds request, assignee and status and navigate to ds requests page
+							.then(function() {
+								locationUtils.navigateToPath('/delivery-service-requests');
+							});
+					});
+				}, function () {
+					// do nothing
+				});
+			}
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.save = function(deliveryService) {
+		var params = {
+			title: 'Delivery Service Request Status',
+			message: 'Please select the status of your delivery service request.'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+			controller: 'DialogSelectController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				},
+				collection: function() {
+					return [
+						{ id: $scope.DRAFT, name: 'Save as Draft' },
+						{ id: $scope.SUBMITTED, name: 'Submit for Review / Deployment' }
+					];
+				}
+			}
+		});
+		modalInstance.result.then(function(action) {
+			dsRequest.status = (action.id == $scope.SUBMITTED) ? 'submitted' : 'draft';
+			dsRequest.deliveryService = deliveryService;
+			deliveryServiceRequestService.updateDeliveryServiceRequest(dsRequest.id, dsRequest).
+				then(function() {
+					messageModel.setMessages([ { level: 'success', text: 'Updated delivery service request for ' + dsRequest.deliveryService.xmlId + ' and set status to ' + dsRequest.status } ], false);
+					$anchorScroll(); // scrolls window to top
+					$state.reload();
+				});
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.confirmDelete = function(deliveryService) {
+		var params = {
+			title: 'Delete ' + deliveryService.xmlId + ' ' + dsRequest.changeType + ' request?',
+			key: deliveryService.xmlId + ' request'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+			controller: 'DialogDeleteController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			deliveryServiceRequestService.deleteDeliveryServiceRequest($stateParams.deliveryServiceRequestId, true);
+		}, function () {
+			// do nothing
+		});
+	};
+
+};
+
+FormEditDeliveryServiceRequestController.$inject = ['deliveryServiceRequest', 'deliveryService', 'type', 'types', '$scope', '$state', '$stateParams', '$controller', '$uibModal', '$anchorScroll', '$q', 'locationUtils', 'deliveryServiceService', 'deliveryServiceRequestService', 'messageModel', 'userModel'];
+module.exports = FormEditDeliveryServiceRequestController;
diff --git a/traffic_portal/app/src/modules/private/deliveryServiceRequests/edit/index.js b/traffic_portal/app/src/modules/private/deliveryServiceRequests/edit/index.js
new file mode 100644
index 0000000000..9702bad5fa
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/deliveryServiceRequests/edit/index.js
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module.exports = angular.module('trafficPortal.private.deliveryServiceRequests.edit', [])
+	.controller('FormEditDeliveryServiceRequestController', require('./FormEditDeliveryServiceRequestController'))
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.deliveryServiceRequests.edit', {
+				url: '/{deliveryServiceRequestId:[0-9]{1,8}}?type&fulfill',
+				views: {
+					deliveryServiceRequestsContent: {
+						templateUrl: function ($stateParams) {
+							var type = $stateParams.type,
+								template;
+
+							if (type.indexOf('ANY_MAP') != -1) {
+								template = 'common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html'
+							} else if (type.indexOf('DNS') != -1) {
+								template = 'common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html'
+							} else if (type.indexOf('HTTP') != -1) {
+								template = 'common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html'
+							} else if (type.indexOf('STEERING') != -1) {
+								template = 'common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html'
+							} else {
+
+							}
+
+							return template;
+						},
+						controller: 'FormEditDeliveryServiceRequestController',
+						resolve: {
+							deliveryServiceRequest: function($stateParams, deliveryServiceRequestService) {
+								return deliveryServiceRequestService.getDeliveryServiceRequests({ id: $stateParams.deliveryServiceRequestId });
+							},
+							deliveryService: function(deliveryServiceRequest, deliveryServiceService) {
+								var dsRequest = deliveryServiceRequest[0];
+
+								if (dsRequest.changeType == 'update') {
+									// fetch the ds that the request is attempting to update for comparison reasons
+									return deliveryServiceService.getDeliveryService(dsRequest.deliveryService.id);
+								} else {
+									// on create, there is nothing to compare so comparing A to A shows no difference
+									return dsRequest.deliveryService;
+								}
+							},
+							type: function($stateParams) {
+								return $stateParams.type;
+							},
+							types: function(typeService) {
+								return typeService.getTypes({ useInTable: 'deliveryservice' });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});
diff --git a/traffic_portal/app/src/modules/private/deliveryServiceRequests/index.js b/traffic_portal/app/src/modules/private/deliveryServiceRequests/index.js
new file mode 100644
index 0000000000..1a5507e1f1
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/deliveryServiceRequests/index.js
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module.exports = angular.module('trafficPortal.private.deliveryServiceRequests', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.deliveryServiceRequests', {
+				url: 'delivery-service-requests',
+				abstract: true,
+				views: {
+					privateContent: {
+						templateUrl: 'modules/private/deliveryServiceRequests/deliveryServiceRequests.tpl.html'
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});
diff --git a/traffic_portal/app/src/modules/private/deliveryServiceRequests/list/index.js b/traffic_portal/app/src/modules/private/deliveryServiceRequests/list/index.js
new file mode 100644
index 0000000000..d86c7c961a
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/deliveryServiceRequests/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module.exports = angular.module('trafficPortal.private.deliveryServiceRequests.list', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.deliveryServiceRequests.list', {
+				url: '',
+				views: {
+					deliveryServiceRequestsContent: {
+						templateUrl: 'common/modules/table/deliveryServiceRequests/table.deliveryServiceRequests.tpl.html',
+						controller: 'TableDeliveryServiceRequestsController',
+						resolve: {
+							dsRequests: function(deliveryServiceRequestService) {
+								return deliveryServiceRequestService.getDeliveryServiceRequests();
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});
diff --git a/traffic_portal/app/src/modules/private/deliveryServices/uriSigningKeys/deliveryServiceUriSigningKeys.tpl.html b/traffic_portal/app/src/modules/private/deliveryServices/uriSigningKeys/deliveryServiceUriSigningKeys.tpl.html
index 4d245ab2dc..f881846706 100644
--- a/traffic_portal/app/src/modules/private/deliveryServices/uriSigningKeys/deliveryServiceUriSigningKeys.tpl.html
+++ b/traffic_portal/app/src/modules/private/deliveryServices/uriSigningKeys/deliveryServiceUriSigningKeys.tpl.html
@@ -22,7 +22,7 @@
 			<div class="x_title">
 				<ol class="breadcrumb pull-left">
 					<li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-					<li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+					<li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.xmlId}}</a></li>
 					<li class="active">URI Signing Keys</li>
 				</ol>
 				<div class="clearfix"></div>
diff --git a/traffic_portal/app/src/modules/private/deliveryServices/urlSigKeys/deliveryServiceUrlSigKeys.tpl.html b/traffic_portal/app/src/modules/private/deliveryServices/urlSigKeys/deliveryServiceUrlSigKeys.tpl.html
index c07b6de510..74be76f9cf 100644
--- a/traffic_portal/app/src/modules/private/deliveryServices/urlSigKeys/deliveryServiceUrlSigKeys.tpl.html
+++ b/traffic_portal/app/src/modules/private/deliveryServices/urlSigKeys/deliveryServiceUrlSigKeys.tpl.html
@@ -23,7 +23,7 @@
 		    <div class="x_title">
 		        <ol class="breadcrumb pull-left">
 		            <li><a ng-click="navigateToPath('/delivery-services')">Delivery Services</a></li>
-		            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+		            <li><a ng-click="navigateToPath('/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.xmlId}}</a></li>
 		            <li class="active">URL Sig Keys</li>
 		        </ol>
 		        <div class="pull-right">
diff --git a/traffic_portal/app/src/styles/main.scss b/traffic_portal/app/src/styles/main.scss
index 8b69feeff7..d6fefb5f46 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/form";
 @import "../common/modules/message/message";
 @import "../common/modules/navigation/navigation";
 @import "../common/modules/table/table";
@@ -94,10 +95,17 @@ body.nav-sm .container.body .main-content {
 }
 
 .input-error {
+  display: block;
   color: #a94442;
   font-weight: bold;
 }
 
+.input-diff {
+  display: block;
+  color: blue;
+  font-weight: bold;
+}
+
 .input-warning {
   color: #856404;
   font-weight: bold;
diff --git a/traffic_portal/app/src/traffic_portal_properties.json b/traffic_portal/app/src/traffic_portal_properties.json
index c4624cfd97..37210181f5 100644
--- a/traffic_portal/app/src/traffic_portal_properties.json
+++ b/traffic_portal/app/src/traffic_portal_properties.json
@@ -37,6 +37,10 @@
         "context": 1000
       }
     },
+    "dsRequests": {
+      "_comments": "Should all delivery service changes go through the delivery service review process?",
+      "enabled": false
+    },
     "cacheChecks": {
       "_comments": "These are configurable properties for the cache checks view. The data for the cache checks view is derived from TO extensions.",
       "show": true,
@@ -116,6 +120,201 @@
           "geoLimit": 0,
           "regionalGeoBlocking": false,
           "ccrDnsTtl": 30
+        },
+        "descriptions": {
+          "_comments": "This is the text used to configure delivery service field titles/descriptions",
+          "active": {
+            "title": "Active",
+            "desc": "When this is set to false Traffic Router will not serve DNS or HTTP responses for this delivery service."
+          },
+          "cacheurl": {
+            "title": "Cache URL expression",
+            "desc": "Cache URL rule to apply to this delivery service.<br><br>See <a href=\"https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/cacheurl.en.html\" target=\"_blank\">ATS documentation on cacheurl...</a>"
+          },
+          "ccrDnsTtl": {
+            "title": "Delivery Service DNS TTL",
+            "desc": "The Time To Live on the DNS record for the Traffic Router A and AAAA records."
+          },
+          "cdnId": {
+            "title": "CDN",
+            "desc": "The CDN in which the delivery service belongs to."
+          },
+          "checkPath": {
+            "title": "Check Path",
+            "desc": "A path (ex: /crossdomain.xml) to verify the connection to the origin server with. This can be used by Check Extension scripts to do periodic health checks against the delivery service."
+          },
+          "deepCachingType": {
+            "title": "Deep Caching",
+            "desc": "When to do deep caching for this delivery service.<br><br>See <a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_router.html#rl-deep-cache\" target=\"_blank\">Deep Caching</a> for more details..."
+          },
+          "displayName": {
+            "title": "Display Name",
+            "desc": "A human-readable name for the delivery service."
+          },
+          "dnsBypassCname": {
+            "title": "DNS Bypass CNAME",
+            "desc": "Description required"
+          },
+          "dnsBypassIp": {
+            "title": "DNS Bypass IP",
+            "desc": "This is the address to respond to A requests with when the max Bps or Max Tps for this delivery service are exceeded."
+          },
+          "dnsBypassIp6": {
+            "title": "DNS Bypass IPv6",
+            "desc": "This is the address to respond to AAAA requests with when the max Bps or Max Tps for this delivery service are exceeded."
+          },
+          "dnsBypassTtl": {
+            "title": "DNS Bypass TTL",
+            "desc": "Description required"
+          },
+          "dscp": {
+            "title": "DSCP",
+            "desc": "The DSCP value to mark IP packets to the client with."
+          },
+          "edgeHeaderRewrite": {
+            "title": "Edge Header Rewrite Rules",
+            "desc": "Header Rewrite rules to apply for this delivery service at the EDGE tier.<br><br>See <a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#rl-header-rewrite\" target=\"_blank\">Header Rewrite Options and DSCP...</a>"
+          },
+          "geoLimitRedirectURL": {
+            "title": "Geo Limit Redirect URL",
+            "desc": "This is the URL Traffic Router will redirect to when Geo Limit Failure.<br><br>See <a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_router.html#rl-tr-ngb\" target=\"_blank\">GeoLimit Failure Redirect</a> feature..."
+          },
+          "geoLimit": {
+            "title": "Geo Limit",
+            "desc": "Some services are intended to be limited by geography.<br><br><a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#delivery-service\" target=\"_blank\">See more...</a>"
+          },
+          "geoLimitCountries": {
+            "title": "Geo Limit Countries",
+            "desc": "Description required"
+          },
+          "geoProvider": {
+            "title": "Geolocation Provider",
+            "desc": "Description required"
+          },
+          "globalMaxMbps": {
+            "title": "Global Max Mbps",
+            "desc": "The maximum bits per second this delivery service can serve across all EDGE caches before traffic will be diverted to the bypass destination. For a DNS delivery service, the Bypass Ipv4 or Ipv6 will be used (depending on whether this was a A or AAAA request), and for HTTP delivery services the Bypass FQDN will be used."
+          },
+          "globalMaxTps": {
+            "title": "Global Max TPS",
+            "desc": "The maximum transactions this delivery service can serve across all EDGE caches before traffic will be diverted to the bypass destination. For a DNS delivery service, the Bypass Ipv4 or Ipv6 will be used (depending on whether this was a A or AAAA request), and for HTTP delivery services the Bypass FQDN will be used."
+          },
+          "httpBypassFqdn": {
+            "title": "HTTP Bypass FQDN",
+            "desc": "This is the FQDN Traffic Router will redirect to (with the same path) when the max Bps or Max Tps for this delivery service are exceeded."
+          },
+          "infoUrl": {
+            "title": "Info URL",
+            "desc": "Info URL for this delivery service."
+          },
+          "initialDispersion": {
+            "title": "Initial Dispersion",
+            "desc": "Description required"
+          },
+          "ipv6RoutingEnabled": {
+            "title": "IPv6 Routing Enabled",
+            "desc": "When set to true, the Traffic Router will respond to AAAA DNS requests for the routed name of this delivery service. Otherwise, only A records will be served."
+          },
+          "logsEnabled": {
+            "title": "Logs Enabled",
+            "desc": "Description required"
+          },
+          "longDesc": {
+            "title": "Long Description",
+            "desc": "Long description for this delivery service."
+          },
+          "longDesc1": {
+            "title": "Long Description 2",
+            "desc": "Long description 2 for this delivery service."
+          },
+          "longDesc2": {
+            "title": "Long Description 3",
+            "desc": "Long description 3 for this delivery service."
+          },
+          "maxDnsAnswers": {
+            "title": "Max DNS Answers",
+            "desc": "Description required"
+          },
+          "midHeaderRewrite": {
+            "title": "Mid Header Rewrite Rules",
+            "desc": "Header Rewrite rules to apply for this delivery service at the EDGE tier.<br><br>See <a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#rl-header-rewrite\" target=\"_blank\">Header Rewrite Options and DSCP...</a>"
+          },
+          "missLat": {
+            "title": "Geo Miss Default Latitude",
+            "desc": "Default Latitude for this delivery service. When client localization fails for both Coverage Zone and Geo Lookup, the client will be routed as if it was at this lat."
+          },
+          "missLong": {
+            "title": "Geo Miss Default Longitude",
+            "desc": "Default Longitude for this delivery service. When client localization fails for both Coverage Zone and Geo Lookup, the client will be routed as if it was at this long."
+          },
+          "multiSiteOrigin": {
+            "title": "Use Multi Site Origin Feature",
+            "desc": "Enable the Multi Site Origin feature for this delivery service.<br><br><a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#rl-multi-site-origin\" target=\"_blank\">See Multi Site Origin...</a>"
+          },
+          "orgServerFqdn": {
+            "title": "Origin Server Base URL",
+            "desc": "The Origin Server?s base URL. This includes the protocol (http or https). Example: http://movies.origin.com"
+          },
+          "originShield": {
+            "title": "Origin Shield (Pipe Delimited String)",
+            "desc": "Description required"
+          },
+          "profileId": {
+            "title": "Delivery Service Profile",
+            "desc": "Description required"
+          },
+          "protocol": {
+            "title": "Protocol",
+            "desc": "The protocol to serve this delivery service to the clients with.<br><br><a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#delivery-service\" target=\"_blank\">See more...</a>"
+          },
+          "qstringIgnore": {
+            "title": "Query String Handling",
+            "desc": "How to treat query strings.<br><br><a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#delivery-service\" target=\"_blank\">See more...</a>"
+          },
+          "rangeRequestHandling": {
+            "title": "Range Request Handling",
+            "desc": "How to treat range requests.<br><br><a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#delivery-service\" target=\"_blank\">See more...</a>"
+          },
+          "regexRemap": {
+            "title": "Regex remap expression",
+            "desc": "Regex Remap rule to apply to this delivery service at the Edge tier.<br><br><a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#delivery-service\" target=\"_blank\">See more...</a>"
+          },
+          "regionalGeoBlocking": {
+            "title": "Regional Geoblocking",
+            "desc": "Description required"
+          },
+          "remapText": {
+            "title": "Raw remap text",
+            "desc": "For HTTP and DNS delivery services, this will get added to the end of the remap line on the cache verbatim. For ANY_MAP delivery services this is the remap line."
+          },
+          "routingName": {
+            "title": "Routing Name",
+            "desc": "The routing name to use for the delivery FQDN, i.e. routing-name.deliveryservice.cdn-domain. It must be a valid hostname without periods."
+          },
+          "signingAlgorithm": {
+            "title": "Signing Algorithm",
+            "desc": "Description required"
+          },
+          "tenantId": {
+            "title": "Tenant",
+            "desc": "By selecting a tenant for the delivery service, you restrict access of that delivery service to only those users that belong to the same tenant or a parent tenant."
+          },
+          "trRequestHeaders": {
+            "title": "Traffic Router Log Request Headers",
+            "desc": "Description required"
+          },
+          "trResponseHeaders": {
+            "title": "Traffic Router Additional Response Headers",
+            "desc": "Description required"
+          },
+          "typeId": {
+            "title": "Content Routing Type",
+            "desc": "The type of content routing this delivery service will use.<br><br><a href=\"http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html#rl-ds-types\" target=\"_blank\">See Delivery Service Types....</a>"
+          },
+          "xmlId": {
+            "title": "Key (XML ID)",
+            "desc": "A unique string that identifies this delivery service."
+          }
         }
       }
     },


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services