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/05/14 21:36:09 UTC

[GitHub] dangogh closed pull request #2149: TO and TODB in docker front-to-back

dangogh closed pull request #2149: TO and TODB in docker front-to-back
URL: https://github.com/apache/incubator-trafficcontrol/pull/2149
 
 
   

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/.dependency_license b/.dependency_license
index f4636cd89..bff7215e2 100644
--- a/.dependency_license
+++ b/.dependency_license
@@ -114,7 +114,8 @@ datatables\.min, MIT
 GeoLite2-City.mmdb.gz, CC-A-SA
 jquery\.tree\.min\.css$, MIT
 jquery\.dataTables\..*\.(css|js)$, MIT
-^traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/.*, MIT
+github\.com/basho/backoff/.*, MIT
+github\.com/dchest/siphash/.*, CC0
 
 # Ignored - Do not report.
 \.DS_Store, Ignore # Created automatically OSX.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54f645012..7ad7d7548 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,6 +22,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
   - /api/1.3/deliveryservice_requests `(GET,POST,PUT,DELETE)`
   - /api/1.3/divisions `(GET,POST,PUT,DELETE)`
   - /api/1.3/hwinfos `(GET)`
+  - /api/1.3/coordinates `(GET,POST,PUT,DELETE)`
   - /api/1.3/parameters `(GET,POST,PUT,DELETE)`
   - /api/1.3/profileparameters `(GET,POST,PUT,DELETE)`
   - /api/1.3/phys_locations `(GET,POST,PUT,DELETE)`
diff --git a/LICENSE b/LICENSE
index 2c37757b5..d1befb587 100644
--- a/LICENSE
+++ b/LICENSE
@@ -321,13 +321,9 @@ For the jwt-go component:
 
 For the pq component:
 @traffic_ops/experimental/traffic_ops_auth/vendor/github.com/lib/pq/*
-@traffic_ops/testing/api/vendor/github.com/lib/pq/*
+@traffic_ops/vendor/github.com/lib/pq/*
 ./traffic_ops/experimental/traffic_ops_auth/vendor/github.com/lib/pq/LICENSE.md
 
-and also:
-@traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/*
-./traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/LICENSE.md
-
 For the influxdb component:
 @traffic_stats/vendor/github.com/influxdata/influxdb/*
 ./traffic_stats/vendor/github.com/influxdata/influxdb/LICENSE
@@ -381,42 +377,40 @@ The invalid_passwords.txt file is from the Projects/OWASP SecLists Project provi
 ./licenses/MIT-SecLists
 
 For the go-sqlmock component:
-@traffic_ops/traffic_ops_golang/vendor/gopkg.in/DATA-DOG/go-sqlmock.v1/*
-./traffic_ops/traffic_ops_golang/vendor/gopkg.in/DATA-DOG/go-sqlmock.v1/LICENSE
+@traffic_ops/vendor/gopkg.in/DATA-DOG/go-sqlmock.v1/*
+./traffic_ops/vendor/gopkg.in/DATA-DOG/go-sqlmock.v1/LICENSE
 
 For the go-jwx component:
-@traffic_ops/traffic_ops_golang/vendor/github.com/lestrrat/go-jwx/*
-./traffic_ops/traffic_ops_golang/vendor/github.com/lestrrat/go-jwx/LICENSE
+@traffic_ops/vendor/github.com/lestrrat/go-jwx/*
+./traffic_ops/vendor/github.com/lestrrat/go-jwx/LICENSE
 
 For the protobuf component:
-@traffic_ops/traffic_ops_golang/vendor/github.com/golang/protobuf/*
-./traffic_ops/traffic_ops_golang/vendor/github.com/golang/protobuf/LICENSE
+@traffic_ops/vendor/github.com/golang/protobuf/*
+./traffic_ops/vendor/github.com/golang/protobuf/LICENSE
 
 For the sqlx component:
-@traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/*
-@traffic_ops/testing/api/vendor/github.com/jmoiron/sqlx/*
-./traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/LICENSE
+@traffic_ops/vendor/github.com/jmoiron/sqlx/*
+./traffic_ops/vendor/github.com/jmoiron/sqlx/LICENSE
 
 For the backoff component:
-@traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/*
-./traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/README.md
+@traffic_ops/vendor/github.com/basho/backoff/*
+./traffic_ops/vendor/github.com/basho/backoff/README.md
 
 The riak-go-client component is used under the Apache license:
-@traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/*
-./traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/LICENSE
+@traffic_ops/vendor/github.com/basho/riak-go-client/*
+./traffic_ops/vendor/github.com/basho/riak-go-client/LICENSE
 
 The envconfig component is used under the MIT license:
-@traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/*
-@traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/*
-./traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/LICENSE
+@traffic_ops/vendor/github.com/kelseyhightower/envconfig/*
+./traffic_ops/vendor/github.com/kelseyhightower/envconfig/LICENSE
 
 The govalidator component is used under the MIT license:
-@traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/*
-./traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/LICENSE
+@traffic_ops/vendor/github.com/asaskevich/govalidator/*
+./traffic_ops/vendor/github.com/asaskevich/govalidator/LICENSE
 
 The ozzo-validation component is used under the MIT license:
-@traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/*
-./traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/LICENSE
+@traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/*
+./traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/LICENSE
 
 The spinner-small.gif is used under the WTFPL license:
 @traffic_ops/app/public/images/spinner-small.gif
diff --git a/docs/source/admin/quick_howto/anonymous_blocking.rst b/docs/source/admin/quick_howto/anonymous_blocking.rst
new file mode 100644
index 000000000..4ee0ad5bd
--- /dev/null
+++ b/docs/source/admin/quick_howto/anonymous_blocking.rst
@@ -0,0 +1,87 @@
+..
+..
+.. 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.
+..
+
+.. _rl-anonymous_blocking-qht:
+
+**************************************
+Configure Anonymous Blocking
+**************************************
+
+.. Note:: Anonymous Blocking is only supported for HTTP delivery services.
+
+1)  Prepare the Anonymous Blocking configuration file
+
+Anonymous Blocking uses a configuration file in JSON format to define blocking rules for delivery services. The file needs to be put on an HTTP server accessible to Traffic Router. An example of the JSON is as follows::
+
+    {
+
+       "customer": "YourCompany",
+       "version": "1",
+       "date" : "2017-05-23 03:28:25",
+       "name": "Anonymous IP Blocking Policy",
+
+       "anonymousIp": { "blockAnonymousVPN": true,
+                        "blockHostingProvider": true, 
+                        "blockPublicProxy": true,
+                        "blockTorExitNode": true},
+                        
+       "ip4Whitelist": ["192.168.30.0/24", "10.0.2.0/24", "10.1.1.1/32"],
+       
+       "ip6Whitelist": ["2001:550:90a::/48", "::1/128"],
+       
+       "redirectUrl": "http://youvebeenblocked.com"
+    }
+
+* “anonymousIp” contains the types of IPs which can be checked against the Anonymous IP Database. There are 4 types of IPs which can be checked: VPNs, Hosting Providers, Public Proxies, and Tor Exit Nodes. Each type of IP can be enabled or disabled. If the value is true, IPs which match this type will be blocked when the feature is enabled in the delivery service. If the value is false, IPs which match this type will not be blocked. If an IP matches more than 1 type and any type is enabled, the IP will be blocked.
+
+* “redirectUrl” is the URL that will be returned to the blocked clients. Without a redirectUrl, the clients will receive an HTTP response code 403. With a redirectUrl, the clients will be redirected with an HTTP response code 302.
+
+* “ipWhiteList” is an optional element. It includes a list of CIDR (Classless Inter-Domain Routing) blocks indicating the IPv4 and IPv6 subnets that are allowed by the rule. If this list exists and the value is not empty, client IP will be matched against the CIDR list, and if there is any match, the request will be allowed. If there is no match in the white list, further anonymous blocking logic will continue.
+
+
+2)  Add Anonymous Blocking parameters on Traffic Ops
+
+The following three new parameters are required to be added into CRConfig.json:
+
+* "anonymousip.policy.configuration": the HTTP URL of the Anonymous Blocking configuration file. Traffic Router will fetch the file from this URL.
+* "anonymousip.polling.url": the HTTP URL of the Anonymous IP Database. Traffic Router will fetch the file from this URL.
+* "anonymousip.polling.interval": the interval that Traffic Router polls the Anonymous Blocking configuration file and Anonymous IP Database.
+
+.. image:: anonymous_blocking01.png
+  :scale: 100%
+  :align: center
+
+3)  Enable Anonmyous Blocking for a delivery service
+
+.. image:: anonymous_blocking02.png
+  :scale: 100%
+  :align: center
+
+4)  Make configuration effective
+
+Go to Tools->Snapshot CRConfig, perform “Diff CRConfig” and click "Write CRConfig".
+
+.. image:: regionalgeo03.png
+  :scale: 70%
+  :align: center
+
+5)  Traffic Router access log with Anonymous Blocking
+
+Anonymous Blocking extends the field of "rtype" and adds a new field "ANON_BLOCK" in Traffic Router access.log to help to monitor the working of this feature.
+
+If rtype=ANON_BLOCK then the client's IP was found in the Anonymous IP Database and was blocked.
+
+   
+
diff --git a/docs/source/admin/quick_howto/anonymous_blocking01.png b/docs/source/admin/quick_howto/anonymous_blocking01.png
new file mode 100644
index 000000000..bda89db11
Binary files /dev/null and b/docs/source/admin/quick_howto/anonymous_blocking01.png differ
diff --git a/docs/source/admin/quick_howto/anonymous_blocking02.png b/docs/source/admin/quick_howto/anonymous_blocking02.png
new file mode 100644
index 000000000..0b7404693
Binary files /dev/null and b/docs/source/admin/quick_howto/anonymous_blocking02.png differ
diff --git a/docs/source/admin/quick_howto/index.rst b/docs/source/admin/quick_howto/index.rst
index d04a01989..4c6b6dcc9 100644
--- a/docs/source/admin/quick_howto/index.rst
+++ b/docs/source/admin/quick_howto/index.rst
@@ -27,6 +27,7 @@ Traffic Ops
   dnssec.rst
   federations.rst
   regionalgeo.rst
+  anonymous_blocking.rst
   steering.rst
 
 Traffic Portal
diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst
index cd619bce1..6cdf32ed8 100644
--- a/docs/source/api/index.rst
+++ b/docs/source/api/index.rst
@@ -24,4 +24,5 @@ A guide to external RESTful APIs for Traffic Ops
   routes
   v11/index
   v12/index
+  v13/index
   
diff --git a/docs/source/api/traffic_ops_api.rst b/docs/source/api/traffic_ops_api.rst
index 2ae61d3cc..0ced0ae2d 100644
--- a/docs/source/api/traffic_ops_api.rst
+++ b/docs/source/api/traffic_ops_api.rst
@@ -190,3 +190,7 @@ The 3 most common errors returned by Traffic Ops are:
 
   The rest of the API documentation will only document the ``200 OK`` case, where no errors have occured.
 
+TrafficOps Native Client Libraries
+----------------------------------
+
+TrafficOps client libraries are available in both Golang and Python.  You can read more about them at https://github.com/apache/incubator-trafficcontrol/tree/master/traffic_control/clients
diff --git a/docs/source/api/v12/deliveryservice.rst b/docs/source/api/v12/deliveryservice.rst
index a79345a62..f977fc92c 100644
--- a/docs/source/api/v12/deliveryservice.rst
+++ b/docs/source/api/v12/deliveryservice.rst
@@ -51,157 +51,157 @@ Delivery Service
 
   **Response Properties**
 
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  |        Parameter         |  Type  |                                                             Description                                                              |
-  +==========================+========+======================================================================================================================================+
-  | ``active``               |  bool  | true if active, false if inactive.                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cacheurl``             | string | Cache URL rule to apply to this delivery service.                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ccrDnsTtl``            |  int   | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnId``                |  int   | Id of the CDN to which the delivery service belongs to.                                                                              |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnName``              | string | Name of the CDN to which the delivery service belongs to.                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``checkPath``            | string | The path portion of the URL to check this deliveryservice for health.                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``deepCachingType``      | string | When to do Deep Caching for this Delivery Service:                                                                                   |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - NEVER (default)                                                                                                                    |
-  |                          |        | - ALWAYS                                                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``displayName``          | string | The display name of the delivery service.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassCname``       | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp``          | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp6``         | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassTtl``         |  int   | The TTL of the DNS bypass response.                                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dscp``                 |  int   | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``edgeHeaderRewrite``    | string | The EDGE header rewrite actions to perform.                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``exampleURLs``          | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitRedirectUrl``  | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimit``             |  int   | - 0: None - no limitations                                                                                                           |
-  |                          |        | - 1: Only route on CZF file hit                                                                                                      |
-  |                          |        | - 2: Only route on CZF hit or when from USA                                                                                          |
-  |                          |        |                                                                                                                                      |
-  |                          |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
-  |                          |        | routing to the content by Traffic Router.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitCountries``    | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoProvider``          |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxMbps``        |  int   | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
-  |                          |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxTps``         |  int   | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
-  |                          |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
-  |                          |        | HTTP deliveryservices                                                                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``fqPacingRate``         |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
-  |                          |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+  
-  | ``httpBypassFqdn``       | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``id``                   |  int   | The deliveryservice id (database row number).                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``infoUrl``              | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``initialDispersion``    |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ipv6RoutingEnabled``   |  bool  | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``lastUpdated``          | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``logsEnabled``          |  bool  |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc``             | string | Description field.                                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc1``            | string | Description field 1.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc2``            | string | Description field 2.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``maxDnsAnswers``        |  int   | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
-  |                          |        | available).                                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``midHeaderRewrite``     | string | The MID header rewrite actions to perform.                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLat``              | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. 39.7391500 or null                                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLong``             | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. -104.9847000 or null                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``multiSiteOrigin``      |  bool  | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``orgServerFqdn``        | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
-  |                          |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``originShield``         | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileDescription``   | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileId``            |  int   | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileName``          | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``protocol``             |  int   | - 0: serve with http:// at EDGE                                                                                                      |
-  |                          |        | - 1: serve with https:// at EDGE                                                                                                     |
-  |                          |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``qstringIgnore``        |  int   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
-  |                          |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
-  |                          |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``rangeRequestHandling`` |  int   | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
-  |                          |        | - 2 Use the cache_range_requests plugin.                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regexRemap``           | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regionalGeoBlocking``  |  bool  | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``remapText``            | string | Additional raw remap line text.                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``routingName``          | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signed``               |  bool  | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
-  |                          |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signingAlgorithm``     | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
-  |                          |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
-  |                          |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``sslKeyVersion``        |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``tenant``               | string | Owning tenant name                                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``tenantId``             | int    | Owning tenant ID                                                                                                                     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trRequestHeaders``     | string | List of header keys separated by ``__RETURN__``. Listed headers will be included in TR access log entries under the "rh=" token.     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trResponseHeaders``    | string | List of header ``name:value`` pairs separated by ``__RETURN__``. Listed pairs will be included in all TR HTTP responses.             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``typeId``               |  int   | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``xmlId``                | string | Unique string that describes this deliveryservice.                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | Parameter                    | Type   | Description                                                                                                                          |
+  +==============================+========+======================================================================================================================================+
+  | ``active``                   | bool   | true if active, false if inactive.                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``anonymousBlockingEnabled`` | bool   | - true: enable blocking clients with anonymous ips                                                                                   |
+  |                              |        | - false: disabled                                                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cacheurl``                 | string | Cache URL rule to apply to this delivery service.                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ccrDnsTtl``                | int    | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnId``                    | int    | Id of the CDN to which the delivery service belongs to.                                                                              |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnName``                  | string | Name of the CDN to which the delivery service belongs to.                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``checkPath``                | string | The path portion of the URL to check this deliveryservice for health.                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``deepCachingType``          | string | When to do Deep Caching for this Delivery Service:                                                                                   |
+  |                              |        |                                                                                                                                      |
+  |                              |        | - NEVER (default)                                                                                                                    |
+  |                              |        | - ALWAYS                                                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``displayName``              | string | The display name of the delivery service.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassCname``           | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp``              | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp6``             | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassTtl``             | int    | The TTL of the DNS bypass response.                                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dscp``                     | int    | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``edgeHeaderRewrite``        | string | The EDGE header rewrite actions to perform.                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``exampleURLs``              | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitRedirectUrl``      | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimit``                 | int    | - 0: None - no limitations                                                                                                           |
+  |                              |        | - 1: Only route on CZF file hit                                                                                                      |
+  |                              |        | - 2: Only route on CZF hit or when from USA                                                                                          |
+  |                              |        |                                                                                                                                      |
+  |                              |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
+  |                              |        | routing to the content by Traffic Router.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitCountries``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoProvider``              | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxMbps``            | int    | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
+  |                              |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxTps``             | int    | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
+  |                              |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
+  |                              |        | HTTP deliveryservices                                                                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``fqPacingRate``             |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
+  |                              |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``httpBypassFqdn``           | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``id``                       | int    | The deliveryservice id (database row number).                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``infoUrl``                  | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``initialDispersion``        | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ipv6RoutingEnabled``       | bool   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``lastUpdated``              | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``logsEnabled``              | bool   |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc``                 | string | Description field.                                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc1``                | string | Description field 1.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc2``                | string | Description field 2.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``maxDnsAnswers``            | int    | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
+  |                              |        | available).                                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``midHeaderRewrite``         | string | The MID header rewrite actions to perform.                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLat``                  | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
+  |                              |        | - e.g. 39.7391500 or null                                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLong``                 | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
+  |                              |        | - e.g. -104.9847000 or null                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``multiSiteOrigin``          | bool   | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``orgServerFqdn``            | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
+  |                              |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``originShield``             | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileDescription``       | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileId``                | int    | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileName``              | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``protocol``                 | int    | - 0: serve with http:// at EDGE                                                                                                      |
+  |                              |        | - 1: serve with https:// at EDGE                                                                                                     |
+  |                              |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``qstringIgnore``            | int    | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
+  |                              |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
+  |                              |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``rangeRequestHandling``     | int    | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
+  |                              |        | - 2 Use the cache_range_requests plugin.                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regexRemap``               | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regionalGeoBlocking``      | bool   | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``remapText``                | string | Additional raw remap line text.                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``routingName``              | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signed``                   | bool   | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
+  |                              |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signingAlgorithm``         | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
+  |                              |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
+  |                              |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``sslKeyVersion``            | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``tenant``                   | string | Owning tenant name                                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``tenantId``                 | int    | Owning tenant ID                                                                                                                     |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trRequestHeaders``         | string | List of header keys separated by __RETURN__. Listed headers will be included in TR access log entries under the "rh=" token.         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trResponseHeaders``        | string | List of header name:value pairs separated by __RETURN__. Listed pairs will be included in all TR HTTP responses.                     |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``typeId``                   | int    | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``xmlId``                    | string | Unique string that describes this deliveryservice.                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
 
   **Response Example** ::
 
@@ -209,6 +209,7 @@ Delivery Service
       "response": [
         {
             "active": true,
+            "anonymousBlockingEnabled": false,
             "cacheurl": null,
             "ccrDnsTtl": "3600",
             "cdnId": "2",
@@ -296,165 +297,165 @@ Delivery Service
 
   **Response Properties**
 
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  |        Parameter         |  Type  |                                                             Description                                                              |
-  +==========================+========+======================================================================================================================================+
-  | ``active``               |  bool  | true if active, false if inactive.                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cacheurl``             | string | Cache URL rule to apply to this delivery service.                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ccrDnsTtl``            |  int   | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnId``                |  int   | Id of the CDN to which the delivery service belongs to.                                                                              |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnName``              | string | Name of the CDN to which the delivery service belongs to.                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``checkPath``            | string | The path portion of the URL to check this deliveryservice for health.                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``deepCachingType``      | string | When to do Deep Caching for this Delivery Service:                                                                                   |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - NEVER (default)                                                                                                                    |
-  |                          |        | - ALWAYS                                                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``displayName``          | string | The display name of the delivery service.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassCname``       | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp``          | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp6``         | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassTtl``         |  int   | The TTL of the DNS bypass response.                                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dscp``                 |  int   | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``edgeHeaderRewrite``    | string | The EDGE header rewrite actions to perform.                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``exampleURLs``          | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitRedirectUrl``  | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimit``             |  int   | - 0: None - no limitations                                                                                                           |
-  |                          |        | - 1: Only route on CZF file hit                                                                                                      |
-  |                          |        | - 2: Only route on CZF hit or when from USA                                                                                          |
-  |                          |        |                                                                                                                                      |
-  |                          |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
-  |                          |        | routing to the content by Traffic Router.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitCountries``    | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoProvider``          |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxMbps``        |  int   | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
-  |                          |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxTps``         |  int   | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
-  |                          |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
-  |                          |        | HTTP deliveryservices                                                                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``fqPacingRate``         |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
-  |                          |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |  
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``httpBypassFqdn``       | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``id``                   |  int   | The deliveryservice id (database row number).                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``infoUrl``              | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``initialDispersion``    |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ipv6RoutingEnabled``   |  bool  | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``lastUpdated``          | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``logsEnabled``          |  bool  |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc``             | string | Description field.                                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc1``            | string | Description field 1.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc2``            | string | Description field 2.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``matchList``            | array  | Array of matchList hashes.                                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>type``               | string | The type of MatchList (one of :ref:to-api-v11-types use_in_table='regex').                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>setNumber``          | string | The set Number of the matchList.                                                                                                     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>pattern``            | string | The regexp for the matchList.                                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``maxDnsAnswers``        |  int   | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
-  |                          |        | available).                                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``midHeaderRewrite``     | string | The MID header rewrite actions to perform.                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLat``              | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. 39.7391500 or null                                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLong``             | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. -104.9847000 or null                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``multiSiteOrigin``      |  bool  | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``orgServerFqdn``        | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
-  |                          |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``originShield``         | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileDescription``   | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileId``            |  int   | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileName``          | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``protocol``             |  int   | - 0: serve with http:// at EDGE                                                                                                      |
-  |                          |        | - 1: serve with https:// at EDGE                                                                                                     |
-  |                          |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``qstringIgnore``        |  int   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
-  |                          |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
-  |                          |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``rangeRequestHandling`` |  int   | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
-  |                          |        | - 2 Use the cache_range_requests plugin.                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regexRemap``           | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regionalGeoBlocking``  |  bool  | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``remapText``            | string | Additional raw remap line text.                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``routingName``          | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signed``               |  bool  | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
-  |                          |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signingAlgorithm``     | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
-  |                          |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
-  |                          |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``sslKeyVersion``        |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``tenant``               | string | Owning tenant name                                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``tenantId``             | int    | Owning tenant ID                                                                                                                     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trRequestHeaders``     | string | List of header keys separated by ``__RETURN__``. Listed headers will be included in TR access log entries under the "rh=" token.     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trResponseHeaders``    | string | List of header ``name:value`` pairs separated by ``__RETURN__``. Listed pairs will be included in all TR HTTP responses.             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``typeId``               |  int   | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``xmlId``                | string | Unique string that describes this deliveryservice.                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | Parameter                    | Type   | Description                                                                                                                          |
+  +==============================+========+======================================================================================================================================+
+  | ``active``                   | bool   | true if active, false if inactive.                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``anonymousBlockingEnabled`` | bool   | - true: enable blocking clients with anonymous ips                                                                                   |
+  |                              |        | - false: disabled                                                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cacheurl``                 | string | Cache URL rule to apply to this delivery service.                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ccrDnsTtl``                | int    | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnId``                    | int    | Id of the CDN to which the delivery service belongs to.                                                                              |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnName``                  | string | Name of the CDN to which the delivery service belongs to.                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``checkPath``                | string | The path portion of the URL to check this deliveryservice for health.                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``deepCachingType``          | string | When to do Deep Caching for this Delivery Service:                                                                                   |
+  |                              |        |                                                                                                                                      |
+  |                              |        | - NEVER (default)                                                                                                                    |
+  |                              |        | - ALWAYS                                                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``displayName``              | string | The display name of the delivery service.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassCname``           | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp``              | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp6``             | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassTtl``             | int    | The TTL of the DNS bypass response.                                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dscp``                     | int    | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``edgeHeaderRewrite``        | string | The EDGE header rewrite actions to perform.                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``exampleURLs``              | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``fqPacingRate``             |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
+  |                              |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitRedirectUrl``      | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimit``                 | int    | - 0: None - no limitations                                                                                                           |
+  |                              |        | - 1: Only route on CZF file hit                                                                                                      |
+  |                              |        | - 2: Only route on CZF hit or when from USA                                                                                          |
+  |                              |        |                                                                                                                                      |
+  |                              |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
+  |                              |        | routing to the content by Traffic Router.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitCountries``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoProvider``              | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxMbps``            | int    | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
+  |                              |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxTps``             | int    | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
+  |                              |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
+  |                              |        | HTTP deliveryservices                                                                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``httpBypassFqdn``           | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``id``                       | int    | The deliveryservice id (database row number).                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``infoUrl``                  | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``initialDispersion``        | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ipv6RoutingEnabled``       | bool   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``lastUpdated``              | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``logsEnabled``              | bool   |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc``                 | string | Description field.                                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc1``                | string | Description field 1.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc2``                | string | Description field 2.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``matchList``                | array  | Array of matchList hashes.                                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>type``                   | string | The type of MatchList (one of :ref:to-api-v11-types use_in_table='regex').                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>setNumber``              | string | The set Number of the matchList.                                                                                                     |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>pattern``                | string | The regexp for the matchList.                                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``maxDnsAnswers``            | int    | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
+  |                              |        | available).                                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``midHeaderRewrite``         | string | The MID header rewrite actions to perform.                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLat``                  | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
+  |                              |        | - e.g. 39.7391500 or null                                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLong``                 | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
+  |                              |        | - e.g. -104.9847000 or null                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``multiSiteOrigin``          | bool   | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``orgServerFqdn``            | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
+  |                              |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``originShield``             | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileDescription``       | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileId``                | int    | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileName``              | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``protocol``                 | int    | - 0: serve with http:// at EDGE                                                                                                      |
+  |                              |        | - 1: serve with https:// at EDGE                                                                                                     |
+  |                              |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``qstringIgnore``            | int    | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
+  |                              |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
+  |                              |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``rangeRequestHandling``     | int    | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
+  |                              |        | - 2 Use the cache_range_requests plugin.                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regexRemap``               | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regionalGeoBlocking``      | bool   | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``remapText``                | string | Additional raw remap line text.                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``routingName``              | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signed``                   | bool   | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
+  |                              |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signingAlgorithm``         | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
+  |                              |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
+  |                              |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``sslKeyVersion``            | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``tenant``                   | string | Owning tenant name                                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``tenantId``                 | int    | Owning tenant ID                                                                                                                     |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trRequestHeaders``         | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trResponseHeaders``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``typeId``                   | int    | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``xmlId``                    | string | Unique string that describes this deliveryservice.                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
 
   **Response Example** ::
 
@@ -462,6 +463,7 @@ Delivery Service
       "response": [
         {
             "active": true,
+            "anonymousBlockingEnabled": false,
             "cacheurl": null,
             "ccrDnsTtl": "3600",
             "cdnId": "2",
@@ -2075,152 +2077,152 @@ URL Sig Keys
 
   **Request Properties**
 
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | Parameter              | Required | Description                                                                                             |
-  +========================+==========+=========================================================================================================+
-  | active                 | yes      | true if active, false if inactive.                                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | cacheurl               | no       | Cache URL rule to apply to this delivery service.                                                       |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | ccrDnsTtl              | no       | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr.host.             |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | cdnId                  | yes      | cdn id                                                                                                  |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | checkPath              | no       | The path portion of the URL to check this deliveryservice for health.                                   |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | deepCachingType        | no       | When to do Deep Caching for this Delivery Service:                                                      |
-  |                        |          |                                                                                                         |
-  |                        |          | - NEVER (default)                                                                                       |
-  |                        |          | - ALWAYS                                                                                                |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | displayName            | yes      | Display name                                                                                            |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dnsBypassCname         | no       | Bypass CNAME                                                                                            |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dnsBypassIp            | no       | The IPv4 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the       |
-  |                        |          | globalMaxMbps traffic on this deliveryservice.                                                          |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dnsBypassIp6           | no       | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the       |
-  |                        |          | globalMaxMbps traffic on this deliveryservice.                                                          |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dnsBypassTtl           | no       | The TTL of the DNS bypass response.                                                                     |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dscp                   | yes      | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE -> customer) traffic. |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | edgeHeaderRewrite      | no       | The EDGE header rewrite actions to perform.                                                             |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | geoLimitRedirectURL    | no       | This is the URL Traffic Router will redirect to when Geo Limit Failure.                                 |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | geoLimit               | yes      | - 0: None - no limitations                                                                              |
-  |                        |          | - 1: Only route on CZF file hit                                                                         |
-  |                        |          | - 2: Only route on CZF hit or when from geo limit countries                                             |
-  |                        |          |                                                                                                         |
-  |                        |          | Note that this does not prevent access to content or makes content secure; it just prevents             |
-  |                        |          | routing to the content by Traffic Router.                                                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | geoLimitCountries      | no       | The geo limit countries.                                                                                |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | geoProvider            | yes      | - 0: Maxmind(default)                                                                                   |
-  |                        |          | - 1: Neustar                                                                                            |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | globalMaxMbps          | no       | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the    |
-  |                        |          | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.              |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | globalMaxTps           | no       | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded       |
-  |                        |          | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for         |
-  |                        |          | HTTP deliveryservices                                                                                   |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | fqPacingRate           | no       | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,     |
-  |                        |          | will be rate limited by the Linux kernel. A default value of 0 disables this feature                    |  
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | httpBypassFqdn         | no       | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more     |
-  |                        |          | than the globalMaxMbps traffic on this deliveryservice.                                                 |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | infoUrl                | no       | Use this to add a URL that points to more information about that deliveryservice.                       |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | initialDispersion      | yes|no   | Initial dispersion. Required for HTTP* delivery services.                                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | ipv6RoutingEnabled     | yes|no   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                  |
-  |                        |          | Required for DNS*, HTTP* and STEERING* delivery services.                                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | logsEnabled            | yes      | - false: No                                                                                             |
-  |                        |          | - true: Yes                                                                                             |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | longDesc               | no       | Description field.                                                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | longDesc1              | no       | Description field 1.                                                                                    |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | longDesc2              | no       | Description field 2.                                                                                    |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | maxDnsAnswers          | no       | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all            |
-  |                        |          | available).                                                                                             |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | midHeaderRewrite       | no       | The MID header rewrite actions to perform.                                                              |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | missLat                | yes|no   | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.    |
-  |                        |          | e.g. 39.7391500 or null. Required for DNS* and HTTP* delivery services.                                 |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | missLong               | yes|no   | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.   |
-  |                        |          | e.g. -104.9847000 or null. Required for DNS* and HTTP* delivery services.                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | multiSiteOrigin        | yes|no   | true if enabled, false if disabled. Required for DNS* and HTTP* delivery services.                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | orgServerFqdn          | yes|no   | The origin server base URL (FQDN when used in this instance, includes the                               |
-  |                        |          | protocol (http:// or https://) for use in retrieving content from the origin server. This field is      |
-  |                        |          | required if type is DNS* or HTTP*.                                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | originShield           | no       | Origin shield                                                                                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | profileId              | no       | DS profile ID                                                                                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | protocol               | yes|no   | - 0: serve with http:// at EDGE                                                                         |
-  |                        |          | - 1: serve with https:// at EDGE                                                                        |
-  |                        |          | - 2: serve with both http:// and https:// at EDGE                                                       |
-  |                        |          |                                                                                                         |
-  |                        |          | Required for DNS*, HTTP* or *STEERING* delivery services.                                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | qstringIgnore          | yes|no   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.            |
-  |                        |          | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                          |
-  |                        |          | - 2: drop query string at edge, and do not use it in the cache-key.                                     |
-  |                        |          |                                                                                                         |
-  |                        |          | Required for DNS* and HTTP* delivery services.                                                          |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | rangeRequestHandling   | yes|no   | How to treat range requests (required for DNS* and HTTP* delivery services):                            |
-  |                        |          |                                                                                                         |
-  |                        |          | - 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 plugin.                                                                    |
-  |                        |          | - 2 Use the cache_range_requests plugin.                                                                |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | regexRemap             | no       | Regex Remap rule to apply to this delivery service at the Edge tier.                                    |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | regionalGeoBlocking    | yes      | Is the Regional Geo Blocking feature enabled.                                                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | remapText              | no       | Additional raw remap line text.                                                                         |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | routingName            | yes      | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | signed                 | no       | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.          |
-  |                        |          | - true: token based auth is enabled for this deliveryservice.                                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | signingAlgorithm       | no       | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.           |
-  |                        |          | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                             |
-  |                        |          | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | sslKeyVersion          | no       | SSL key version                                                                                         |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | tenantId               | No       | Owning tenant ID                                                                                        |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | trRequestHeaders       | no       | List of header keys separated by ``__RETURN__``. Listed headers will be included in TR access log       | 
-  |                        |          | entries under the "rh=" token.                                                                          |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | trResponseHeaders      | no       | List of header ``name:value`` pairs separated by ``__RETURN__``. Listed pairs will be included in all   |
-  |                        |          | TR HTTP responses.                                                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | typeId                 | yes      | The type of this deliveryservice (one of :ref:to-api-v12-types use_in_table='deliveryservice').         |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | xmlId                  | yes      | Unique string that describes this deliveryservice.                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | Parameter                    | Required | Description                                                                                             |
+  +==============================+==========+=========================================================================================================+
+  | active                       | yes      | true if active, false if inactive.                                                                      |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | anonymousBlockingEnabled     | no       | - true: enable blocking clients with anonymous ips                                                      |
+  |                              |          | - false: disabled                                                                                       |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | cacheurl                     | no       | Cache URL rule to apply to this delivery service.                                                       |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | ccrDnsTtl                    | no       | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr.host.             |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | cdnId                        | yes      | cdn id                                                                                                  |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | checkPath                    | no       | The path portion of the URL to check this deliveryservice for health.                                   |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | deepCachingType              | no       | When to do Deep Caching for this Delivery Service:                                                      |
+  |                              |          |                                                                                                         |
+  |                              |          | - NEVER (default)                                                                                       |
+  |                              |          | - ALWAYS                                                                                                |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | displayName                  | yes      | Display name                                                                                            |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dnsBypassCname               | no       | Bypass CNAME                                                                                            |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dnsBypassIp                  | no       | The IPv4 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the       |
+  |                              |          | globalMaxMbps traffic on this deliveryservice.                                                          |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dnsBypassIp6                 | no       | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the       |
+  |                              |          | globalMaxMbps traffic on this deliveryservice.                                                          |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dnsBypassTtl                 | no       | The TTL of the DNS bypass response.                                                                     |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dscp                         | yes      | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE -> customer) traffic. |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | edgeHeaderRewrite            | no       | The EDGE header rewrite actions to perform.                                                             |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | fqPacingRate                 | no       | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,     |
+  |                              |          | will be rate limited by the Linux kernel. A default value of 0 disables this feature                    |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | geoLimitRedirectURL          | no       | This is the URL Traffic Router will redirect to when Geo Limit Failure.                                 |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | geoLimit                     | yes      | - 0: None - no limitations                                                                              |
+  |                              |          | - 1: Only route on CZF file hit                                                                         |
+  |                              |          | - 2: Only route on CZF hit or when from geo limit countries                                             |
+  |                              |          |                                                                                                         |
+  |                              |          | Note that this does not prevent access to content or makes content secure; it just prevents             |
+  |                              |          | routing to the content by Traffic Router.                                                               |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | geoLimitCountries            | no       | The geo limit countries.                                                                                |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | geoProvider                  | yes      | - 0: Maxmind(default)                                                                                   |
+  |                              |          | - 1: Neustar                                                                                            |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | globalMaxMbps                | no       | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the    |
+  |                              |          | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.              |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | globalMaxTps                 | no       | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded       |
+  |                              |          | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for         |
+  |                              |          | HTTP deliveryservices                                                                                   |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | httpBypassFqdn               | no       | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more     |
+  |                              |          | than the globalMaxMbps traffic on this deliveryservice.                                                 |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | infoUrl                      | no       | Use this to add a URL that points to more information about that deliveryservice.                       |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | initialDispersion            | yes|no   | Initial dispersion. Required for HTTP* delivery services.                                               |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | ipv6RoutingEnabled           | yes|no   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                  |
+  |                              |          | Required for DNS*, HTTP* and STEERING* delivery services.                                               |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | logsEnabled                  | yes      | - false: No                                                                                             |
+  |                              |          | - true: Yes                                                                                             |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | longDesc                     | no       | Description field.                                                                                      |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | longDesc1                    | no       | Description field 1.                                                                                    |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | longDesc2                    | no       | Description field 2.                                                                                    |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | maxDnsAnswers                | no       | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all            |
+  |                              |          | available).                                                                                             |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | midHeaderRewrite             | no       | The MID header rewrite actions to perform.                                                              |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | missLat                      | yes|no   | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.    |
+  |                              |          | e.g. 39.7391500 or null. Required for DNS* and HTTP* delivery services.                                 |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | missLong                     | yes|no   | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.   |
+  |                              |          | e.g. -104.9847000 or null. Required for DNS* and HTTP* delivery services.                               |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | multiSiteOrigin              | yes|no   | true if enabled, false if disabled. Required for DNS* and HTTP* delivery services.                      |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | orgServerFqdn                | yes|no   | The origin server base URL (FQDN when used in this instance, includes the                               |
+  |                              |          | protocol (http:// or https://) for use in retrieving content from the origin server. This field is      |
+  |                              |          | required if type is DNS* or HTTP*.                                                                      |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | originShield                 | no       | Origin shield                                                                                           |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | profileId                    | no       | DS profile ID                                                                                           |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | protocol                     | yes|no   | - 0: serve with http:// at EDGE                                                                         |
+  |                              |          | - 1: serve with https:// at EDGE                                                                        |
+  |                              |          | - 2: serve with both http:// and https:// at EDGE                                                       |
+  |                              |          |                                                                                                         |
+  |                              |          | Required for DNS*, HTTP* or *STEERING* delivery services.                                               |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | qstringIgnore                | yes|no   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.            |
+  |                              |          | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                          |
+  |                              |          | - 2: drop query string at edge, and do not use it in the cache-key.                                     |
+  |                              |          |                                                                                                         |
+  |                              |          | Required for DNS* and HTTP* delivery services.                                                          |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | rangeRequestHandling         | yes|no   | How to treat range requests (required for DNS* and HTTP* delivery services):                            |
+  |                              |          | - 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 plugin.                                                                    |
+  |                              |          | - 2 Use the cache_range_requests plugin.                                                                |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | regexRemap                   | no       | Regex Remap rule to apply to this delivery service at the Edge tier.                                    |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | regionalGeoBlocking          | yes      | Is the Regional Geo Blocking feature enabled.                                                           |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | remapText                    | no       | Additional raw remap line text.                                                                         |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | routingName                  | yes      | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                           |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | signed                       | no       | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.          |
+  |                              |          | - true: token based auth is enabled for this deliveryservice.                                           |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | signingAlgorithm             | no       | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.           |
+  |                              |          | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                             |
+  |                              |          | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                      |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | sslKeyVersion                | no       | SSL key version                                                                                         |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | tenantId                     | No       | Owning tenant ID                                                                                        |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | trRequestHeaders             | no       | Traffic router log request headers                                                                      |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | trResponseHeaders            | no       | Traffic router additional response headers                                                              |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | typeId                       | yes      | The type of this deliveryservice (one of :ref:to-api-v12-types use_in_table='deliveryservice').         |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | xmlId                        | yes      | Unique string that describes this deliveryservice.                                                      |
+  +------------------------------+----------+---------------------------------------------------------------------------------------------------------+
 
 
   **Request Example** ::
@@ -2246,6 +2248,7 @@ URL Sig Keys
         "qstringIgnore": 0,
         "rangeRequestHandling": 0,
         "regionalGeoBlocking": false,
+        "anonymousBlockingEnabled": false,
         "signed": false,
         "signingAlgorithm": null
     }
@@ -2253,161 +2256,161 @@ URL Sig Keys
 
   **Response Properties**
 
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  |        Parameter         |  Type  |                                                             Description                                                              |
-  +==========================+========+======================================================================================================================================+
-  | ``active``               |  bool  | true if active, false if inactive.                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cacheurl``             | string | Cache URL rule to apply to this delivery service.                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ccrDnsTtl``            |  int   | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnId``                |  int   | Id of the CDN to which the delivery service belongs to.                                                                              |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnName``              | string | Name of the CDN to which the delivery service belongs to.                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``checkPath``            | string | The path portion of the URL to check this deliveryservice for health.                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``deepCachingType``      | string | When to do Deep Caching for this Delivery Service:                                                                                   |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - NEVER (default)                                                                                                                    |
-  |                          |        | - ALWAYS                                                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``displayName``          | string | The display name of the delivery service.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassCname``       | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp``          | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp6``         | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassTtl``         |  int   | The TTL of the DNS bypass response.                                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dscp``                 |  int   | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``edgeHeaderRewrite``    | string | The EDGE header rewrite actions to perform.                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``exampleURLs``          | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitRedirectUrl``  | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimit``             |  int   | - 0: None - no limitations                                                                                                           |
-  |                          |        | - 1: Only route on CZF file hit                                                                                                      |
-  |                          |        | - 2: Only route on CZF hit or when from USA                                                                                          |
-  |                          |        |                                                                                                                                      |
-  |                          |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
-  |                          |        | routing to the content by Traffic Router.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitCountries``    | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoProvider``          |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxMbps``        |  int   | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
-  |                          |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxTps``         |  int   | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
-  |                          |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
-  |                          |        | HTTP deliveryservices                                                                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``httpBypassFqdn``       | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``fqPacingRate``         |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
-  |                          |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |  
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``id``                   |  int   | The deliveryservice id (database row number).                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``infoUrl``              | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``initialDispersion``    |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ipv6RoutingEnabled``   |  bool  | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``lastUpdated``          | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``logsEnabled``          |  bool  |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc``             | string | Description field.                                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc1``            | string | Description field 1.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc2``            | string | Description field 2.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``matchList``            | array  | Array of matchList hashes.                                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>type``               | string | The type of MatchList (one of :ref:to-api-v11-types use_in_table='regex').                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>setNumber``          | string | The set Number of the matchList.                                                                                                     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>pattern``            | string | The regexp for the matchList.                                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``maxDnsAnswers``        |  int   | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
-  |                          |        | available).                                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``midHeaderRewrite``     | string | The MID header rewrite actions to perform.                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLat``              | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. 39.7391500 or null                                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLong``             | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. -104.9847000 or null                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``multiSiteOrigin``      |  bool  | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``orgServerFqdn``        | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
-  |                          |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``originShield``         | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileDescription``   | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileId``            |  int   | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileName``          | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``protocol``             |  int   | - 0: serve with http:// at EDGE                                                                                                      |
-  |                          |        | - 1: serve with https:// at EDGE                                                                                                     |
-  |                          |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``qstringIgnore``        |  int   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
-  |                          |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
-  |                          |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``rangeRequestHandling`` |  int   | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
-  |                          |        | - 2 Use the cache_range_requests plugin.                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regexRemap``           | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regionalGeoBlocking``  |  bool  | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``remapText``            | string | Additional raw remap line text.                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``routingName``          | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signed``               |  bool  | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
-  |                          |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signingAlgorithm``     | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
-  |                          |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
-  |                          |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``sslKeyVersion``        |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trRequestHeaders``     | string | List of header keys separated by ``__RETURN__``. Listed headers will be included in TR access log entries under the "rh=" token.     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trResponseHeaders``    | string | List of header ``name:value`` pairs separated by ``__RETURN__``. Listed pairs will be included in all TR HTTP responses.             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``typeId``               |  int   | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``xmlId``                | string | Unique string that describes this deliveryservice.                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | Parameter                    | Type   | Description                                                                                                                          |
+  +==============================+========+======================================================================================================================================+
+  | ``active``                   | bool   | true if active, false if inactive.                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``anonymousBlockingEnabled`` | bool   | - true: enable blocking clients with anonymous ips                                                                                   |
+  |                              |        | - false: disabled                                                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cacheurl``                 | string | Cache URL rule to apply to this delivery service.                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ccrDnsTtl``                | int    | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnId``                    | int    | Id of the CDN to which the delivery service belongs to.                                                                              |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnName``                  | string | Name of the CDN to which the delivery service belongs to.                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``checkPath``                | string | The path portion of the URL to check this deliveryservice for health.                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``deepCachingType``          | string | When to do Deep Caching for this Delivery Service:                                                                                   |
+  |                              |        |                                                                                                                                      |
+  |                              |        | - NEVER (default)                                                                                                                    |
+  |                              |        | - ALWAYS                                                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``displayName``              | string | The display name of the delivery service.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassCname``           | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp``              | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp6``             | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassTtl``             | int    | The TTL of the DNS bypass response.                                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dscp``                     | int    | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``edgeHeaderRewrite``        | string | The EDGE header rewrite actions to perform.                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``exampleURLs``              | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``fqPacingRate``             |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
+  |                              |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitRedirectUrl``      | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimit``                 | int    | - 0: None - no limitations                                                                                                           |
+  |                              |        | - 1: Only route on CZF file hit                                                                                                      |
+  |                              |        | - 2: Only route on CZF hit or when from USA                                                                                          |
+  |                              |        |                                                                                                                                      |
+  |                              |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
+  |                              |        | routing to the content by Traffic Router.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitCountries``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoProvider``              | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxMbps``            | int    | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
+  |                              |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxTps``             | int    | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
+  |                              |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
+  |                              |        | HTTP deliveryservices                                                                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``httpBypassFqdn``           | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``id``                       | int    | The deliveryservice id (database row number).                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``infoUrl``                  | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``initialDispersion``        | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ipv6RoutingEnabled``       | bool   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``lastUpdated``              | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``logsEnabled``              | bool   |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc``                 | string | Description field.                                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc1``                | string | Description field 1.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc2``                | string | Description field 2.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``matchList``                | array  | Array of matchList hashes.                                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>type``                   | string | The type of MatchList (one of :ref:to-api-v11-types use_in_table='regex').                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>setNumber``              | string | The set Number of the matchList.                                                                                                     |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>pattern``                | string | The regexp for the matchList.                                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``maxDnsAnswers``            | int    | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
+  |                              |        | available).                                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``midHeaderRewrite``         | string | The MID header rewrite actions to perform.                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLat``                  | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
+  |                              |        | - e.g. 39.7391500 or null                                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLong``                 | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
+  |                              |        | - e.g. -104.9847000 or null                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``multiSiteOrigin``          | bool   | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``orgServerFqdn``            | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
+  |                              |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``originShield``             | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileDescription``       | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileId``                | int    | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileName``              | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``protocol``                 | int    | - 0: serve with http:// at EDGE                                                                                                      |
+  |                              |        | - 1: serve with https:// at EDGE                                                                                                     |
+  |                              |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``qstringIgnore``            | int    | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
+  |                              |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
+  |                              |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``rangeRequestHandling``     | int    | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
+  |                              |        | - 2 Use the cache_range_requests plugin.                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regexRemap``               | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regionalGeoBlocking``      | bool   | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``remapText``                | string | Additional raw remap line text.                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``routingName``              | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signed``                   | bool   | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
+  |                              |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signingAlgorithm``         | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
+  |                              |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
+  |                              |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``sslKeyVersion``            | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trRequestHeaders``         | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trResponseHeaders``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``typeId``                   | int    | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``xmlId``                    | string | Unique string that describes this deliveryservice.                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
 
   **Response Example** ::
 
@@ -2415,6 +2418,7 @@ URL Sig Keys
       "response": [
         {
             "active": true,
+            "anonymousBlockingEnabled": false,
             "cacheurl": null,
             "ccrDnsTtl": "3600",
             "cdnId": "2",
@@ -2505,152 +2509,152 @@ URL Sig Keys
 
   **Request Properties**
 
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | Parameter              | Required | Description                                                                                             |
-  +========================+==========+=========================================================================================================+
-  | active                 | yes      | true if active, false if inactive.                                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | cacheurl               | no       | Cache URL rule to apply to this delivery service.                                                       |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | ccrDnsTtl              | no       | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr.host.             |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | cdnId                  | yes      | cdn id                                                                                                  |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | checkPath              | no       | The path portion of the URL to check this deliveryservice for health.                                   |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | deepCachingType        | no       | When to do Deep Caching for this Delivery Service:                                                      |
-  |                        |          |                                                                                                         |
-  |                        |          | - NEVER (default)                                                                                       |
-  |                        |          | - ALWAYS                                                                                                |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | displayName            | yes      | Display name                                                                                            |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dnsBypassCname         | no       | Bypass CNAME                                                                                            |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dnsBypassIp            | no       | The IPv4 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the       |
-  |                        |          | globalMaxMbps traffic on this deliveryservice.                                                          |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dnsBypassIp6           | no       | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the       |
-  |                        |          | globalMaxMbps traffic on this deliveryservice.                                                          |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dnsBypassTtl           | no       | The TTL of the DNS bypass response.                                                                     |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | dscp                   | yes      | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE -> customer) traffic. |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | edgeHeaderRewrite      | no       | The EDGE header rewrite actions to perform.                                                             |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | geoLimitRedirectURL    | no       | This is the URL Traffic Router will redirect to when Geo Limit Failure.                                 |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | geoLimit               | yes      | - 0: None - no limitations                                                                              |
-  |                        |          | - 1: Only route on CZF file hit                                                                         |
-  |                        |          | - 2: Only route on CZF hit or when from geo limit countries                                             |
-  |                        |          |                                                                                                         |
-  |                        |          | Note that this does not prevent access to content or makes content secure; it just prevents             |
-  |                        |          | routing to the content by Traffic Router.                                                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | geoLimitCountries      | no       | The geo limit countries.                                                                                |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | geoProvider            | yes      | - 0: Maxmind(default)                                                                                   |
-  |                        |          | - 1: Neustar                                                                                            |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | globalMaxMbps          | no       | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the    |
-  |                        |          | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.              |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | globalMaxTps           | no       | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded       |
-  |                        |          | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for         |
-  |                        |          | HTTP deliveryservices                                                                                   |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | fqPacingRate           | no       | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,     |
-  |                        |          | will be rate limited by the Linux kernel. A default value of 0 disables this feature                    |  
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | httpBypassFqdn         | no       | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more     |
-  |                        |          | than the globalMaxMbps traffic on this deliveryservice.                                                 |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | infoUrl                | no       | Use this to add a URL that points to more information about that deliveryservice.                       |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | initialDispersion      | yes|no   | Initial dispersion. Required for HTTP* delivery services.                                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | ipv6RoutingEnabled     | yes|no   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                  |
-  |                        |          | Required for DNS*, HTTP* and STEERING* delivery services.                                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | logsEnabled            | yes      | - false: No                                                                                             |
-  |                        |          | - true: Yes                                                                                             |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | longDesc               | no       | Description field.                                                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | longDesc1              | no       | Description field 1.                                                                                    |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | longDesc2              | no       | Description field 2.                                                                                    |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | maxDnsAnswers          | no       | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all            |
-  |                        |          | available).                                                                                             |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | midHeaderRewrite       | no       | The MID header rewrite actions to perform.                                                              |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | missLat                | yes|no   | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.    |
-  |                        |          | e.g. 39.7391500 or null. Required for DNS* and HTTP* delivery services.                                 |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | missLong               | yes|no   | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.   |
-  |                        |          | e.g. -104.9847000 or null. Required for DNS* and HTTP* delivery services.                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | multiSiteOrigin        | yes|no   | true if enabled, false if disabled. Required for DNS* and HTTP* delivery services.                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | orgServerFqdn          | yes|no   | The origin server base URL (FQDN when used in this instance, includes the                               |
-  |                        |          | protocol (http:// or https://) for use in retrieving content from the origin server. This field is      |
-  |                        |          | required if type is DNS* or HTTP*.                                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | originShield           | no       | Origin shield                                                                                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | profileId              | no       | DS profile ID                                                                                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | protocol               | yes|no   | - 0: serve with http:// at EDGE                                                                         |
-  |                        |          | - 1: serve with https:// at EDGE                                                                        |
-  |                        |          | - 2: serve with both http:// and https:// at EDGE                                                       |
-  |                        |          |                                                                                                         |
-  |                        |          | Required for DNS*, HTTP* or *STEERING* delivery services.                                               |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | qstringIgnore          | yes|no   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.            |
-  |                        |          | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                          |
-  |                        |          | - 2: drop query string at edge, and do not use it in the cache-key.                                     |
-  |                        |          |                                                                                                         |
-  |                        |          | Required for DNS* and HTTP* delivery services.                                                          |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | rangeRequestHandling   | yes|no   | How to treat range requests (required for DNS* and HTTP* delivery services):                            |
-  |                        |          |                                                                                                         |
-  |                        |          | - 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 plugin.                                                                    |
-  |                        |          | - 2 Use the cache_range_requests plugin.                                                                |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | regexRemap             | no       | Regex Remap rule to apply to this delivery service at the Edge tier.                                    |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | regionalGeoBlocking    | yes      | Is the Regional Geo Blocking feature enabled.                                                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | remapText              | no       | Additional raw remap line text.                                                                         |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | routingName            | yes      | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | signed                 | no       | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.          |
-  |                        |          | - true: token based auth is enabled for this deliveryservice.                                           |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | signingAlgorithm       | no       | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.           |
-  |                        |          | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                             |
-  |                        |          | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | sslKeyVersion          | no       | SSL key version                                                                                         |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | tenantId               | No       | Owning tenant ID                                                                                        |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | trRequestHeaders       | no       | List of header keys separated by ``__RETURN__``. Listed headers will be included in TR access log       | 
-  |                        |          | entries under the "rh=" token.                                                                          |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | trResponseHeaders      | no       | List of header ``name:value`` pairs separated by ``__RETURN__``. Listed pairs will be included in all   |
-  |                        |          | TR HTTP responses.                                                                                      |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | typeId                 | yes      | The type of this deliveryservice (one of :ref:to-api-v12-types use_in_table='deliveryservice').         |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
-  | xmlId                  | yes      | Unique string that describes this deliveryservice. This value cannot be changed on update.              |
-  +------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | Parameter                | Required | Description                                                                                             |
+  +==========================+==========+=========================================================================================================+
+  | active                   | yes      | true if active, false if inactive.                                                                      |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | anonymousBlockingEnabled | no       | - true: enable blocking clients with anonymous ips                                                      |
+  |                          |          | - false: disabled                                                                                       |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | cacheurl                 | no       | Cache URL rule to apply to this delivery service.                                                       |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | ccrDnsTtl                | no       | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr.host.             |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | cdnId                    | yes      | cdn id                                                                                                  |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | checkPath                | no       | The path portion of the URL to check this deliveryservice for health.                                   |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | deepCachingType          | no       | When to do Deep Caching for this Delivery Service:                                                      |
+  |                          |          |                                                                                                         |
+  |                          |          | - NEVER (default)                                                                                       |
+  |                          |          | - ALWAYS                                                                                                |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | displayName              | yes      | Display name                                                                                            |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dnsBypassCname           | no       | Bypass CNAME                                                                                            |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dnsBypassIp              | no       | The IPv4 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the       |
+  |                          |          | globalMaxMbps traffic on this deliveryservice.                                                          |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dnsBypassIp6             | no       | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the       |
+  |                          |          | globalMaxMbps traffic on this deliveryservice.                                                          |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dnsBypassTtl             | no       | The TTL of the DNS bypass response.                                                                     |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | dscp                     | yes      | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE -> customer) traffic. |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | edgeHeaderRewrite        | no       | The EDGE header rewrite actions to perform.                                                             |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | fqPacingRate             | no       | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,     |
+  |                          |          | will be rate limited by the Linux kernel. A default value of 0 disables this feature                    |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | geoLimitRedirectURL      | no       | This is the URL Traffic Router will redirect to when Geo Limit Failure.                                 |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | geoLimit                 | yes      | - 0: None - no limitations                                                                              |
+  |                          |          | - 1: Only route on CZF file hit                                                                         |
+  |                          |          | - 2: Only route on CZF hit or when from geo limit countries                                             |
+  |                          |          |                                                                                                         |
+  |                          |          | Note that this does not prevent access to content or makes content secure; it just prevents             |
+  |                          |          | routing to the content by Traffic Router.                                                               |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | geoLimitCountries        | no       | The geo limit countries.                                                                                |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | geoProvider              | yes      | - 0: Maxmind(default)                                                                                   |
+  |                          |          | - 1: Neustar                                                                                            |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | globalMaxMbps            | no       | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the    |
+  |                          |          | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.              |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | globalMaxTps             | no       | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded       |
+  |                          |          | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for         |
+  |                          |          | HTTP deliveryservices                                                                                   |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | httpBypassFqdn           | no       | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more     |
+  |                          |          | than the globalMaxMbps traffic on this deliveryservice.                                                 |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | infoUrl                  | no       | Use this to add a URL that points to more information about that deliveryservice.                       |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | initialDispersion        | yes|no   | Initial dispersion. Required for HTTP* delivery services.                                               |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | ipv6RoutingEnabled       | yes|no   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                  |
+  |                          |          | Required for DNS*, HTTP* and STEERING* delivery services.                                               |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | logsEnabled              | yes      | - false: No                                                                                             |
+  |                          |          | - true: Yes                                                                                             |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | longDesc                 | no       | Description field.                                                                                      |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | longDesc1                | no       | Description field 1.                                                                                    |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | longDesc2                | no       | Description field 2.                                                                                    |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | maxDnsAnswers            | no       | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all            |
+  |                          |          | available).                                                                                             |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | midHeaderRewrite         | no       | The MID header rewrite actions to perform.                                                              |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | missLat                  | yes|no   | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.    |
+  |                          |          | e.g. 39.7391500 or null. Required for DNS* and HTTP* delivery services.                                 |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | missLong                 | yes|no   | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.   |
+  |                          |          | e.g. -104.9847000 or null. Required for DNS* and HTTP* delivery services.                               |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | multiSiteOrigin          | yes|no   | true if enabled, false if disabled. Required for DNS* and HTTP* delivery services.                      |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | orgServerFqdn            | yes|no   | The origin server base URL (FQDN when used in this instance, includes the                               |
+  |                          |          | protocol (http:// or https://) for use in retrieving content from the origin server. This field is      |
+  |                          |          | required if type is DNS* or HTTP*.                                                                      |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | originShield             | no       | Origin shield                                                                                           |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | profileId                | no       | DS profile ID                                                                                           |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | protocol                 | yes|no   | - 0: serve with http:// at EDGE                                                                         |
+  |                          |          | - 1: serve with https:// at EDGE                                                                        |
+  |                          |          | - 2: serve with both http:// and https:// at EDGE                                                       |
+  |                          |          |                                                                                                         |
+  |                          |          | Required for DNS*, HTTP* or *STEERING* delivery services.                                               |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | qstringIgnore            | yes|no   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.            |
+  |                          |          | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                          |
+  |                          |          | - 2: drop query string at edge, and do not use it in the cache-key.                                     |
+  |                          |          |                                                                                                         |
+  |                          |          | Required for DNS* and HTTP* delivery services.                                                          |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | rangeRequestHandling     | yes|no   | How to treat range requests (required for DNS* and HTTP* delivery services):                            |
+  |                          |          | - 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 plugin.                                                                    |
+  |                          |          | - 2 Use the cache_range_requests plugin.                                                                |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | regexRemap               | no       | Regex Remap rule to apply to this delivery service at the Edge tier.                                    |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | regionalGeoBlocking      | yes      | Is the Regional Geo Blocking feature enabled.                                                           |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | remapText                | no       | Additional raw remap line text.                                                                         |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | routingName              | yes      | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                           |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | signed                   | no       | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.          |
+  |                          |          | - true: token based auth is enabled for this deliveryservice.                                           |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | signingAlgorithm         | no       | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.           |
+  |                          |          | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                             |
+  |                          |          | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                      |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | sslKeyVersion            | no       | SSL key version                                                                                         |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | tenantId                 | No       | Owning tenant ID                                                                                        |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | trRequestHeaders         | no       | Traffic router log request headers                                                                      |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | trResponseHeaders        | no       | Traffic router additional response headers                                                              |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | typeId                   | yes      | The type of this deliveryservice (one of :ref:to-api-v12-types use_in_table='deliveryservice').         |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
+  | xmlId                    | yes      | Unique string that describes this deliveryservice. This value cannot be changed on update.              |
+  +--------------------------+----------+---------------------------------------------------------------------------------------------------------+
 
 
   **Request Example** ::
@@ -2676,6 +2680,7 @@ URL Sig Keys
         "qstringIgnore": 0,
         "rangeRequestHandling": 0,
         "regionalGeoBlocking": false,
+        "anonymousBlockingEnabled": false,
         "signed": false,
         "signingAlgorithm": null
     }
@@ -2683,161 +2688,161 @@ URL Sig Keys
 
   **Response Properties**
 
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  |        Parameter         |  Type  |                                                             Description                                                              |
-  +==========================+========+======================================================================================================================================+
-  | ``active``               |  bool  | true if active, false if inactive.                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cacheurl``             | string | Cache URL rule to apply to this delivery service.                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ccrDnsTtl``            |  int   | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnId``                |  int   | Id of the CDN to which the delivery service belongs to.                                                                              |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnName``              | string | Name of the CDN to which the delivery service belongs to.                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``checkPath``            | string | The path portion of the URL to check this deliveryservice for health.                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``deepCachingType``      | string | When to do Deep Caching for this Delivery Service:                                                                                   |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - NEVER (default)                                                                                                                    |
-  |                          |        | - ALWAYS                                                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``displayName``          | string | The display name of the delivery service.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassCname``       | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp``          | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp6``         | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassTtl``         |  int   | The TTL of the DNS bypass response.                                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dscp``                 |  int   | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``edgeHeaderRewrite``    | string | The EDGE header rewrite actions to perform.                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``exampleURLs``          | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitRedirectUrl``  | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimit``             |  int   | - 0: None - no limitations                                                                                                           |
-  |                          |        | - 1: Only route on CZF file hit                                                                                                      |
-  |                          |        | - 2: Only route on CZF hit or when from USA                                                                                          |
-  |                          |        |                                                                                                                                      |
-  |                          |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
-  |                          |        | routing to the content by Traffic Router.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitCountries``    | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoProvider``          |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxMbps``        |  int   | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
-  |                          |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxTps``         |  int   | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
-  |                          |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
-  |                          |        | HTTP deliveryservices                                                                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``fqPacingRate``         |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
-  |                          |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |  
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``httpBypassFqdn``       | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``id``                   |  int   | The deliveryservice id (database row number).                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``infoUrl``              | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``initialDispersion``    |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ipv6RoutingEnabled``   |  bool  | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``lastUpdated``          | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``logsEnabled``          |  bool  |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc``             | string | Description field.                                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc1``            | string | Description field 1.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc2``            | string | Description field 2.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``matchList``            | array  | Array of matchList hashes.                                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>type``               | string | The type of MatchList (one of :ref:to-api-v11-types use_in_table='regex').                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>setNumber``          | string | The set Number of the matchList.                                                                                                     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>pattern``            | string | The regexp for the matchList.                                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``maxDnsAnswers``        |  int   | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
-  |                          |        | available).                                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``midHeaderRewrite``     | string | The MID header rewrite actions to perform.                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLat``              | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. 39.7391500 or null                                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLong``             | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. -104.9847000 or null                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``multiSiteOrigin``      |  bool  | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``orgServerFqdn``        | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
-  |                          |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``originShield``         | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileDescription``   | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileId``            |  int   | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileName``          | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``protocol``             |  int   | - 0: serve with http:// at EDGE                                                                                                      |
-  |                          |        | - 1: serve with https:// at EDGE                                                                                                     |
-  |                          |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``qstringIgnore``        |  int   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
-  |                          |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
-  |                          |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``rangeRequestHandling`` |  int   | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
-  |                          |        | - 2 Use the cache_range_requests plugin.                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regexRemap``           | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regionalGeoBlocking``  |  bool  | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``remapText``            | string | Additional raw remap line text.                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``routingName``          | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signed``               |  bool  | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
-  |                          |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signingAlgorithm``     | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
-  |                          |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
-  |                          |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``sslKeyVersion``        |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trRequestHeaders``     | string | List of header keys separated by ``__RETURN__``. Listed headers will be included in TR access log entries under the "rh=" token.     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trResponseHeaders``    | string | List of header ``name:value`` pairs separated by ``__RETURN__``. Listed pairs will be included in all TR HTTP responses.             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``typeId``               |  int   | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``xmlId``                | string | Unique string that describes this deliveryservice.                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | Parameter                    | Type   | Description                                                                                                                          |
+  +==============================+========+======================================================================================================================================+
+  | ``active``                   | bool   | true if active, false if inactive.                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``anonymousBlockingEnabled`` | bool   | - true: enable blocking clients with anonymous ips                                                                                   |
+  |                              |        | - false: disabled                                                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cacheurl``                 | string | Cache URL rule to apply to this delivery service.                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ccrDnsTtl``                | int    | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnId``                    | int    | Id of the CDN to which the delivery service belongs to.                                                                              |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnName``                  | string | Name of the CDN to which the delivery service belongs to.                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``checkPath``                | string | The path portion of the URL to check this deliveryservice for health.                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``deepCachingType``          | string | When to do Deep Caching for this Delivery Service:                                                                                   |
+  |                              |        |                                                                                                                                      |
+  |                              |        | - NEVER (default)                                                                                                                    |
+  |                              |        | - ALWAYS                                                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``displayName``              | string | The display name of the delivery service.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassCname``           | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp``              | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp6``             | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassTtl``             | int    | The TTL of the DNS bypass response.                                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dscp``                     | int    | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``edgeHeaderRewrite``        | string | The EDGE header rewrite actions to perform.                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``exampleURLs``              | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``fqPacingRate``             |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
+  |                              |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitRedirectUrl``      | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimit``                 | int    | - 0: None - no limitations                                                                                                           |
+  |                              |        | - 1: Only route on CZF file hit                                                                                                      |
+  |                              |        | - 2: Only route on CZF hit or when from USA                                                                                          |
+  |                              |        |                                                                                                                                      |
+  |                              |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
+  |                              |        | routing to the content by Traffic Router.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitCountries``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoProvider``              | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxMbps``            | int    | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
+  |                              |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxTps``             | int    | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
+  |                              |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
+  |                              |        | HTTP deliveryservices                                                                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``httpBypassFqdn``           | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``id``                       | int    | The deliveryservice id (database row number).                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``infoUrl``                  | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``initialDispersion``        | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ipv6RoutingEnabled``       | bool   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``lastUpdated``              | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``logsEnabled``              | bool   |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc``                 | string | Description field.                                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc1``                | string | Description field 1.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc2``                | string | Description field 2.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``matchList``                | array  | Array of matchList hashes.                                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>type``                   | string | The type of MatchList (one of :ref:to-api-v11-types use_in_table='regex').                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>setNumber``              | string | The set Number of the matchList.                                                                                                     |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>pattern``                | string | The regexp for the matchList.                                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``maxDnsAnswers``            | int    | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
+  |                              |        | available).                                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``midHeaderRewrite``         | string | The MID header rewrite actions to perform.                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLat``                  | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
+  |                              |        | - e.g. 39.7391500 or null                                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLong``                 | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
+  |                              |        | - e.g. -104.9847000 or null                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``multiSiteOrigin``          | bool   | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``orgServerFqdn``            | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
+  |                              |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``originShield``             | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileDescription``       | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileId``                | int    | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileName``              | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``protocol``                 | int    | - 0: serve with http:// at EDGE                                                                                                      |
+  |                              |        | - 1: serve with https:// at EDGE                                                                                                     |
+  |                              |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``qstringIgnore``            | int    | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
+  |                              |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
+  |                              |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``rangeRequestHandling``     | int    | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
+  |                              |        | - 2 Use the cache_range_requests plugin.                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regexRemap``               | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regionalGeoBlocking``      | bool   | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``remapText``                | string | Additional raw remap line text.                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``routingName``              | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signed``                   | bool   | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
+  |                              |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signingAlgorithm``         | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
+  |                              |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
+  |                              |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``sslKeyVersion``            | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trRequestHeaders``         | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trResponseHeaders``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``typeId``                   | int    | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``xmlId``                    | string | Unique string that describes this deliveryservice.                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
 
   **Response Example** ::
 
@@ -2845,6 +2850,7 @@ URL Sig Keys
       "response": [
         {
             "active": true,
+            "anonymousBlockingEnabled": false,
             "cacheurl": null,
             "ccrDnsTtl": "3600",
             "cdnId": "2",
@@ -2962,161 +2968,161 @@ URL Sig Keys
 
   **Response Properties**
 
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  |        Parameter         |  Type  |                                                             Description                                                              |
-  +==========================+========+======================================================================================================================================+
-  | ``active``               |  bool  | true if active, false if inactive.                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cacheurl``             | string | Cache URL rule to apply to this delivery service.                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ccrDnsTtl``            |  int   | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnId``                |  int   | Id of the CDN to which the delivery service belongs to.                                                                              |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``cdnName``              | string | Name of the CDN to which the delivery service belongs to.                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``checkPath``            | string | The path portion of the URL to check this deliveryservice for health.                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``deepCachingType``      | string | When to do Deep Caching for this Delivery Service:                                                                                   |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - NEVER (default)                                                                                                                    |
-  |                          |        | - ALWAYS                                                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``displayName``          | string | The display name of the delivery service.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassCname``       | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp``          | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassIp6``         | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dnsBypassTtl``         |  int   | The TTL of the DNS bypass response.                                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``dscp``                 |  int   | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``edgeHeaderRewrite``    | string | The EDGE header rewrite actions to perform.                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``exampleURLs``          | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitRedirectUrl``  | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimit``             |  int   | - 0: None - no limitations                                                                                                           |
-  |                          |        | - 1: Only route on CZF file hit                                                                                                      |
-  |                          |        | - 2: Only route on CZF hit or when from USA                                                                                          |
-  |                          |        |                                                                                                                                      |
-  |                          |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
-  |                          |        | routing to the content by Traffic Router.                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoLimitCountries``    | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``geoProvider``          |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxMbps``        |  int   | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
-  |                          |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``globalMaxTps``         |  int   | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
-  |                          |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
-  |                          |        | HTTP deliveryservices                                                                                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``fqPacingRate``         |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
-  |                          |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |  
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``httpBypassFqdn``       | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
-  |                          |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``id``                   |  int   | The deliveryservice id (database row number).                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``infoUrl``              | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``initialDispersion``    |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``ipv6RoutingEnabled``   |  bool  | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``lastUpdated``          | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``logsEnabled``          |  bool  |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc``             | string | Description field.                                                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc1``            | string | Description field 1.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``longDesc2``            | string | Description field 2.                                                                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``matchList``            | array  | Array of matchList hashes.                                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>type``               | string | The type of MatchList (one of :ref:to-api-v11-types use_in_table='regex').                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>setNumber``          | string | The set Number of the matchList.                                                                                                     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``>>pattern``            | string | The regexp for the matchList.                                                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``maxDnsAnswers``        |  int   | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
-  |                          |        | available).                                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``midHeaderRewrite``     | string | The MID header rewrite actions to perform.                                                                                           |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLat``              | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. 39.7391500 or null                                                                                                            |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``missLong``             | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
-  |                          |        |                                                                                                                                      |
-  |                          |        | - e.g. -104.9847000 or null                                                                                                          |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``multiSiteOrigin``      |  bool  | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``orgServerFqdn``        | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
-  |                          |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``originShield``         | string |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileDescription``   | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileId``            |  int   | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``profileName``          | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``protocol``             |  int   | - 0: serve with http:// at EDGE                                                                                                      |
-  |                          |        | - 1: serve with https:// at EDGE                                                                                                     |
-  |                          |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``qstringIgnore``        |  int   | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
-  |                          |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
-  |                          |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``rangeRequestHandling`` |  int   | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
-  |                          |        | - 2 Use the cache_range_requests plugin.                                                                                             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regexRemap``           | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``regionalGeoBlocking``  |  bool  | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``remapText``            | string | Additional raw remap line text.                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``routingName``          | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signed``               |  bool  | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
-  |                          |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``signingAlgorithm``     | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
-  |                          |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
-  |                          |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``sslKeyVersion``        |  int   |                                                                                                                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trRequestHeaders``     | string | List of header keys separated by ``__RETURN__``. Listed headers will be included in TR access log entries under the "rh=" token.     |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``trResponseHeaders``    | string | List of header ``name:value`` pairs separated by ``__RETURN__``. Listed pairs will be included in all TR HTTP responses.             |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``typeId``               |  int   | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
-  | ``xmlId``                | string | Unique string that describes this deliveryservice.                                                                                   |
-  +--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | Parameter                    | Type   | Description                                                                                                                          |
+  +==============================+========+======================================================================================================================================+
+  | ``active``                   | bool   | true if active, false if inactive.                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``anonymousBlockingEnabled`` | bool   | - true: enable blocking clients with anonymous ips                                                                                   |
+  |                              |        | - false: disabled                                                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cacheurl``                 | string | Cache URL rule to apply to this delivery service.                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ccrDnsTtl``                | int    | The TTL of the DNS response for A or AAAA queries requesting the IP address of the tr. host.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnId``                    | int    | Id of the CDN to which the delivery service belongs to.                                                                              |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``cdnName``                  | string | Name of the CDN to which the delivery service belongs to.                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``checkPath``                | string | The path portion of the URL to check this deliveryservice for health.                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``deepCachingType``          | string | When to do Deep Caching for this Delivery Service:                                                                                   |
+  |                              |        |                                                                                                                                      |
+  |                              |        | - NEVER (default)                                                                                                                    |
+  |                              |        | - ALWAYS                                                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``displayName``              | string | The display name of the delivery service.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassCname``           | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp``              | string | The IPv4 IP to use for bypass on a DNS deliveryservice  - bypass starts when serving more than the                                   |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassIp6``             | string | The IPv6 IP to use for bypass on a DNS deliveryservice - bypass starts when serving more than the                                    |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dnsBypassTtl``             | int    | The TTL of the DNS bypass response.                                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``dscp``                     | int    | The Differentiated Services Code Point (DSCP) with which to mark downstream (EDGE ->  customer) traffic.                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``edgeHeaderRewrite``        | string | The EDGE header rewrite actions to perform.                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``exampleURLs``              | array  | Entry points into the CDN for this deliveryservice.                                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``fqPacingRate``             |  int   | The maximum rate in bytes per second for each TCP connection in this delivery service. If exceeded,                                  |
+  |                              |        | will be rate limited by the Linux kernel. A default value of 0 disables this feature                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitRedirectUrl``      | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimit``                 | int    | - 0: None - no limitations                                                                                                           |
+  |                              |        | - 1: Only route on CZF file hit                                                                                                      |
+  |                              |        | - 2: Only route on CZF hit or when from USA                                                                                          |
+  |                              |        |                                                                                                                                      |
+  |                              |        | Note that this does not prevent access to content or makes content secure; it just prevents                                          |
+  |                              |        | routing to the content by Traffic Router.                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoLimitCountries``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``geoProvider``              | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxMbps``            | int    | The maximum global bandwidth allowed on this deliveryservice. If exceeded, the traffic routes to the                                 |
+  |                              |        | dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for HTTP deliveryservices.                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``globalMaxTps``             | int    | The maximum global transactions per second allowed on this deliveryservice. When this is exceeded                                    |
+  |                              |        | traffic will be sent to the dnsByPassIp* for DNS deliveryservices and to the httpBypassFqdn for                                      |
+  |                              |        | HTTP deliveryservices                                                                                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``httpBypassFqdn``           | string | The HTTP destination to use for bypass on an HTTP deliveryservice - bypass starts when serving more than the                         |
+  |                              |        | globalMaxMbps traffic on this deliveryservice.                                                                                       |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``id``                       | int    | The deliveryservice id (database row number).                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``infoUrl``                  | string | Use this to add a URL that points to more information about that deliveryservice.                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``initialDispersion``        | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``ipv6RoutingEnabled``       | bool   | false: send IPv4 address of Traffic Router to client on HTTP type del.                                                               |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``lastUpdated``              | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``logsEnabled``              | bool   |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc``                 | string | Description field.                                                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc1``                | string | Description field 1.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``longDesc2``                | string | Description field 2.                                                                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``matchList``                | array  | Array of matchList hashes.                                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>type``                   | string | The type of MatchList (one of :ref:to-api-v11-types use_in_table='regex').                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>setNumber``              | string | The set Number of the matchList.                                                                                                     |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``>>pattern``                | string | The regexp for the matchList.                                                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``maxDnsAnswers``            | int    | The maximum number of IPs to put in a A/AAAA response for a DNS deliveryservice (0 means all                                         |
+  |                              |        | available).                                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``midHeaderRewrite``         | string | The MID header rewrite actions to perform.                                                                                           |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLat``                  | float  | The latitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                 |
+  |                              |        | - e.g. 39.7391500 or null                                                                                                            |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``missLong``                 | float  | The longitude as decimal degrees to use when the client cannot be found in the CZF or the Geo lookup.                                |
+  |                              |        | - e.g. -104.9847000 or null                                                                                                          |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``multiSiteOrigin``          | bool   | Is the Multi Site Origin feature enabled for this delivery service (0=false, 1=true). See :ref:`rl-multi-site-origin`                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``orgServerFqdn``            | string | The origin server base URL (FQDN when used in this instance, includes the                                                            |
+  |                              |        | protocol (http:// or https://) for use in retrieving content from the origin server.                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``originShield``             | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileDescription``       | string | The description of the Traffic Router Profile with which this deliveryservice is associated.                                         |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileId``                | int    | The id of the Traffic Router Profile with which this deliveryservice is associated.                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``profileName``              | string | The name of the Traffic Router Profile with which this deliveryservice is associated.                                                |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``protocol``                 | int    | - 0: serve with http:// at EDGE                                                                                                      |
+  |                              |        | - 1: serve with https:// at EDGE                                                                                                     |
+  |                              |        | - 2: serve with both http:// and https:// at EDGE                                                                                    |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``qstringIgnore``            | int    | - 0: no special query string handling; it is for use in the cache-key and pass up to origin.                                         |
+  |                              |        | - 1: ignore query string in cache-key, but pass it up to parent and or origin.                                                       |
+  |                              |        | - 2: drop query string at edge, and do not use it in the cache-key.                                                                  |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``rangeRequestHandling``     | int    | 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/reference/plugins/background_fetch.en.html>`_ plugin. |
+  |                              |        | - 2 Use the cache_range_requests plugin.                                                                                             |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regexRemap``               | string | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``regionalGeoBlocking``      | bool   | Regex Remap rule to apply to this delivery service at the Edge tier.                                                                 |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``remapText``                | string | Additional raw remap line text.                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``routingName``              | string | The routing name of this deliveryservice, e.g. <routingName>.<xmlId>.cdn.com.                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signed``                   | bool   | - false: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                       |
+  |                              |        | - true: token based auth is enabled for this deliveryservice.                                                                        |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``signingAlgorithm``         | string | - null: token based auth (see :ref:token-based-auth) is not enabled for this deliveryservice.                                        |
+  |                              |        | - "url_sig": URL Sign token based auth is enabled for this deliveryservice.                                                          |
+  |                              |        | - "uri_signing": URI Signing token based auth is enabled for this deliveryservice.                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``sslKeyVersion``            | int    |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trRequestHeaders``         | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``trResponseHeaders``        | string |                                                                                                                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``typeId``                   | int    | The type of this deliveryservice (one of :ref:to-api-v11-types use_in_table='deliveryservice').                                      |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
+  | ``xmlId``                    | string | Unique string that describes this deliveryservice.                                                                                   |
+  +------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------+
 
   **Response Example** ::
 
@@ -3124,6 +3130,7 @@ URL Sig Keys
       "response": [
         {
             "active": true,
+            "anonymousBlockingEnabled": false,
             "cacheurl": null,
             "ccrDnsTtl": "3600",
             "cdnId": "2",
diff --git a/docs/source/api/v13/coordinate.rst b/docs/source/api/v13/coordinate.rst
new file mode 100644
index 000000000..5a18e502b
--- /dev/null
+++ b/docs/source/api/v13/coordinate.rst
@@ -0,0 +1,272 @@
+.. 
+.. 
+.. 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.
+.. 
+
+.. _to-api-v13-coordinate:
+
+Coordinate
+==========
+
+.. _to-api-v13-coordinates-route:
+
+/api/1.3/coordinates
+++++++++++++++++++++
+
+**GET /api/1.3/coordinates**
+
+  Authentication Required: Yes
+
+  Role(s) Required: None
+
+  **Request Query Parameters**
+
+  +-----------------+----------+---------------------------------------------------+
+  | Name            | Required | Description                                       |
+  +=================+==========+===================================================+
+  | ``id``          | no       | Filter Coordinates by ID.                         |
+  +-----------------+----------+---------------------------------------------------+
+  | ``name``        | no       | Filter Coordinates by name.                       |
+  +-----------------+----------+---------------------------------------------------+
+
+  **Response Properties**
+
+  +-----------------------------------+--------+--------------------------------------------------------------------------+
+  | Parameter                         | Type   | Description                                                              |
+  +===================================+========+==========================================================================+
+  | ``id``                            | int    | Local unique identifier for the Coordinate                               |
+  +-----------------------------------+--------+--------------------------------------------------------------------------+
+  | ``lastUpdated``                   | string | The Time / Date this entry was last updated                              |
+  +-----------------------------------+--------+--------------------------------------------------------------------------+
+  | ``latitude``                      | float  | Latitude of the Coordinate                                               |
+  +-----------------------------------+--------+--------------------------------------------------------------------------+
+  | ``longitude``                     | float  | Longitude of the Coordinate                                              |
+  +-----------------------------------+--------+--------------------------------------------------------------------------+
+  | ``name``                          | string | The name of the Coordinate                                               |
+  +-----------------------------------+--------+--------------------------------------------------------------------------+
+
+  **Response Example** ::
+
+    {
+     "response": [
+        {
+           "id": 21,
+           "lastUpdated": "2012-09-25 20:27:28",
+           "latitude": 0,
+           "longitude": 0,
+           "name": "dc-chicago"
+        },
+        {
+           "id": 22,
+           "lastUpdated": "2012-09-25 20:27:28",
+           "latitude": 0,
+           "longitude": 0,
+           "name": "dc-chicago-1"
+        }
+     ]
+    }
+
+|
+
+**POST /api/1.3/coordinates**
+
+  Create Coordinate.
+
+  Authentication Required: Yes
+
+  Role(s) Required: admin or oper
+
+  **Request Parameters**
+
+  +---------------------------------+----------+-------------------------------------------------------------------+
+  | Name                            | Required | Description                                                       |
+  +=================================+==========+===================================================================+
+  | ``name``                        | yes      | The name of the Coordinate entry                                  |
+  +---------------------------------+----------+-------------------------------------------------------------------+
+  | ``latitude``                    | no       | Latitude of the Coordinate                                        |
+  +---------------------------------+----------+-------------------------------------------------------------------+
+  | ``longitude``                   | no       | Longitude of the Coordinate                                       |
+  +---------------------------------+----------+-------------------------------------------------------------------+
+
+  **Request Example** ::
+
+    {
+        "name": "my_coordinate",
+        "latitude": 1.2,
+        "longitude": 4.5
+    }
+
+  **Response Properties**
+
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | Parameter                          | Type   | Description                                                       |
+  +====================================+========+===================================================================+
+  | ``id``                             | int    | The id of the Coordinate                                          |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``name``                           | string | The name of the Coordinate                                        |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``latitude``                       | float  | Latitude of the Coordinate                                        |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``longitude``                      | float  | Longitude of the Coordinate                                       |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``lastUpdated``                    | string | The Time / Date this entry was last updated                       |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``alerts``                         | array  | A collection of alert messages.                                   |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``>level``                         | string | Success, info, warning or error.                                  |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``>text``                          | string | Alert message.                                                    |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+
+  **Response Example** ::
+
+    {
+        "alerts": [
+                  {
+                          "level": "success",
+                          "text": "coordinate was created"
+                  }
+          ],
+        "response": {
+            'longitude' : 4.5,
+            'lastUpdated' : '2016-01-25 13:55:30',
+            'name' : 'my_coordinate',
+            'latitude' : 1.2,
+            'id' : 1
+        }
+    }
+   
+|
+
+**PUT /api/1.3/coordinates**
+
+  Update coordinate.
+
+  Authentication Required: Yes
+
+  Role(s) Required: admin or oper
+
+  **Request Query Parameters**
+
+  +------+----------+------------------------------------+
+  | Name | Required | Description                        |
+  +======+==========+====================================+
+  | id   | yes      | The id of the coordinate to edit.  |
+  +------+----------+------------------------------------+
+
+  **Request Parameters**
+
+  +---------------------------------+----------+-------------------------------------------------------------------+
+  | Name                            | Required | Description                                                       |
+  +=================================+==========+===================================================================+
+  | ``id``                          | yes      | The id of the Coordinate                                          |
+  +---------------------------------+----------+-------------------------------------------------------------------+
+  | ``name``                        | yes      | The name of the Coordinate entry                                  |
+  +---------------------------------+----------+-------------------------------------------------------------------+
+  | ``latitude``                    | no       | Latitude of the Coordinate                                        |
+  +---------------------------------+----------+-------------------------------------------------------------------+
+  | ``longitude``                   | no       | Longitude of the Coordinate                                       |
+  +---------------------------------+----------+-------------------------------------------------------------------+
+
+  **Request Example** ::
+
+    {
+        "id": 1,
+        "name": "my_coordinate",
+        "latitude": 12,
+        "longitude": 45
+    }
+
+  **Response Properties**
+
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | Parameter                          | Type   | Description                                                       |
+  +====================================+========+===================================================================+
+  | ``id``                             | int    | The id of the Coordinate                                          |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``name``                           | string | The name of the Coordinate                                        |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``latitude``                       | float  | Latitude of the Coordinate                                        |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``longitude``                      | float  | Longitude of the Coordinate                                       |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``lastUpdated``                    | string | The Time / Date this entry was last updated                       |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``alerts``                         | array  | A collection of alert messages.                                   |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``>level``                         | string | Success, info, warning or error.                                  |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+  | ``>text``                          | string | Alert message.                                                    |
+  +------------------------------------+--------+-------------------------------------------------------------------+
+
+  **Response Example** ::
+
+    {
+        "alerts": [
+                  {
+                          "level": "success",
+                          "text": "coordinate was updated"
+                  }
+          ],
+        "response": {
+            'longitude' : 45,
+            'lastUpdated' : '2016-01-25 13:55:30',
+            'name' : 'my_coordinate',
+            'latitude' : 12,
+            'id' : 1
+        }
+    }
+
+|
+
+**DELETE /api/1.3/coordinates**
+
+  Delete coordinate.
+
+  Authentication Required: Yes
+
+  Role(s) Required: admin or oper
+
+  **Request Query Parameters**
+
+  +------+----------+--------------------------------------+
+  | Name | Required | Description                          |
+  +======+==========+======================================+
+  | id   | yes      | The id of the coordinate to delete.  |
+  +------+----------+--------------------------------------+
+  
+  **Response Properties**
+
+  +-------------+--------+----------------------------------+
+  |  Parameter  |  Type  |           Description            |
+  +=============+========+==================================+
+  | ``alerts``  | array  | A collection of alert messages.  |
+  +-------------+--------+----------------------------------+
+  | ``>level``  | string | Success, info, warning or error. |
+  +-------------+--------+----------------------------------+
+  | ``>text``   | string | Alert message.                   |
+  +-------------+--------+----------------------------------+
+
+  **Response Example** ::
+
+    {
+          "alerts": [
+                    {
+                            "level": "success",
+                            "text": "coordinate was deleted"
+                    }
+            ]
+    }
+
+|
+
diff --git a/docs/source/api/v13/index.rst b/docs/source/api/v13/index.rst
new file mode 100644
index 000000000..4624560fb
--- /dev/null
+++ b/docs/source/api/v13/index.rst
@@ -0,0 +1,24 @@
+..
+..
+.. 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.
+..
+
+
+API 1.3 Reference
+*****************
+Traffic Ops API V1.3
+
+.. toctree::
+  :maxdepth: 1
+
+  coordinate
diff --git a/docs/source/development/traffic_router/traffic_router_api.rst b/docs/source/development/traffic_router/traffic_router_api.rst
index 2ae902f63..f56ca2e10 100644
--- a/docs/source/development/traffic_router/traffic_router_api.rst
+++ b/docs/source/development/traffic_router/traffic_router_api.rst
@@ -15,6 +15,7 @@
 
 .. _reference-tr-api:
 
+
 Traffic Router API
 ==================
 
@@ -24,7 +25,7 @@ General stats.
 
 |
 
-**/crs/stats/ip/:ipaddress**
+**/crs/stats/ip/<ipaddress>**
 
 Geolocation information for an IPv4 or IPv6 address.
 
@@ -42,49 +43,49 @@ A mapping of caches to cache groups and their current health state.
 
 |
 
-**/crs/locations/:location/caches**
+**/crs/locations/<location>/caches**
 
 A list of caches for this cache group only.
 
 |
 
-**/crs/consistenthash/cache/coveragezone/?ip=:ip&deliveryServiceId=:deliveryServiceId&requestPath=:requestPath**
+**/crs/consistenthash/cache/coveragezone/?ip=<ip>&deliveryServiceId=<deliveryServiceId>&requestPath=<requestPath>**
 
 The resulting cache of the consistent hash using coverage zone file for a given client IP, delivery service, and request path.
 
 |
 
-**/crs/consistenthash/cache/deep/coveragezone/?ip=:ip&deliveryServiceId=:deliveryServiceId&requestPath=:requestPath**
+**/crs/consistenthash/cache/deep/coveragezone/?ip=<ip>&deliveryServiceId=<deliveryServiceId>&requestPath=<requestPath>**
 
 The resulting cache of the consistent hash using deep coverage zone file (deep caching) for a given client IP, delivery service, and request path.
 
 |
 
-**/crs/consistenthash/cache/geolocation/?ip=:ip&deliveryServiceId=:deliveryServiceId&requestPath=:requestPath**
+**/crs/consistenthash/cache/geolocation/?ip=<ip>&deliveryServiceId=<deliveryServiceId>&requestPath=<requestPath>**
 
 The resulting cache of the consistent hash using geolocation for a given client IP, delivery service, and request path.
 
 |
 
-**/crs/consistenthash/deliveryservice/?deliveryServiceId=:deliveryServiceId&requestPath=:requestPath**
+**/crs/consistenthash/deliveryservice/?deliveryServiceId=<deliveryServiceId>&requestPath=<requestPath>**
 
 The resulting delivery service of the consistent hash for a given delivery service and request path -- used to test steering delivery services.
 
 |
 
-**/crs/coveragezone/caches/?deliveryServiceId=:deliveryServiceId&cacheLocationId=:cacheLocationId**
+**/crs/coveragezone/caches/?deliveryServiceId=<deliveryServiceId>&cacheLocationId=<cacheLocationId>**
 
 A list of caches for a given delivery service and cache location.
 
 |
 
-**/crs/coveragezone/cachelocation/?ip=:ip&deliveryServiceId=:deliveryServiceId**
+**/crs/coveragezone/cachelocation/?ip=<ip>&deliveryServiceId=<deliveryServiceId>**
 
 The resulting cache location for a given client IP and delivery service.
 
 |
 
-**/crs/deepcoveragezone/cachelocation/?ip=:ip&deliveryServiceId=:deliveryServiceId**
+**/crs/deepcoveragezone/cachelocation/?ip=<ip>&deliveryServiceId=<deliveryServiceId>**
 
 The resulting cache location using deep coverage zone file (deep caching) for a given client IP and delivery service.
 
diff --git a/infrastructure/cdn-in-a-box/README.md b/infrastructure/cdn-in-a-box/README.md
new file mode 100644
index 000000000..3dec2c9b2
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/README.md
@@ -0,0 +1,41 @@
+# CDN-In-A-bOx (CIAO) - Notes
+
+## Build step
+So far, the build is done from this directory (/infrastructure/cdn-in-a-box/), using the following command:
+
+```bash
+docker-compose -f ./docker-compose.yml -f traffic_ops/docker-compose.yml -f traffic_ops_db/docker-compose.yml -f traffic_portal/docker-compose.yml up --build
+```
+
+This will build and start all of the currently-implemented pieces of CIAO (note that you will likely need to be root or use `sudo` to communicate with the `docker` daemon). By default, it leaves your terminal's stdout open to the logs produced by various parts of the CDN.
+
+
+## <a name="ports"></a> Ports and Interfaces
+CIAO provides API gateways and user interfaces over HTTP(S) for the pieces of the CDN that support it. By default, all of these services bind to the local address `0.0.0.0`, and are spread out over various ports. Here's a list of the ports and the services they provide:
+
+* 443 - Exposes the Traffic Ops landing page, from which you may log in and view/manage/manipulate your CIAO at will (See [the Traffic Ops documentation](http://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_ops/using.html) for details). This is also the endpoint for the Go-based Traffic Ops API, and will handle all REST API requests (including those intended to be processed by Perl).
+
+* 5432 - Exposes a connection to the Traffic Ops's Postgres database. Note that this is *not* meant to be used through a browser, and instead is an endpoint for direct connection to the database (this is used by Traffic Ops to store information).
+
+* 8000 - The "adminer" portal which allows access to the Traffic Ops Database through a browser.
+
+* 60443 - This is the endpoint for the old Perl-based API for Traffic Ops. Rather than send requests here, you should send them to port 443, as the Go-based API there will act as a reverse proxy to pass off API requests it doesn't directly handle back to this port.
+
+* 61443 - The Traffic Portal landing page. Generally-speaking, this is much easier to use and far better-looking than the Traffic Ops interface, so use of the former is recommended over that of the latter.
+
+For the credentials used by default to access these services, see [Login Credentials](#creds).
+
+
+## <a name="creds"></a>Login Credentials
+For testing/educational purposes, you may want to login to the various services exposed on local ports. For ease of building and use, the CIAO build process has a set of default login credentials it uses (you may change these, but you risk causing some part of the CDN being unable to access resources it needs). Here are the various services and their login credentials:
+
+
+Service                | Username         | Password
+-----------------------|------------------|-----------
+Traffic Ops (admin)    | `admin`          | `!!twelve`
+RIAK                   | `riakuser`       | `riakpass`
+Traffic Ops database   | `traffic_ops`    | `password`
+Traffic Portal (admin) | `admin`          | `!!twelve`
+
+Note that the login information used at the Traffic Portal interface is always exactly identical to that used at the Traffic Ops interface. As such, changing the login info for Traffic Ops will also change it for Traffic Portal.
+To know where these services are located on the local network, see [Ports and Interfaces](#ports).
diff --git a/infrastructure/cdn-in-a-box/docker-compose.yml b/infrastructure/cdn-in-a-box/docker-compose.yml
new file mode 100644
index 000000000..bbc5f3bdd
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/docker-compose.yml
@@ -0,0 +1,26 @@
+#
+#  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.
+#
+#
+# Use postgres/example user/password credentials
+version: '2.1'
+
+networks:
+  cdnnet:
+    driver: bridge
+    enable_ipv6: true
+    ipam:
+      driver: default
+      config:
+        - subnet: 172.13.238.0/24
+        - subnet: "fc01:9400:1000:7::/64"
diff --git a/infrastructure/cdn-in-a-box/edge_cache/Dockerfile b/infrastructure/cdn-in-a-box/edge_cache/Dockerfile
new file mode 100644
index 000000000..042541a23
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/edge_cache/Dockerfile
@@ -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.
+
+############################################################
+# Dockerfile to build Edge Cache instance (as a reverse proxy)
+############################################################
+
+FROM ats:latest
+
+# Modify configs as necessary (keeping backups just in case)
+WORKDIR /opt/traffic_server/etc/trafficserver
+COPY infrastructure/cdn-in-a-box/edge_cache/config-edit.sh .
+RUN chmod +x config-edit.sh
+RUN ./config-edit.sh
+
+# If all's well, serve content forever
+WORKDIR /opt/traffic_server/
+RUN cat etc/trafficserver/remap.config
+EXPOSE 8080
+CMD /opt/traffic_server/bin/traffic_server -o3
diff --git a/infrastructure/cdn-in-a-box/edge_cache/config-edit.sh b/infrastructure/cdn-in-a-box/edge_cache/config-edit.sh
new file mode 100644
index 000000000..a9e6d18aa
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/edge_cache/config-edit.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+if [[ ! -f ./records.config ]]; then
+	echo "Error! Missing records.config file!" >&2
+	exit 1
+fi
+
+if [[ ! -f ./remap.config ]]; then
+	echo "Error! Missing remap.config file!" >&2
+	exit 1
+fi
+
+mv ./records.config ./records.config.bak
+
+NEWCONFIG=$(sed -re 's/CONFIG proxy\.config\.http\.cache\.http INT 0/CONFIG proxy\.config\.http\.cache\.http INT 1/' ./records.config.bak)
+NEWCONFIG=$(echo $NEWCONFIG | sed -re 's/CONFIG proxy\.config\.reverse_proxy\.enabled INT 0/CONFIG proxy\.config\.reverse_proxy\.enabled INT 1/')
+NEWCONFIG=$(echo $NEWCONFIG | sed -re 's/CONFIG proxy\.config\.url_remap\.remap_required INT 0/CONFIG proxy\.config\.url_remap\.remap_required INT 1/')
+NEWCONFIG=$(echo $NEWCONFIG | sed -re 's/CONFIG proxy\.config\.url_remap\.pristine_host_hdr INT 0/CONFIG proxy\.config\.url_remap\.pristine_host_hdr INT 1/')
+NEWCONFIG=$(echo $NEWCONFIG | sed -re 's/CONFIG proxy\.config\.http\.server_ports STRING ..*/CONFIG proxy\.config\.http\.server_ports STRING 8080 8080:ipv6/')
+
+echo $NEWCONFIG > records.config
+
+cp ./remap.config ./remap.config.bak
+echo "map          http://proxied-origin/      http://origin/" >> remap.config
+echo "reverse_map  http://origin/  http://proxied-origin/" >> remap.config
+
+# echo "regex_map: http://(.*)/ http://origin/" >> remap.config
diff --git a/infrastructure/cdn-in-a-box/edge_cache/docker-compose.yml b/infrastructure/cdn-in-a-box/edge_cache/docker-compose.yml
new file mode 100644
index 000000000..07361c0a4
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/edge_cache/docker-compose.yml
@@ -0,0 +1,34 @@
+#
+#  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.
+#
+#
+# Use postgres/example user/password credentials
+version: '2.1'
+
+services:
+  # An edge cache TrafficServer instance
+  edge:
+    image: trafficserver_edge
+    build:
+      context: ../..
+      dockerfile: infrastructure/cdn-in-a-box/edge_cache/Dockerfile
+    ports:
+      - 8080:8080
+    volumes:
+      - logs:/var/log/traffic_server
+    networks:
+      - cdnnet
+
+volumes:
+    conf:
+    logs:
diff --git a/infrastructure/cdn-in-a-box/edge_cache/run_ts.sh b/infrastructure/cdn-in-a-box/edge_cache/run_ts.sh
new file mode 100644
index 000000000..4085c6b15
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/edge_cache/run_ts.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+if [[ ! -x ./bin/traffic_server ]]; then
+	echo "Missing 'traffic_server' executable!" >&2
+	exit 1
+fi
+
+./bin/traffic_server 2>&1 >/var/log/traffic_server/ts.log &
+disown
+exec tail -f /var/log/traffic_server/ts.log
diff --git a/infrastructure/cdn-in-a-box/origin/Dockerfile b/infrastructure/cdn-in-a-box/origin/Dockerfile
new file mode 100644
index 000000000..226d14868
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/origin/Dockerfile
@@ -0,0 +1,27 @@
+# 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.
+
+FROM ats:latest
+
+RUN mkdir -p /var/log/traffic_server
+WORKDIR /opt/traffic_server/etc/trafficserver
+COPY infrastructure/cdn-in-a-box/edge_cache/config-edit.sh
+RUN /bin/bash ./config-edit.sh
+WORKDIR /opt/traffic_server
+COPY infrastructure/cdn-in-a-box/edge_cache/run_ts.sh .
+RUN chmod +x ./run_ts.sh
+CMD ./run_ts.sh
diff --git a/infrastructure/cdn-in-a-box/origin/docker-compose.yml b/infrastructure/cdn-in-a-box/origin/docker-compose.yml
new file mode 100644
index 000000000..d0f065d00
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/origin/docker-compose.yml
@@ -0,0 +1,34 @@
+#
+#  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.
+#
+#
+# Use postgres/example user/password credentials
+version: '2.1'
+
+services:
+  # A simple testing origin
+  edge:
+    image: origin
+    build:
+      context: ../..
+      dockerfile: infrastructure/cdn-in-a-box/origin/Dockerfile
+    ports:
+      - 80:80
+    volumes:
+      - logs:/var/log/origin
+    networks:
+      - cdnnet
+
+volumes:
+    conf:
+    logs:
diff --git a/infrastructure/cdn-in-a-box/origin/index.html b/infrastructure/cdn-in-a-box/origin/index.html
new file mode 100644
index 000000000..1026d00b1
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/origin/index.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<head>
+	<meta charset="utf-8"/>
+	<title>Traffic Control Test Origin</title>
+	<meta property="og:title" content="Traffic Control Test Origin"/>
+	<meta name="twitter-title" content="Traffic Control Test Origin"/>
+	<meta name="author" content="ocket8888"/>
+	<meta name="description" content="A simple web server that offers video content for testing Traffic Control services."/>
+	<meta property="og:description" content="A simple web server that offers video content for testing Traffic Control services."/>
+
+	<!-- There's probably no real reason to support icons on all these different devices, but it's easy and complete so... ¯\_(ツ)_/¯ -->
+	<!-- third-generation iPad with high-resolution Retina display: -->
+	<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/tc-logo.svg">
+	<!-- iPhone with high-resolution Retina display: -->
+	<link rel="apple-touch-icon-precomposed" sizes="114x114" href="/tc-logo.svg">
+	<!-- first- and second-generation iPad: -->
+	<link rel="apple-touch-icon-precomposed" sizes="72x72" href="/tc-logo.svg">
+	<!-- non-Retina iPhone, iPod Touch, and Android 2.1+ devices: -->
+	<link rel="apple-touch-icon-precomposed" href="/tc-logo.svg">
+	<!-- basic favicon -->
+	<link rel="shortcut icon" href="/tc-logo.svg">
+	<style type="text/css">
+		body {
+			text-align: center;
+			height: 100vh;
+			width: 100vw;
+			background: center/90% no-repeat black url(/tc-verbose-logo.svg);
+			margin: 0;
+			color: white;
+		}
+
+		h1 {
+			padding: 10px 0;
+			margin: 0;
+		}
+
+		video {
+			height: calc(100vh - 100px - 2em);
+			width: auto;
+		}
+	</style>
+</head>
+<body>
+	<h1>Welcome to the Traffic Control test Origin server</h1>
+	<video controls autoplay src="/Night_of_the_Living_Dead.mp4">
+		Something wicked happened.
+	</video>
+</body>
+</html>
diff --git a/infrastructure/cdn-in-a-box/origin/lighttpd.conf b/infrastructure/cdn-in-a-box/origin/lighttpd.conf
new file mode 100644
index 000000000..62c41cc3a
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/origin/lighttpd.conf
@@ -0,0 +1,12 @@
+server.document-root = "/www"
+
+server.port = 80
+
+mimetype.assign = (
+  ".html" => "text/html",
+  ".svg" => "image/svg+xml",
+  ".mp4" => "video/mp4"
+)
+
+static-file.exclude-extensions = ( ".conf" )
+index-file.names = ( "index.html" )
diff --git a/infrastructure/cdn-in-a-box/traffic_ops.env b/infrastructure/cdn-in-a-box/traffic_ops.env
new file mode 100644
index 000000000..858bb06ea
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops.env
@@ -0,0 +1,30 @@
+# 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.
+TO_CDN_NAME=cdn-in-a-box
+TO_HOST=trafficops-perl
+TO_EMAIL=none@example.com
+TO_ADMIN_USER=admin
+TO_ADMIN_PASSWORD=!!twelve
+TO_SECRET=itsasecret
+CERT_COUNTRY=US
+CERT_STATE=LA
+CERT_CITY=NewOrleans
+CERT_COMPANY=Yoyodyne
+TP_HOST=none
+TP_EMAIL=none@example.com
+RIAK_USER=riakuser
+RIAK_PASSWORD=riakpass
diff --git a/infrastructure/cdn-in-a-box/traffic_ops/Dockerfile-go b/infrastructure/cdn-in-a-box/traffic_ops/Dockerfile-go
new file mode 100644
index 000000000..6dbc974ed
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops/Dockerfile-go
@@ -0,0 +1,68 @@
+# 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.
+
+############################################################
+# Dockerfile to build Traffic Ops container images
+############################################################
+
+# build stage compiles traffic_ops_golang
+FROM golang:1.10.1 AS trafficops-build
+
+# Installs dependencies
+RUN apt-get update -y && apt-get install -y libffi-dev ruby-dev rubygems vim libcap2-bin
+
+# TODO: generate BUILD_VERSION file prior -- just copy the file here
+COPY BUILD_NUMBER* VERSION /go/src/github.com/apache/incubator-trafficcontrol/
+COPY .git /go/src/github.com/apache/incubator-trafficcontrol/.git
+COPY lib /go/src/github.com/apache/incubator-trafficcontrol/lib
+COPY traffic_ops/vendor /go/src/github.com/apache/incubator-trafficcontrol/traffic_ops/vendor
+COPY traffic_ops/traffic_ops_golang /go/src/github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang
+
+WORKDIR /go/src/github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang
+
+RUN go get -v
+RUN go install -ldflags "-X main.version=traffic_ops-$(cat ../../VERSION)-$(git rev-list HEAD | wc -l|tr -d ' ').$(git rev-parse --short=8 HEAD).el7 -B 0x`git rev-parse HEAD`"
+
+# trafficops-go is the runtime image
+FROM postgres:9.6 AS trafficops-go
+
+
+ENV DB_SERVER=db
+ENV DB_PORT=5432
+ENV POSTGRES_PASSWORD=!!twelve
+ENV POSTGRES_USER=traffic_ops
+ENV DB_PASSWORD=password
+
+ENV TO_HOST=trafficops-go
+ENV TO_EMAIL=none@example.com
+ENV TO_SECRET=itsasecret
+ENV TP_HOST=none
+ENV TP_EMAIL=none@example.com
+ENV RIAK_USER=riakuser
+ENV RIAK_PASSWORD=riakpass
+EXPOSE 443
+
+# Installs dependencies
+RUN apt-get update -y && apt-get install -y libffi-dev ruby-dev rubygems vim libcap2-bin
+COPY infrastructure/cdn-in-a-box/traffic_ops/run-go.sh /
+COPY --from=trafficops-build /go/bin/traffic_ops_golang /opt/traffic_ops/app/bin/traffic_ops_golang
+
+RUN mkdir -p /var/log/traffic_ops
+RUN chmod +x /run-go.sh
+RUN setcap cap_net_bind_service=+ep /opt/traffic_ops/app/bin/traffic_ops_golang
+
+CMD /run-go.sh /opt/traffic_ops/app/bin/traffic_ops_golang -cfg /opt/traffic_ops/app/conf/cdn.conf -dbcfg=/opt/traffic_ops/app/conf/production/database.conf
diff --git a/infrastructure/cdn-in-a-box/traffic_ops/Dockerfile-perl b/infrastructure/cdn-in-a-box/traffic_ops/Dockerfile-perl
new file mode 100644
index 000000000..a25ce0483
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops/Dockerfile-perl
@@ -0,0 +1,99 @@
+# 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.
+
+############################################################
+# Dockerfile to build Traffic Ops container images
+############################################################
+
+# Base stage installs rpms needed for both building and runtime
+FROM centos:7 AS trafficops-perl-base
+MAINTAINER Dan Kirkwood
+
+RUN yum install -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-redhat96-9.6-3.noarch.rpm
+RUN yum -y install \
+    gcc \
+    libcap-devel\
+    libcap\
+    libcurl\
+    libcurl-devel\
+    libidn-devel\
+    libpcap-devel\
+    mkisofs\
+    openssl-devel\
+    perl\
+    perl-Crypt-ScryptKDF\
+    perl-DBD-Pg\
+    perl-DBI\
+    perl-Digest-SHA1\
+    perl-JSON\
+    perl-TermReadKey\
+    perl-Test-CPAN-Meta\
+    perl-WWW-Curl\
+    perl-core\
+    perl-libwww-perl\
+    postgresql96\
+    postgresql96-devel
+
+# Build stage gets traffic ops source in place and installs perl modules using carton
+FROM trafficops-perl-base AS trafficops-perl-build
+
+RUN yum -y install \
+    cpanminus\
+    expat-devel\
+    git
+
+RUN yum -y clean all
+
+RUN cpanm Carton
+COPY traffic_ops/app /opt/traffic_ops/app
+COPY traffic_ops/install /opt/traffic_ops/install
+WORKDIR /opt/traffic_ops/app
+RUN POSTGRES_HOME=/usr/pgsql-9.6 /usr/local/bin/carton || cat /root/.cpanm/work/*/build.log
+RUN /opt/traffic_ops/install/bin/install_go.sh
+RUN /opt/traffic_ops/install/bin/install_goose.sh
+RUN /opt/traffic_ops/install/bin/download_web_deps
+
+# Trafficops Perl stage runs hypnotoad
+FROM trafficops-perl-base AS trafficops-perl
+
+# Copy only what's required...
+COPY --from=trafficops-perl-build /opt/traffic_ops /opt/traffic_ops
+COPY --from=trafficops-perl-build /usr/local/go /usr/local/go
+
+ENV DB_SERVER=db
+ENV POSTGRES_PASSWORD=!!twelve
+ENV DB_PORT=5432
+ENV POSTGRES_USER=traffic_ops
+ENV DB_PASSWORD=password
+
+ENV TO_HOST=trafficops
+ENV TO_EMAIL=none@example.com
+ENV TO_SECRET=itsasecret
+ENV TP_HOST=none
+ENV TP_EMAIL=none@example.com
+ENV RIAK_USER=riakuser
+ENV RIAK_PASSWORD=riakpass
+
+ENV MOJO_MODE production
+EXPOSE 60443
+
+COPY infrastructure/cdn-in-a-box/traffic_ops/profile.origin.traffic_ops /
+COPY infrastructure/cdn-in-a-box/traffic_ops/run-perl.sh /
+
+WORKDIR /opt/traffic_ops/app
+RUN mkdir -p /var/log/traffic_ops
+CMD /run-perl.sh
diff --git a/infrastructure/cdn-in-a-box/traffic_ops/docker-compose.yml b/infrastructure/cdn-in-a-box/traffic_ops/docker-compose.yml
new file mode 100644
index 000000000..5440a8b3a
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops/docker-compose.yml
@@ -0,0 +1,58 @@
+#
+#  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.
+#
+#
+# Use postgres/example user/password credentials
+version: '2.1'
+
+services:
+
+  # Traffic Ops (Perl)
+  trafficops-perl:
+    image: trafficops-perl
+    build:
+      context: ../..
+      dockerfile: infrastructure/cdn-in-a-box/traffic_ops/Dockerfile-perl
+    environment:
+      - "USER=root"
+    env_file:
+      - traffic_ops_db.env
+      - traffic_ops.env
+    ports:
+      - 60443:60443
+    volumes:
+      - conf:/opt/traffic_ops/app/conf
+      - logs:/var/log/traffic_ops
+    networks:
+      - cdnnet
+
+  # Traffic Ops (Go)
+  trafficops-go:
+    image: trafficops-go
+    build:
+      context: ../..
+      dockerfile: infrastructure/cdn-in-a-box/traffic_ops/Dockerfile-go
+    env_file:
+      - traffic_ops_db.env
+      - traffic_ops.env
+    ports:
+      - 443:443
+    volumes:
+      - conf:/opt/traffic_ops/app/conf
+      - logs:/var/log/traffic_ops
+    networks:
+      - cdnnet
+
+volumes:
+    conf:
+    logs:
diff --git a/infrastructure/cdn-in-a-box/traffic_ops/profile.origin.traffic_ops b/infrastructure/cdn-in-a-box/traffic_ops/profile.origin.traffic_ops
new file mode 100644
index 000000000..f655f89c2
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops/profile.origin.traffic_ops
@@ -0,0 +1,18 @@
+{
+    "parameters": [
+        {
+            "config_file": "CRConfig.json",
+            "name": "domain_name",
+            "value": "{{.Domain}}"
+        },
+        {
+            "config_file": "parent.config",
+            "name": "weight",
+            "value": "1.0"
+        }
+    ],
+    "profile": {
+        "description": "Multi site origin profile 1",
+        "name": "ORG1_CDN1"
+    }
+}
diff --git a/infrastructure/cdn-in-a-box/traffic_ops/run-go.sh b/infrastructure/cdn-in-a-box/traffic_ops/run-go.sh
new file mode 100755
index 000000000..380e53e17
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops/run-go.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+#
+# 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.
+
+set -ex
+env
+
+until PGPASSWORD="$POSTGRES_PASSWORD" psql -h "$DB_SERVER" -U "postgres" -p "$DB_PORT" -c '\l'; do
+  >&2 echo "Postgres is unavailable - sleeping"
+  sleep 1
+done
+
+>&2 echo "Postgres is up - executing command"
+
+while [[ ! -f /opt/traffic_ops/app/conf/ready ]]; do
+    >&2 echo "Waiting for trafficops-perl"
+    sleep 3
+done
+
+cmd="$@"
+$cmd
+tail -f /var/log/traffic_ops/error.log
diff --git a/infrastructure/cdn-in-a-box/traffic_ops/run-perl.sh b/infrastructure/cdn-in-a-box/traffic_ops/run-perl.sh
new file mode 100755
index 000000000..b80e36832
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops/run-perl.sh
@@ -0,0 +1,151 @@
+#!/usr/bin/env bash
+#
+# 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.
+
+set -ex
+env
+
+envvars=( DB_SERVER POSTGRES_PASSWORD DB_PORT DB_NAME POSTGRES_USER DB_USER DB_PASSWORD TO_HOST TO_EMAIL TP_HOST TP_EMAIL TO_SECRET RIAK_USER RIAK_PASSWORD )
+for v in ${envvars[*]}
+do
+    val=${!v}
+    [[ -z $val ]] && echo $v is unset && exit 1
+done
+
+export TO=/opt/traffic_ops/app
+
+
+# TODO: change sslmode=require when enabled in db
+cat >$TO/db/dbconf.yml <<-DBCONF
+version: "1.0"
+name: dbconf.yml
+production:
+  driver: postgres
+  open: host=$DB_SERVER port=$DB_PORT user=$DB_USER password=$DB_PASSWORD dbname=$DB_NAME sslmode=disable
+DBCONF
+
+cat >$TO/conf/production/database.conf <<-DATABASECONF
+{
+	"description": "PostgreSQL database on $DB_SERVER port $TO_PORT",
+	"dbname": "$DB_NAME",
+	"hostname": "$DB_SERVER",
+	"user": "$DB_USER",
+	"password": "$DB_PASSWORD",
+	"port": "$DB_PORT",
+	"ssl": false,
+	"type": "Pg"
+}
+DATABASECONF
+
+crt=$TO/conf/trafficops.crt
+key=$TO/conf/trafficops.key
+openssl req -newkey rsa:2048 -nodes -keyout $key -x509 -days 365 -out $crt -subj "/C=$CERT_COUNTRY/ST=$CERT_STATE/L=$CERT_CITY/O=$CERT_COMPANY"
+
+cat >$TO/conf/cdn.conf <<-CDNCONF
+{
+    "hypnotoad" : {
+        "listen" : [
+            "https://trafficops-perl:60443?cert=$crt&key=$key&verify=0x00&ciphers=AES128-GCM-SHA256:HIGH:!RC4:!MD5:!aNULL:!EDH:!ED"
+        ],
+        "user" : "trafops",
+        "group" : "trafops",
+        "heartbeat_timeout" : 20,
+        "pid_file" : "/var/run/traffic_ops.pid",
+        "workers" : 12
+    },
+    "traffic_ops_golang" : {
+        "port" : "443",
+        "proxy_timeout" : 60,
+        "proxy_keep_alive" : 60,
+        "proxy_tls_timeout" : 60,
+        "proxy_read_header_timeout" : 60,
+        "read_timeout" : 60,
+        "read_header_timeout" : 60,
+        "write_timeout" : 60,
+        "idle_timeout" : 60,
+        "log_location_error": "/var/log/traffic_ops/error.log",
+        "log_location_warning": "",
+        "log_location_info": "",
+        "log_location_debug": "",
+        "log_location_event": "/var/log/traffic_ops/access.log",
+        "max_db_connections": 20,
+        "backend_max_connections": {
+            "mojolicious": 4
+        }
+    },
+    "cors" : {
+        "access_control_allow_origin" : "*"
+    },
+    "to" : {
+        "base_url" : "https://$TO_HOST",
+        "email_from" : "no-reply@traffic-ops-domain.com",
+        "no_account_found_msg" : "A Traffic Ops user account is required for access. Please contact your Traffic Ops user administrator."
+    },
+    "portal" : {
+        "base_url" : "http://localhost:61443/!#/",
+        "email_from" : "no-reply@traffic-portal-domain.com",
+        "pass_reset_path" : "user",
+        "user_register_path" : "user"
+    },
+    "secrets" : [
+        "$TO_SECRET"
+    ],
+    "geniso" : {
+        "iso_root_path" : "$TO/public"
+    },
+    "inactivity_timeout" : 60
+}
+CDNCONF
+
+# ensure db is available for DB_USER
+export PGPASSWORD="$DB_PASSWORD"
+until psql -h "$DB_SERVER" -U "$DB_USER" -p "$DB_PORT" -c '\l'; do
+  >&2 echo "Postgres is unavailable - sleeping"
+  sleep 1
+done
+
+sleep 3 # give it a few extra seconds
+
+psql -h "$DB_SERVER" -U "$DB_USER" -p "$DB_PORT" -c '\du'
+
+>&2 echo "Postgres is up"
+
+
+useradd trafops
+export PERL5LIB=$TO/lib:$TO/local/lib/perl5
+cd $TO || (echo "NO $TO found" && exit 1)
+
+chown -R trafops:trafops .
+
+# needed for goose
+export GOPATH=/opt/traffic_ops/go
+export PATH=$PATH:$GOPATH/bin:/usr/local/go/bin
+
+./db/admin.pl --env production upgrade
+./db/adduser.pl $TO_ADMIN_USER $TO_ADMIN_PASSWORD admin | tee /adduser.sql | psql -h "$DB_SERVER" -p "$DB_PORT" -U "$DB_USER" "$DB_NAME" -e
+./local/bin/hypnotoad script/cdn
+
+while [[ ! -f /var/log/traffic_ops/traffic_ops.log ]]; do
+    echo waiting for /var/log/traffic_ops/traffic_ops.log
+    ps -ef | grep traffic
+    sleep 1
+done
+
+touch $TO/conf/ready
+
+exec tail -f /var/log/traffic_ops/traffic_ops.log
diff --git a/infrastructure/cdn-in-a-box/traffic_ops/trafficops_adduser.go b/infrastructure/cdn-in-a-box/traffic_ops/trafficops_adduser.go
new file mode 100644
index 000000000..89f09e7ed
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops/trafficops_adduser.go
@@ -0,0 +1,89 @@
+package main
+
+// 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.
+
+import (
+	"fmt"
+	"os"
+	"strings"
+	"text/template"
+	"unicode"
+
+	"auth"
+)
+
+const insertTemplate = `
+INSERT INTO tm_user (username, role, local_passwd, confirm_local_passwd)
+  VALUES ('{{ .Username }}',
+          (SELECT id FROM role WHERE name='{{ .RoleName }}'),
+          '{{ .EncryptedPassword }}',
+          '{{ .EncryptedPassword }}')
+`
+
+// User contains only required fields to be stored in the db
+type User struct {
+	Username          string
+	Password          string
+	EncryptedPassword string
+	RoleName          string
+}
+
+var (
+	userEnv     = "TO_ADMIN_USER"
+	passwordEnv = "TO_ADMIN_PASSWORD"
+)
+
+func main() {
+	user := User{Username: "admin", RoleName: "admin"}
+	v := os.Getenv("TO_ADMIN_USER")
+	if len(v) > 0 {
+		user.Username = v
+	}
+
+	user.Password = os.Getenv("TO_ADMIN_PASSWORD")
+	if user.Password == "" {
+		fmt.Println("no password supplied in ", passwordEnv)
+		os.Exit(1)
+	}
+
+	// scan user input for invalid characters -- TODO: is this complete?
+	strings.IndexFunc(user.Username,
+		func(r rune) bool {
+			return !unicode.IsPrint(r) && (unicode.IsPunct(r) || unicode.IsSpace(r))
+		},
+	)
+
+	enc, err := auth.DerivePassword(user.Password)
+	if err != nil {
+		fmt.Printf("error encrypting password: %v\n", err)
+		os.Exit(1)
+	}
+
+	user.EncryptedPassword = enc
+	tmpl, err := template.New("insertuser").Parse(insertTemplate)
+	if err != nil {
+		fmt.Printf("error parsing template:: %v\n", err)
+		os.Exit(1)
+	}
+
+	err = tmpl.Execute(os.Stdout, user)
+	if err != nil {
+		fmt.Printf("error executing template:: %v\n", err)
+		os.Exit(1)
+	}
+}
diff --git a/infrastructure/cdn-in-a-box/traffic_ops_db.env b/infrastructure/cdn-in-a-box/traffic_ops_db.env
new file mode 100644
index 000000000..f9933ac03
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops_db.env
@@ -0,0 +1,25 @@
+# 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.
+DB_NAME=traffic_ops
+DB_PASSWORD=password
+DB_PORT=5432
+DB_SERVER=db
+DB_USER=traffic_ops
+PGDATA=/pgdata
+POSTGRES_DB=traffic_ops
+POSTGRES_PASSWORD=password
+POSTGRES_USER=postgres
diff --git a/infrastructure/cdn-in-a-box/traffic_ops_db/.gitignore b/infrastructure/cdn-in-a-box/traffic_ops_db/.gitignore
new file mode 100644
index 000000000..df66968a5
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops_db/.gitignore
@@ -0,0 +1,2 @@
+logs
+pgdata
diff --git a/infrastructure/cdn-in-a-box/traffic_ops_db/Dockerfile b/infrastructure/cdn-in-a-box/traffic_ops_db/Dockerfile
new file mode 100644
index 000000000..fe31fc8d5
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops_db/Dockerfile
@@ -0,0 +1,23 @@
+# 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.
+
+FROM postgres:9.6
+
+COPY traffic_ops/app/db/create_tables.sql /docker-entrypoint-initdb.d/100-create_tables.sql
+COPY infrastructure/cdn-in-a-box/traffic_ops_db/initdb.d /docker-entrypoint-initdb.d
+
+RUN chmod 755 /docker-entrypoint-initdb.d/*
diff --git a/infrastructure/cdn-in-a-box/traffic_ops_db/docker-compose.yml b/infrastructure/cdn-in-a-box/traffic_ops_db/docker-compose.yml
new file mode 100644
index 000000000..390c96a0f
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops_db/docker-compose.yml
@@ -0,0 +1,46 @@
+#
+#  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.
+#
+#
+# Use postgres/example user/password credentials
+version: '2.1'
+
+services:
+
+  db:
+    image: trafficops-db
+    build:
+      context: ../..
+      dockerfile: infrastructure/cdn-in-a-box/traffic_ops_db/Dockerfile
+    restart: always
+    env_file:
+      - traffic_ops_db.env
+      - traffic_ops.env
+    ports:
+      - 5432:5432
+    volumes:
+      - pgdata:/pgdata
+      - logs:/var/log/postgresql
+    networks:
+      - cdnnet
+
+  adminer:
+    image: adminer
+    restart: always
+    ports:
+      - 8000:8000
+    networks:
+      - cdnnet
+
+volumes:
+    pgdata:
diff --git a/infrastructure/cdn-in-a-box/traffic_ops_db/initdb.d/000-init.sh b/infrastructure/cdn-in-a-box/traffic_ops_db/initdb.d/000-init.sh
new file mode 100644
index 000000000..34463369b
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_ops_db/initdb.d/000-init.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+#
+#  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.
+#
+#
+
+psql -Upostgres <<-ENDOFSQL
+DROP USER IF EXISTS $DB_USER;
+CREATE USER $DB_USER WITH ENCRYPTED PASSWORD '$DB_PASSWORD';
+ALTER DATABASE $DB_NAME OWNER TO $DB_USER;
+ENDOFSQL
+
diff --git a/infrastructure/cdn-in-a-box/traffic_portal.env b/infrastructure/cdn-in-a-box/traffic_portal.env
new file mode 100644
index 000000000..4d02944ce
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_portal.env
@@ -0,0 +1,18 @@
+# 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.
+TO_HOST=trafficops-go
+TO_PORT=443
diff --git a/infrastructure/cdn-in-a-box/traffic_portal/Dockerfile b/infrastructure/cdn-in-a-box/traffic_portal/Dockerfile
new file mode 100644
index 000000000..e654bcfe1
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_portal/Dockerfile
@@ -0,0 +1,94 @@
+# 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.
+
+FROM node:latest AS trafficportal-build
+
+# Installs dependencies
+RUN apt-get update -y && apt-get install -y libffi-dev ruby-dev rubygems vim openssl
+
+# Installs rubygem dependencies
+RUN gem update --system
+RUN gem install --no-rdoc --no-ri compass
+RUN gem install --no-rdoc --no-ri sass -v 3.4.22
+
+# Global node dependencies (*shudders involuntarily*)
+RUN npm install -g bower grunt-cli
+
+# Sure, why not run javascript as root?
+RUN echo '{ "allow_root": true }' > /root/.bowerrc
+
+# Dynamically-generated ssl certificates
+RUN openssl genrsa -des3 -passout pass:dummypassword -out localhost.key 2048 -noout
+RUN openssl rsa -in localhost.key -passin pass:dummypassword -out localhost.key
+RUN openssl req -new -key localhost.key -out localhost.csr -passin pass:dummypassword -subj "/C=US/ST=Colorado/L=Denver/O=Comcast/OU=iaa/CN=localhost/emailAddress=Brennan_Fieck@comcast.com"
+RUN openssl x509 -in localhost.csr -out localhost.crt -req -signkey localhost.key -days 1001
+
+# Getting the whole source.. should eventually find a way to not include everything (since we don't need it all)
+COPY traffic_portal /traffic_portal
+
+# The build step, using yum.js (even though we already have apt-get.js) and make.js
+WORKDIR /traffic_portal
+RUN npm install
+RUN bower install
+RUN grunt dist
+
+
+# Now the actual deployment container
+FROM node:latest as trafficportal
+
+# This controls the place from which Traffic Portal is deployed
+ENV TP_HOME /opt/traffic_portal
+
+# The source location in the previous build stage
+ENV SRC /traffic_portal
+
+# This really ought to be taken care of by docker-compose, but idk; the other pieces are doing this
+ENV TO_PORT 443
+ENV TO_HOST trafficops-go
+
+# Setting up directory structure
+RUN mkdir -p /etc/traffic_portal
+RUN mkdir -p /etc/logrotate.d
+RUN mkdir -p /etc/init.d
+RUN mkdir -p /var/log/traffic_portal
+RUN mkdir -p ${TP_HOME}/server
+
+# Copy the final product into its proper place(s)
+WORKDIR ${TP_HOME}
+COPY --from=trafficportal-build ${SRC}/server.js .
+# COPY --from=trafficportal-build ${SRC}/conf /etc/traffic_portal/
+COPY --from=trafficportal-build ${SRC}/build/etc/init.d/traffic_portal /etc/init.d/
+COPY --from=trafficportal-build ${SRC}/build/etc/logrotate.d/traffic_portal /etc/logrotate.d/
+COPY --from=trafficportal-build ${SRC}/build/etc/logrotate.d/traffic_portal-access /etc/logrotate.d/
+COPY --from=trafficportal-build ${SRC}/app/dist/ .
+COPY --from=trafficportal-build ${SRC}/localhost.key /etc/pki/tls/private/localhost.key
+COPY --from=trafficportal-build ${SRC}/localhost.crt /etc/pki/tls/certs/localhost.crt
+COPY --from=trafficportal-build ${SRC}/localhost.crt /etc/pki/tls/certs/ca-bundle.crt
+
+# Now to build the release info
+RUN echo -e "{\n\"Version\":\"2.1\",\n\"Build Date\":\"$(dat +'%Y-%m-%d %H:%M:%S')\"\n}" > public/traffic_portal_release.json
+
+# Make some things executable
+RUN chmod +x ${TP_HOME}/node_modules/forever/bin/forever
+RUN chmod +x /etc/init.d/traffic_portal
+
+EXPOSE 61443
+
+COPY infrastructure/cdn-in-a-box/traffic_portal/run.sh /
+RUN chmod +x /run.sh
+
+CMD /run.sh
diff --git a/infrastructure/cdn-in-a-box/traffic_portal/docker-compose.yml b/infrastructure/cdn-in-a-box/traffic_portal/docker-compose.yml
new file mode 100644
index 000000000..6ea600b04
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_portal/docker-compose.yml
@@ -0,0 +1,41 @@
+#
+#  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.
+#
+#
+# Use postgres/example user/password credentials
+version: '2.1'
+
+services:
+
+  # Traffic Portal
+  trafficportal:
+    image: trafficportal
+    build:
+      context: ../..
+      dockerfile: infrastructure/cdn-in-a-box/traffic_portal/Dockerfile
+    environment:
+      - "USER=root"
+    env_file:
+      - traffic_ops.env
+      - traffic_portal.env
+    ports:
+      - 61443:61443
+    volumes:
+      - conf:/opt/traffic_portal/app/conf
+      - logs:/var/log/traffic_portal
+    networks:
+      - cdnnet
+
+volumes:
+    conf:
+    logs:
diff --git a/infrastructure/cdn-in-a-box/traffic_portal/run.sh b/infrastructure/cdn-in-a-box/traffic_portal/run.sh
new file mode 100644
index 000000000..3b08d6974
--- /dev/null
+++ b/infrastructure/cdn-in-a-box/traffic_portal/run.sh
@@ -0,0 +1,100 @@
+#!/usr/bin/env bash
+#
+# 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.
+
+set -ex
+
+envvars=( TO_HOST CERT_COUNTRY CERT_STATE CERT_CITY CERT_COMPANY )
+for v in ${envvars[*]}; do
+	val=${!v}
+	[[ -z $val ]] && echo "$v is unset" && exit 1
+done
+
+mkdir -p /etc/traffic_portal/conf/
+mkdir -p /etc/pki/tls/private
+mkdir -p /etc/pki/tls/certs
+key=/etc/pki/tls/private/localhost.key
+cert=/etc/pki/tls/certs/localhost.crt
+mkdir -p $(dirname $key) $(dirname $cert)
+openssl req -newkey rsa:2048 -nodes -keyout $key -x509 -days 365 -out $cert -subj "/C=$CERT_COUNTRY/ST=$CERT_STATE/L=$CERT_CITY/O=$CERT_COMPANY"
+
+cat >/etc/traffic_portal/conf/config.js <<-TPCONF
+/*
+ * 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.
+ */
+
+// this is the config that is consumed by /server.js on traffic portal startup (sudo service traffic_portal start)
+module.exports = {
+    timeout: '120s',
+    useSSL: true, // set to true if you plan to use https (self-signed or trusted certs).
+    port: 80, // set to http port
+    sslPort: 61443, // set to https port
+    // if useSSL is true, generate ssl certs and provide the proper locations.
+    ssl: {
+        key:    '${key}',
+        cert:   '${cert}',
+        ca:     [ '/etc/pki/tls/certs/ca-bundle.crt' ]
+    },
+    // set api 'base_url' to the traffic ops api url (all api calls made from the traffic portal will be proxied to the api base_url)
+    api: {
+        base_url: "https://${TO_HOST}:${TO_PORT}/api"
+    },
+    // default static files location (this is where the traffic portal html, css and javascript was installed. rpm installs these files at /opt/traffic_portal/public
+    // change this to ./app/dist/public/ if you are running locally for development
+    files: {
+        static: '/opt/traffic_portal/public'
+    },
+    // default log location (this is where traffic_portal logs are written)
+    // change this to ./server/log/access.log if you are running traffic portal locally for development
+    log: {
+        stream: '/var/log/traffic_portal/access.log'
+    },
+    reject_unauthorized: 0 // 0 if using self-signed certs, 1 if trusted certs
+};
+
+TPCONF
+
+/etc/init.d/traffic_portal start
+
+# Give trafficportal a second to create the logfile
+sleep 3
+
+# Print out the status, because trafficportal will fail silently if you let it
+/etc/init.d/traffic_portal status
+
+#Fallback
+if [[ ! -f /var/log/traffic_portal/traffic_portal.log ]]; then
+	touch /var/log/traffic_portal/traffic_portal.log
+fi
+
+exec tail -f /var/log/traffic_portal/traffic_portal.log
diff --git a/lib/go-tc/crconfig.go b/lib/go-tc/crconfig.go
index f7b57c786..aee4976fe 100644
--- a/lib/go-tc/crconfig.go
+++ b/lib/go-tc/crconfig.go
@@ -101,28 +101,29 @@ type CRConfigTrafficOpsServer struct {
 
 //TODO: drichardson - reconcile this with the DeliveryService struct in deliveryservices.go
 type CRConfigDeliveryService struct {
-	CoverageZoneOnly     bool                                  `json:"coverageZoneOnly,string"`
-	Dispersion           *CRConfigDispersion                   `json:"dispersion,omitempty"`
-	Domains              []string                              `json:"domains,omitempty"`
-	GeoLocationProvider  *string                               `json:"geolocationProvider,omitempty"`
-	MatchSets            []*MatchSet                           `json:"matchsets,omitempty"`
-	MissLocation         *CRConfigLatitudeLongitudeShort       `json:"missLocation,omitempty"`
-	Protocol             *CRConfigDeliveryServiceProtocol      `json:"protocol,omitempty"`
-	RegionalGeoBlocking  *string                               `json:"regionalGeoBlocking,omitempty"`
-	ResponseHeaders      map[string]string                     `json:"responseHeaders,omitempty"`
-	RequestHeaders       []string                              `json:"requestHeaders,omitempty"`
-	Soa                  *SOA                                  `json:"soa,omitempty"`
-	SSLEnabled           bool                                  `json:"sslEnabled,string"`
-	TTL                  *int                                  `json:"ttl,omitempty"`
-	TTLs                 *CRConfigTTL                          `json:"ttls,omitempty"`
-	MaxDNSIPsForLocation *int                                  `json:"maxDnsIpsForLocation,omitempty"`
-	IP6RoutingEnabled    *bool                                 `json:"ip6RoutingEnabled,string,omitempty"`
-	RoutingName          *string                               `json:"routingName,omitempty"`
-	BypassDestination    map[string]*CRConfigBypassDestination `json:"bypassDestination,omitempty"`
-	DeepCachingType      *DeepCachingType                      `json:"deepCachingType"`
-	GeoEnabled           []CRConfigGeoEnabled                  `json:"geoEnabled,omitempty"`
-	GeoLimitRedirectURL  *string                               `json:"geoLimitRedirectURL,omitempty"`
-	StaticDNSEntries     []StaticDNSEntry                      `json:"staticDnsEntries,omitempty"`
+	AnonymousBlockingEnabled *string                               `json:"anonymousBlockingEnabled,omitempty"`
+	CoverageZoneOnly         bool                                  `json:"coverageZoneOnly,string"`
+	Dispersion               *CRConfigDispersion                   `json:"dispersion,omitempty"`
+	Domains                  []string                              `json:"domains,omitempty"`
+	GeoLocationProvider      *string                               `json:"geolocationProvider,omitempty"`
+	MatchSets                []*MatchSet                           `json:"matchsets,omitempty"`
+	MissLocation             *CRConfigLatitudeLongitudeShort       `json:"missLocation,omitempty"`
+	Protocol                 *CRConfigDeliveryServiceProtocol      `json:"protocol,omitempty"`
+	RegionalGeoBlocking      *string                               `json:"regionalGeoBlocking,omitempty"`
+	ResponseHeaders          map[string]string                     `json:"responseHeaders,omitempty"`
+	RequestHeaders           []string                              `json:"requestHeaders,omitempty"`
+	Soa                      *SOA                                  `json:"soa,omitempty"`
+	SSLEnabled               bool                                  `json:"sslEnabled,string"`
+	TTL                      *int                                  `json:"ttl,omitempty"`
+	TTLs                     *CRConfigTTL                          `json:"ttls,omitempty"`
+	MaxDNSIPsForLocation     *int                                  `json:"maxDnsIpsForLocation,omitempty"`
+	IP6RoutingEnabled        *bool                                 `json:"ip6RoutingEnabled,string,omitempty"`
+	RoutingName              *string                               `json:"routingName,omitempty"`
+	BypassDestination        map[string]*CRConfigBypassDestination `json:"bypassDestination,omitempty"`
+	DeepCachingType          *DeepCachingType                      `json:"deepCachingType"`
+	GeoEnabled               []CRConfigGeoEnabled                  `json:"geoEnabled,omitempty"`
+	GeoLimitRedirectURL      *string                               `json:"geoLimitRedirectURL,omitempty"`
+	StaticDNSEntries         []StaticDNSEntry                      `json:"staticDnsEntries,omitempty"`
 }
 
 type CRConfigGeoEnabled struct {
diff --git a/lib/go-tc/deliveryservice_servers.go b/lib/go-tc/deliveryservice_servers.go
new file mode 100644
index 000000000..aa0ec99cc
--- /dev/null
+++ b/lib/go-tc/deliveryservice_servers.go
@@ -0,0 +1,80 @@
+package tc
+
+import "time"
+
+/*
+
+   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.
+*/
+
+// DeliveryServiceServerResponse ...
+type DeliveryServiceServerResponse struct {
+	Response []DeliveryServiceServer `json:"response"`
+	Size     int                     `json:"size"`
+	OrderBy  string                  `json:"orderby"`
+	Limit    int                     `json:"limit"`
+}
+
+// DeliveryServiceServer ...
+type DeliveryServiceServer struct {
+	Server          *int             `json:"server"`
+	DeliveryService *int             `json:"deliveryService"`
+	LastUpdated     *TimeNoMod       `json:"lastUpdated" db:"last_updated"`
+}
+
+
+type DssServer struct {
+	Cachegroup       *string              `json:"cachegroup" db:"cachegroup"`
+	CachegroupID     *int                 `json:"cachegroupId" db:"cachegroup_id"`
+	CDNID            *int                 `json:"cdnId" db:"cdn_id"`
+	CDNName          *string              `json:"cdnName" db:"cdn_name"`
+	DeliveryServices *map[string][]string `json:"deliveryServices,omitempty"`
+	DomainName       *string              `json:"domainName" db:"domain_name"`
+	FQDN             *string              `json:"fqdn,omitempty"`
+	FqdnTime         time.Time            `json:"-"`
+	GUID             *string              `json:"guid" db:"guid"`
+	HostName         *string              `json:"hostName" db:"host_name"`
+	HTTPSPort        *int                 `json:"httpsPort" db:"https_port"`
+	ID               *int                 `json:"id" db:"id"`
+	ILOIPAddress     *string              `json:"iloIpAddress" db:"ilo_ip_address"`
+	ILOIPGateway     *string              `json:"iloIpGateway" db:"ilo_ip_gateway"`
+	ILOIPNetmask     *string              `json:"iloIpNetmask" db:"ilo_ip_netmask"`
+	ILOPassword      *string              `json:"iloPassword" db:"ilo_password"`
+	ILOUsername      *string              `json:"iloUsername" db:"ilo_username"`
+	InterfaceMtu     *int                 `json:"interfaceMtu" db:"interface_mtu"`
+	InterfaceName    *string              `json:"interfaceName" db:"interface_name"`
+	IP6Address       *string              `json:"ip6Address" db:"ip6_address"`
+	IP6Gateway       *string              `json:"ip6Gateway" db:"ip6_gateway"`
+	IPAddress        *string              `json:"ipAddress" db:"ip_address"`
+	IPGateway        *string              `json:"ipGateway" db:"ip_gateway"`
+	IPNetmask        *string              `json:"ipNetmask" db:"ip_netmask"`
+	LastUpdated      *TimeNoMod           `json:"lastUpdated" db:"last_updated"`
+	MgmtIPAddress    *string              `json:"mgmtIpAddress" db:"mgmt_ip_address"`
+	MgmtIPGateway    *string              `json:"mgmtIpGateway" db:"mgmt_ip_gateway"`
+	MgmtIPNetmask    *string              `json:"mgmtIpNetmask" db:"mgmt_ip_netmask"`
+	OfflineReason    *string              `json:"offlineReason" db:"offline_reason"`
+	PhysLocation     *string              `json:"physLocation" db:"phys_location"`
+	PhysLocationID   *int                 `json:"physLocationId" db:"phys_location_id"`
+	Profile          *string              `json:"profile" db:"profile"`
+	ProfileDesc      *string              `json:"profileDesc" db:"profile_desc"`
+	ProfileID        *int                 `json:"profileId" db:"profile_id"`
+	Rack             *string              `json:"rack" db:"rack"`
+	RouterHostName   *string              `json:"routerHostName" db:"router_host_name"`
+	RouterPortName   *string              `json:"routerPortName" db:"router_port_name"`
+	Status           *string              `json:"status" db:"status"`
+	StatusID         *int                 `json:"statusId" db:"status_id"`
+	TCPPort          *int                 `json:"tcpPort" db:"tcp_port"`
+	Type             string               `json:"type" db:"server_type"`
+	TypeID           *int                 `json:"typeId" db:"server_type_id"`
+	UpdPending       *bool                `json:"updPending" db:"upd_pending"`
+}
diff --git a/lib/go-tc/deliveryservices.go b/lib/go-tc/deliveryservices.go
index c35288285..fa3bbf121 100644
--- a/lib/go-tc/deliveryservices.go
+++ b/lib/go-tc/deliveryservices.go
@@ -57,59 +57,60 @@ type DeleteDeliveryServiceResponse struct {
 
 // DeliveryService ...
 type DeliveryService struct {
-	Active               bool                   `json:"active"`
-	CacheURL             string                 `json:"cacheurl"`
-	CCRDNSTTL            int                    `json:"ccrDnsTtl"`
-	CDNID                int                    `json:"cdnId"`
-	CDNName              string                 `json:"cdnName"`
-	CheckPath            string                 `json:"checkPath"`
-	DeepCachingType      DeepCachingType        `json:"deepCachingType"`
-	DisplayName          string                 `json:"displayName"`
-	DNSBypassCname       string                 `json:"dnsBypassCname"`
-	DNSBypassIP          string                 `json:"dnsBypassIp"`
-	DNSBypassIP6         string                 `json:"dnsBypassIp6"`
-	DNSBypassTTL         int                    `json:"dnsBypassTtl"`
-	DSCP                 int                    `json:"dscp"`
-	EdgeHeaderRewrite    string                 `json:"edgeHeaderRewrite"`
-	ExampleURLs          []string               `json:"exampleURLs"`
-	GeoLimit             int                    `json:"geoLimit"`
-	FQPacingRate         int                    `json:"fqPacingRate"`
-	GeoProvider          int                    `json:"geoProvider"`
-	GlobalMaxMBPS        int                    `json:"globalMaxMbps"`
-	GlobalMaxTPS         int                    `json:"globalMaxTps"`
-	HTTPBypassFQDN       string                 `json:"httpBypassFqdn"`
-	ID                   int                    `json:"id"`
-	InfoURL              string                 `json:"infoUrl"`
-	InitialDispersion    float32                `json:"initialDispersion"`
-	IPV6RoutingEnabled   bool                   `json:"ipv6RoutingEnabled"`
-	LastUpdated          *TimeNoMod             `json:"lastUpdated" db:"last_updated"`
-	LogsEnabled          bool                   `json:"logsEnabled"`
-	LongDesc             string                 `json:"longDesc"`
-	LongDesc1            string                 `json:"longDesc1"`
-	LongDesc2            string                 `json:"longDesc2"`
-	MatchList            []DeliveryServiceMatch `json:"matchList,omitempty"`
-	MaxDNSAnswers        int                    `json:"maxDnsAnswers"`
-	MidHeaderRewrite     string                 `json:"midHeaderRewrite"`
-	MissLat              float64                `json:"missLat"`
-	MissLong             float64                `json:"missLong"`
-	MultiSiteOrigin      bool                   `json:"multiSiteOrigin"`
-	OrgServerFQDN        string                 `json:"orgServerFqdn"`
-	ProfileDesc          string                 `json:"profileDescription"`
-	ProfileID            int                    `json:"profileId,omitempty"`
-	ProfileName          string                 `json:"profileName"`
-	Protocol             int                    `json:"protocol"`
-	QStringIgnore        int                    `json:"qstringIgnore"`
-	RangeRequestHandling int                    `json:"rangeRequestHandling"`
-	RegexRemap           string                 `json:"regexRemap"`
-	RegionalGeoBlocking  bool                   `json:"regionalGeoBlocking"`
-	RemapText            string                 `json:"remapText"`
-	RoutingName          string                 `json:"routingName"`
-	SigningAlgorithm     string                 `json:"signingAlgorithm" db:"signing_algorithm"`
-	TypeID               int                    `json:"typeId"`
-	Type                 string                 `json:"type"`
-	TRResponseHeaders    string                 `json:"trResponseHeaders"`
-	TenantID             int                    `json:"tenantId,omitempty"`
-	XMLID                string                 `json:"xmlId"`
+	Active                   bool                   `json:"active"`
+	AnonymousBlockingEnabled bool                   `json:"anonymousBlockingEnabled"`
+	CacheURL                 string                 `json:"cacheurl"`
+	CCRDNSTTL                int                    `json:"ccrDnsTtl"`
+	CDNID                    int                    `json:"cdnId"`
+	CDNName                  string                 `json:"cdnName"`
+	CheckPath                string                 `json:"checkPath"`
+	DeepCachingType          DeepCachingType        `json:"deepCachingType"`
+	DisplayName              string                 `json:"displayName"`
+	DNSBypassCname           string                 `json:"dnsBypassCname"`
+	DNSBypassIP              string                 `json:"dnsBypassIp"`
+	DNSBypassIP6             string                 `json:"dnsBypassIp6"`
+	DNSBypassTTL             int                    `json:"dnsBypassTtl"`
+	DSCP                     int                    `json:"dscp"`
+	EdgeHeaderRewrite        string                 `json:"edgeHeaderRewrite"`
+	ExampleURLs              []string               `json:"exampleURLs"`
+	GeoLimit                 int                    `json:"geoLimit"`
+	FQPacingRate             int                    `json:"fqPacingRate"`
+	GeoProvider              int                    `json:"geoProvider"`
+	GlobalMaxMBPS            int                    `json:"globalMaxMbps"`
+	GlobalMaxTPS             int                    `json:"globalMaxTps"`
+	HTTPBypassFQDN           string                 `json:"httpBypassFqdn"`
+	ID                       int                    `json:"id"`
+	InfoURL                  string                 `json:"infoUrl"`
+	InitialDispersion        float32                `json:"initialDispersion"`
+	IPV6RoutingEnabled       bool                   `json:"ipv6RoutingEnabled"`
+	LastUpdated              *TimeNoMod             `json:"lastUpdated" db:"last_updated"`
+	LogsEnabled              bool                   `json:"logsEnabled"`
+	LongDesc                 string                 `json:"longDesc"`
+	LongDesc1                string                 `json:"longDesc1"`
+	LongDesc2                string                 `json:"longDesc2"`
+	MatchList                []DeliveryServiceMatch `json:"matchList,omitempty"`
+	MaxDNSAnswers            int                    `json:"maxDnsAnswers"`
+	MidHeaderRewrite         string                 `json:"midHeaderRewrite"`
+	MissLat                  float64                `json:"missLat"`
+	MissLong                 float64                `json:"missLong"`
+	MultiSiteOrigin          bool                   `json:"multiSiteOrigin"`
+	OrgServerFQDN            string                 `json:"orgServerFqdn"`
+	ProfileDesc              string                 `json:"profileDescription"`
+	ProfileID                int                    `json:"profileId,omitempty"`
+	ProfileName              string                 `json:"profileName"`
+	Protocol                 int                    `json:"protocol"`
+	QStringIgnore            int                    `json:"qstringIgnore"`
+	RangeRequestHandling     int                    `json:"rangeRequestHandling"`
+	RegexRemap               string                 `json:"regexRemap"`
+	RegionalGeoBlocking      bool                   `json:"regionalGeoBlocking"`
+	RemapText                string                 `json:"remapText"`
+	RoutingName              string                 `json:"routingName"`
+	SigningAlgorithm         string                 `json:"signingAlgorithm" db:"signing_algorithm"`
+	TypeID                   int                    `json:"typeId"`
+	Type                     string                 `json:"type"`
+	TRResponseHeaders        string                 `json:"trResponseHeaders"`
+	TenantID                 int                    `json:"tenantId,omitempty"`
+	XMLID                    string                 `json:"xmlId"`
 }
 
 // DeliveryServiceNullable - a version of the deliveryservice that allows for all fields to be null
@@ -117,6 +118,7 @@ type DeliveryServiceNullable struct {
 	// NOTE: the db: struct tags are used for testing to map to their equivalent database column (if there is one)
 	//
 	Active                   *bool                   `json:"active" db:"active"`
+	AnonymousBlockingEnabled *bool                   `json:"anonymousBlockingEnabled" db:"anonymous_blocking_enabled"`
 	CacheURL                 *string                 `json:"cacheurl" db:"cacheurl"`
 	CCRDNSTTL                *int                    `json:"ccrDnsTtl" db:"ccr_dns_ttl"`
 	CDNID                    *int                    `json:"cdnId" db:"cdn_id"`
@@ -281,17 +283,4 @@ type DeliveryServiceRouting struct {
 	RegionalDenied    int     `json:"regionalDenied"`
 }
 
-// DeliveryServiceServerResponse ...
-type DeliveryServiceServerResponse struct {
-	Response []DeliveryServiceServer `json:"response"`
-	Size     int                     `json:"size"`
-	OrderBy  string                  `json:"orderby"`
-	Limit    int                     `json:"limit"`
-}
 
-// DeliveryServiceServer ...
-type DeliveryServiceServer struct {
-	LastUpdated     string `json:"lastUpdated"`
-	Server          int    `json:"server"`
-	DeliveryService int    `json:"deliveryService"`
-}
diff --git a/lib/go-tc/v13/coordinates.go b/lib/go-tc/v13/coordinates.go
new file mode 100644
index 000000000..bb669821b
--- /dev/null
+++ b/lib/go-tc/v13/coordinates.go
@@ -0,0 +1,98 @@
+package v13
+
+import tc "github.com/apache/incubator-trafficcontrol/lib/go-tc"
+
+/*
+ * 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.
+ */
+
+// A List of Coordinates Response
+// swagger:response CoordinatesResponse
+// in: body
+type CoordinatesResponse struct {
+	// in: body
+	Response []Coordinate `json:"response"`
+}
+
+// A Single Coordinate Response for Update and Create to depict what changed
+// swagger:response CoordinateResponse
+// in: body
+type CoordinateResponse struct {
+	// in: body
+	Response Coordinate `json:"response"`
+}
+
+// Coordinate ...
+type Coordinate struct {
+
+	// The Coordinate to retrieve
+	//
+	// ID of the Coordinate
+	//
+	// required: true
+	ID int `json:"id" db:"id"`
+
+	// Name of the Coordinate
+	//
+	// required: true
+	Name string `json:"name" db:"name"`
+
+	// the latitude of the Coordinate
+	//
+	// required: true
+	Latitude float64 `json:"latitude" db:"latitude"`
+
+	// the latitude of the Coordinate
+	//
+	// required: true
+	Longitude float64 `json:"longitude" db:"longitude"`
+
+	// LastUpdated
+	//
+	LastUpdated tc.TimeNoMod `json:"lastUpdated" db:"last_updated"`
+}
+
+// CoordinateNullable ...
+type CoordinateNullable struct {
+
+	// The Coordinate to retrieve
+	//
+	// ID of the Coordinate
+	//
+	// required: true
+	ID *int `json:"id" db:"id"`
+
+	// Name of the Coordinate
+	//
+	// required: true
+	Name *string `json:"name" db:"name"`
+
+	// the latitude of the Coordinate
+	//
+	// required: true
+	Latitude *float64 `json:"latitude" db:"latitude"`
+
+	// the latitude of the Coordinate
+	//
+	// required: true
+	Longitude *float64 `json:"longitude" db:"longitude"`
+
+	// LastUpdated
+	//
+	LastUpdated *tc.TimeNoMod `json:"lastUpdated" db:"last_updated"`
+}
diff --git a/traffic_control/clients/README.md b/traffic_control/clients/README.md
new file mode 100644
index 000000000..29a759503
--- /dev/null
+++ b/traffic_control/clients/README.md
@@ -0,0 +1,18 @@
+# TrafficOps Native Client Libraries
+
+There are two client libraries supported:
+
+## Python
+* Supported TO API Versions
+  * 1.1
+  * 1.2
+* Documentation
+  * https://github.com/apache/incubator-trafficcontrol/tree/master/traffic_control/clients/python/trafficops
+
+## Golang
+### TO API v1.2 _(Deprecated)_
+* Documentation
+  * https://github.com/apache/incubator-trafficcontrol/tree/master/traffic_ops/client
+###TO API v1.3
+* Documentation
+  * https://github.com/apache/incubator-trafficcontrol/tree/master/traffic_ops/client/v13
diff --git a/traffic_monitor/README.md b/traffic_monitor/README.md
index 835ac1d53..9f6fe7b97 100644
--- a/traffic_monitor/README.md
+++ b/traffic_monitor/README.md
@@ -17,4 +17,4 @@
     under the License.
 -->
 
-To run: `./build.sh && traffic_monitor --opsCfg ./traffic_ops.cfg -config ./traffic_monitor-example-config.json`
+To run: `./build.sh && traffic_monitor --opsCfg ./conf/traffic_ops.cfg -config ./conf/traffic_monitor.cfg`
diff --git a/traffic_monitor/conf/traffic_ops.cfg b/traffic_monitor/conf/traffic_ops.cfg
index b5fcf83bd..43494c9f5 100644
--- a/traffic_monitor/conf/traffic_ops.cfg
+++ b/traffic_monitor/conf/traffic_ops.cfg
@@ -4,5 +4,5 @@
 	"url": "https://traffic-ops.example.net",
 	"insecure": true,
 	"cdnName": "cdn",
-	"httpListener": ":8080"
+	"httpListener": ":80"
 }
diff --git a/traffic_ops/app/db/adduser.pl b/traffic_ops/app/db/adduser.pl
new file mode 100755
index 000000000..c8d68e1fa
--- /dev/null
+++ b/traffic_ops/app/db/adduser.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/env perl
+#
+#
+# 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.
+#
+
+use strict;
+use Crypt::ScryptKDF qw{ scrypt_hash };
+
+if ($#ARGV < 2) {
+    die "Usage: $ARGV[0] <username> <password> <role>\n";
+}
+
+my $username = shift // 'admin';
+my $password = shift or die "Password is required\n";
+my $role = shift // 'admin';
+
+# Skip the insert if the admin 'username' is already there.
+my $hashed_passwd = hash_pass( $password );
+print <<"ADMIN";
+insert into tm_user (username, role, local_passwd, confirm_local_passwd)
+    values  ('$username',
+            (select id from role where name = '$role'),
+            '$hashed_passwd',
+            '$hashed_passwd' )
+    ON CONFLICT (username) DO NOTHING;
+ADMIN
+
+sub hash_pass {
+    my $pass = shift;
+    return scrypt_hash($pass, \64, 16384, 8, 1, 64);
+}
diff --git a/traffic_ops/app/db/migrations/20180420000000_add_coordinate.sql b/traffic_ops/app/db/migrations/20180420000000_add_coordinate.sql
new file mode 100644
index 000000000..89a0f6657
--- /dev/null
+++ b/traffic_ops/app/db/migrations/20180420000000_add_coordinate.sql
@@ -0,0 +1,31 @@
+/*
+
+    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.
+*/
+
+-- +goose Up
+-- SQL in section 'Up' is executed when this migration is applied
+
+CREATE TABLE coordinate (
+    id bigserial primary key NOT NULL,
+    name text UNIQUE NOT NULL,
+    latitude numeric NOT NULL DEFAULT 0.0,
+    longitude numeric NOT NULL DEFAULT 0.0,
+    last_updated timestamp WITH time zone NOT NULL DEFAULT now()
+);
+
+CREATE TRIGGER on_update_current_timestamp BEFORE UPDATE ON coordinate FOR EACH ROW EXECUTE PROCEDURE on_update_current_timestamp_last_updated();
+
+-- +goose Down
+-- SQL section 'Down' is executed when this migration is rolled back
+DROP TABLE coordinate;
diff --git a/traffic_ops/app/db/migrations/20180514000000_add_anonymous_blocking.sql b/traffic_ops/app/db/migrations/20180514000000_add_anonymous_blocking.sql
new file mode 100644
index 000000000..afabe9d1d
--- /dev/null
+++ b/traffic_ops/app/db/migrations/20180514000000_add_anonymous_blocking.sql
@@ -0,0 +1,19 @@
+/*
+  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.
+*/
+
+-- +goose Up
+-- SQL in section 'Up' is executed when this migration is applied
+alter table deliveryservice add column anonymous_blocking_enabled boolean NOT NULL default FALSE;
+
+-- +goose Down
+-- SQL section 'Down' is executed when this migration is rolled back
+alter table deliveryservice drop column anonymous_blocking_enabled;
diff --git a/traffic_ops/app/lib/API/Deliveryservice.pm b/traffic_ops/app/lib/API/Deliveryservice.pm
index 99a3b20f2..9793e2573 100644
--- a/traffic_ops/app/lib/API/Deliveryservice.pm
+++ b/traffic_ops/app/lib/API/Deliveryservice.pm
@@ -101,6 +101,7 @@ sub index {
 		push(
 			@data, {
 				"active"               => \$row->active,
+				"anonymousBlockingEnabled" => \$row->anonymous_blocking_enabled,
 				"cacheurl"             => $row->cacheurl,
 				"ccrDnsTtl"            => $row->ccr_dns_ttl,
 				"cdnId"                => $row->cdn->id,
@@ -223,6 +224,7 @@ sub show {
 		push(
 			@data, {
 				"active"               => \$row->active,
+				"anonymousBlockingEnabled" => \$row->anonymous_blocking_enabled,
 				"cacheurl"             => $row->cacheurl,
 				"ccrDnsTtl"            => $row->ccr_dns_ttl,
 				"cdnId"                => $row->cdn->id,
@@ -341,6 +343,7 @@ sub update {
 
 	my $values = {
 		active                 => $params->{active},
+		anonymous_blocking_enabled => $params->{anonymousBlockingEnabled},
 		cacheurl               => $params->{cacheurl},
 		ccr_dns_ttl            => $params->{ccrDnsTtl},
 		cdn_id                 => $params->{cdnId},
@@ -439,6 +442,7 @@ sub update {
 		push(
 			@response, {
 				"active"                   => $rs->active,
+				"anonymousBlockingEnabled" => $rs->anonymous_blocking_enabled,
 				"cacheurl"                 => $rs->cacheurl,
 				"ccrDnsTtl"                => $rs->ccr_dns_ttl,
 				"cdnId"                    => $rs->cdn->id,
@@ -572,6 +576,7 @@ sub safe_update {
 		push(
 			@response, {
 				"active"                   => $rs->active,
+				"anonymousBlockingEnabled" => $rs->anonymous_blocking_enabled,
 				"cacheurl"                 => $rs->cacheurl,
 				"ccrDnsTtl"                => $rs->ccr_dns_ttl,
 				"cdnId"                    => $rs->cdn->id,
@@ -681,6 +686,7 @@ sub create {
 
 	my $values = {
 		active                 => $params->{active},
+		anonymous_blocking_enabled => $params->{anonymousBlockingEnabled},
 		cacheurl               => $params->{cacheurl},
 		ccr_dns_ttl            => $params->{ccrDnsTtl},
 		cdn_id                 => $params->{cdnId},
@@ -790,6 +796,7 @@ sub create {
 		push(
 			@response, {
 				"active"                   => $insert->active,
+				"anonymousBlockingEnabled" => $insert->anonymous_blocking_enabled,
 				"cacheurl"                 => $insert->cacheurl,
 				"ccrDnsTtl"                => $insert->ccr_dns_ttl,
 				"cdnId"                    => $insert->cdn->id,
@@ -984,6 +991,7 @@ sub get_deliveryservices_by_serverId {
 			push(
 				@data, {
 					"active"               => \$row->active,
+					"anonymousBlockingEnabled" => \$row->anonymous_blocking_enabled,
 					"cacheurl"             => $row->cacheurl,
 					"ccrDnsTtl"            => $row->ccr_dns_ttl,
 					"cdnId"                => $row->cdn->id,
@@ -1084,6 +1092,7 @@ sub get_deliveryservices_by_userId {
 			push(
 				@data, {
 					"active"               => \$row->active,
+					"anonymousBlockingEnabled" => \$row->anonymous_blocking_enabled,
 					"cacheurl"             => $row->cacheurl,
 					"ccrDnsTtl"            => $row->ccr_dns_ttl,
 					"cdnId"                => $row->cdn->id,
diff --git a/traffic_ops/app/lib/Fixtures/Deliveryservice.pm b/traffic_ops/app/lib/Fixtures/Deliveryservice.pm
index 7adbea790..b85893282 100644
--- a/traffic_ops/app/lib/Fixtures/Deliveryservice.pm
+++ b/traffic_ops/app/lib/Fixtures/Deliveryservice.pm
@@ -58,6 +58,7 @@ my %definition_for = (
 			initial_dispersion    => 1,
 			regional_geo_blocking => 1,
 			logs_enabled          => 1,
+			anonymous_blocking_enabled => 1,
 		},
 	},
 	ds_cdn2 => {
@@ -99,6 +100,7 @@ my %definition_for = (
 			regional_geo_blocking => 0,
 			ipv6_routing_enabled  => 0,
 			logs_enabled          => 0,
+			anonymous_blocking_enabled => 0,
 		},
 	},
 	ds_cdn3 => {
@@ -140,6 +142,7 @@ my %definition_for = (
 			regional_geo_blocking => 0,
 			ipv6_routing_enabled  => 0,
 			logs_enabled          => 0,
+			anonymous_blocking_enabled => 0,
 		},
 	},
 	ds_cdn4 => {
@@ -181,6 +184,7 @@ my %definition_for = (
 			regional_geo_blocking => 0,
 			ipv6_routing_enabled  => 0,
 			logs_enabled          => 1,
+			anonymous_blocking_enabled => 0,
 		},
 	},
 	ds_dns => {
@@ -222,6 +226,7 @@ my %definition_for = (
 			regional_geo_blocking => 0,
 			ipv6_routing_enabled  => 0,
 			logs_enabled          => 0,
+			anonymous_blocking_enabled => 0,
 		},
 	},
 	ds_http_no_cache => {
@@ -263,6 +268,7 @@ my %definition_for = (
 			regional_geo_blocking => 0,
 			ipv6_routing_enabled  => 0,
 			logs_enabled          => 0,
+			anonymous_blocking_enabled => 0,
 		},
 	},
 	steering_ds1 => {
diff --git a/traffic_ops/app/lib/Schema/Result/DeliveryServiceInfoForDomainList.pm b/traffic_ops/app/lib/Schema/Result/DeliveryServiceInfoForDomainList.pm
index fe37913a9..bb0f2310b 100644
--- a/traffic_ops/app/lib/Schema/Result/DeliveryServiceInfoForDomainList.pm
+++ b/traffic_ops/app/lib/Schema/Result/DeliveryServiceInfoForDomainList.pm
@@ -61,7 +61,8 @@ SELECT
     deliveryservice.cacheurl,
     deliveryservice.remap_text,
     deliveryservice.protocol,
-    deliveryservice.profile
+    deliveryservice.profile,
+    deliveryservice.anonymous_blocking_enabled
 FROM
     deliveryservice
     JOIN deliveryservice_regex ON deliveryservice_regex.deliveryservice = deliveryservice.id
@@ -106,6 +107,7 @@ __PACKAGE__->add_columns(
 	"fq_pacing_rate",              { data_type => "bigint",  is_nullable => 0 },   
 	"origin_shield",               { data_type => "varchar", is_nullable => 0, size => 1024 },
 	"profile",                     { data_type => "integer", is_nullable => 1},
+    "anonymous_blocking_enabled",  { data_type => "boolean", is_nullable => 0 },
 );
 
 1;
diff --git a/traffic_ops/app/lib/Schema/Result/DeliveryServiceInfoForServerList.pm b/traffic_ops/app/lib/Schema/Result/DeliveryServiceInfoForServerList.pm
index 2d84155f2..f190d3341 100644
--- a/traffic_ops/app/lib/Schema/Result/DeliveryServiceInfoForServerList.pm
+++ b/traffic_ops/app/lib/Schema/Result/DeliveryServiceInfoForServerList.pm
@@ -61,7 +61,8 @@ SELECT
     deliveryservice.remap_text as remap_text,
     mid_header_rewrite as mid_header_rewrite,
     deliveryservice.protocol as protocol,
-    deliveryservice.profile as profile
+    deliveryservice.profile as profile,
+    deliveryservice.anonymous_blocking_enabled as anonymous_blocking_enabled
 FROM
     deliveryservice
         JOIN deliveryservice_regex ON deliveryservice_regex.deliveryservice = deliveryservice.id
@@ -99,6 +100,7 @@ __PACKAGE__->add_columns(
         "fq_pacing_rate",              { data_type => "bigint",  is_nullable => 0},
 	"origin_shield",               { data_type => "varchar", is_nullable => 0, size => 1024 },
 	"profile",                     { data_type => "integer", is_nullable => 1},
+    "anonymous_blocking_enabled",  { data_type => "boolean", is_nullable => 0 },
 );
 
 1;
diff --git a/traffic_ops/app/lib/Schema/Result/Deliveryservice.pm b/traffic_ops/app/lib/Schema/Result/Deliveryservice.pm
index f37e41565..dab1cce37 100644
--- a/traffic_ops/app/lib/Schema/Result/Deliveryservice.pm
+++ b/traffic_ops/app/lib/Schema/Result/Deliveryservice.pm
@@ -41,6 +41,11 @@ __PACKAGE__->table("deliveryservice");
   default_value: false
   is_nullable: 0
 
+=head2 anonymous_blocking_enabled
+  data_type: 'boolean'
+  default_value: false
+  is_nullable: 0
+
 =head2 dscp
 
   data_type: 'bigint'
@@ -326,6 +331,8 @@ __PACKAGE__->add_columns(
   { data_type => "text", is_nullable => 0 },
   "active",
   { data_type => "boolean", default_value => \"false", is_nullable => 0 },
+  "anonymous_blocking_enabled",
+  { data_type => "boolean", default_value => \"false", is_nullable => 0 },
   "dscp",
   { data_type => "bigint", is_nullable => 0 },
   "signing_algorithm",
diff --git a/traffic_ops/app/lib/UI/DeliveryService.pm b/traffic_ops/app/lib/UI/DeliveryService.pm
index 4443349f8..a7e45a371 100644
--- a/traffic_ops/app/lib/UI/DeliveryService.pm
+++ b/traffic_ops/app/lib/UI/DeliveryService.pm
@@ -257,6 +257,7 @@ sub read {
 				"regional_geo_blocking"       => $row->regional_geo_blocking,
 				"logs_enabled"                => \$row->logs_enabled,
 				"deep_caching_type"           => $row->deep_caching_type,
+				"anonymous_blocking_enabled"  => $row->anonymous_blocking_enabled,
 			}
 		);
 	}
@@ -846,6 +847,7 @@ sub update {
 			initial_dispersion => $self->paramAsScalar( 'ds.initial_dispersion', 1 ),
 			logs_enabled       => $self->paramAsScalar('ds.logs_enabled'),
 			deep_caching_type  => $self->paramAsScalar('ds.deep_caching_type'),
+			anonymous_blocking_enabled => $self->paramAsScalar('ds.anonymous_blocking_enabled'),
 		);
 
 		my $typename = $self->typename();
@@ -1088,6 +1090,7 @@ sub create {
 				logs_enabled       => $self->paramAsScalar('ds.logs_enabled'),
 				tenant_id => $tenant_id,
 				deep_caching_type  => $self->paramAsScalar('ds.deep_caching_type'),
+				anonymous_blocking_enabled => $self->paramAsScalar('ds.anonymous_blocking_enabled'),
 		};
 
 		my $insert = $self->db->resultset('Deliveryservice')->create($new_ds);
diff --git a/traffic_ops/app/lib/UI/Topology.pm b/traffic_ops/app/lib/UI/Topology.pm
index ee0e750f7..987fe5bd3 100644
--- a/traffic_ops/app/lib/UI/Topology.pm
+++ b/traffic_ops/app/lib/UI/Topology.pm
@@ -493,6 +493,7 @@ sub gen_crconfig_json {
             }
 
             $data_obj->{'deliveryServices'}->{ $row->xml_id }->{'regionalGeoBlocking'} = $row->regional_geo_blocking ? 'true' : 'false';
+            $data_obj->{'deliveryServices'}->{ $row->xml_id }->{'anonymousBlockingEnabled'} = $row->anonymous_blocking_enabled ? 'true' : 'false';
 
             if ( defined($row->geo_limit) && $row->geo_limit ne 0 ) {
                 $data_obj->{'deliveryServices'}->{ $row->xml_id }->{'geoLimitRedirectURL'} =
@@ -774,6 +775,9 @@ sub stringify_ds {
     if ( defined( $ds->{'regionalGeoBlocking'} ) ) {
         $string .= "|Regional_Geoblocking:" . $ds->{'regionalGeoBlocking'};
     }
+    if ( defined( $ds->{'anonymousBlockingEnabled'} ) ) {
+        $string .= "|Anonymous_Blocking:" . $ds->{'anonymousBlockingEnabled'};
+    }
     if ( defined( $ds->{'geoLimitRedirectURL'}) ) {
 		$string .= "|Geolimit_Redirect_URL:" . $ds->{'geoLimitRedirectURL'};
 	}
diff --git a/traffic_ops/app/t/api/1.2/deliveryservice.t b/traffic_ops/app/t/api/1.2/deliveryservice.t
index c34eb7630..f79abecb2 100644
--- a/traffic_ops/app/t/api/1.2/deliveryservice.t
+++ b/traffic_ops/app/t/api/1.2/deliveryservice.t
@@ -163,6 +163,7 @@ ok $t->get_ok("/api/1.2/deliveryservices?logsEnabled=true")->status_is(200)->or(
 				"typeId" => 36,
 				"tenantId" => $tenant_id,
 				"xmlId" => "ds_http",
+				"anonymousBlockingEnabled" => 1,
 			})->status_is(200)->or( sub { diag $t->tx->res->content->asset->{content}; } )
 			->json_is( "/response/0/active" => 0)
 			->json_is( "/response/0/tenantId" => $tenant_id)
@@ -174,6 +175,7 @@ ok $t->get_ok("/api/1.2/deliveryservices?logsEnabled=true")->status_is(200)->or(
 			->json_is( "/response/0/orgServerFqdn" => "http://10.75.168.91")
 			->json_is( "/response/0/protocol" => 1)
 			->json_is( "/response/0/type" => "HTTP")
+			->json_is( "/response/0/anonymousBlockingEnabled" => 1)
 		, 'Is the HTTP delivery service created?';
 
 	ok $t->post_ok('/api/1.2/deliveryservices' => {Accept => 'application/json'} => json => {
diff --git a/traffic_ops/app/t/deliveryservice.t b/traffic_ops/app/t/deliveryservice.t
index 5e017dc10..b0f643cfe 100644
--- a/traffic_ops/app/t/deliveryservice.t
+++ b/traffic_ops/app/t/deliveryservice.t
@@ -99,6 +99,7 @@ ok $t->post_ok(
 		'ds.display_name'                => 'display name 1',
 		'ds.regional_geo_blocking'       => '1',
 		'ds.geolimit_redirect_url'       => '',
+		'ds.anonymous_blocking_enabled'  => '0',
 	}
 )->status_is(302), "create HTTP delivery service";
 my $t1_id = &get_ds_id('tst_xml_id_1');
@@ -151,6 +152,7 @@ ok $t->post_ok(
 		'ds.display_name'                => 'display name 2',
 		'ds.regional_geo_blocking'       => '0',
 		'ds.geolimit_redirect_url'       => '',
+		'ds.anonymous_blocking_enabled'  => '1',
 	}
 )->status_is(302), "create DNS DeliveryService";
 $t2_id = &get_ds_id('tst_xml_id_2');
@@ -206,6 +208,7 @@ ok $t->post_ok(
 		'ds.display_name'                => 'display name 3',
 		'ds.regional_geo_blocking'       => '0',
 		'ds.geolimit_redirect_url'       => 'http://knutsel3.com',
+		'ds.anonymous_blocking_enabled'  => '0',
 	}
 )->status_is(302), "create HTTP_NO_CACHE deliveryservice";
 
@@ -230,7 +233,9 @@ ok $t->get_ok('/datadeliveryservice')->
 	->json_is( '/0/display_name' => 'display name 1' )
 	->json_is( '/0/regional_geo_blocking' => '1' )
 	->json_is( '/0/regional_geo_blocking' => '1' )
-	->json_is( '/1/regional_geo_blocking' => '0' ),
+	->json_is( '/1/regional_geo_blocking' => '0' )
+	->json_is( '/0/anonymous_blocking_enabled' => '0' )
+	->json_is( '/1/anonymous_blocking_enabled' => '1' ),
 	"validate delivery services were created";
 
 $t2_id = &get_ds_id('tst_xml_id_2');
diff --git a/traffic_ops/app/t_integration/configfiles.t b/traffic_ops/app/t_integration/configfiles.t
index c762f636a..0266faff7 100644
--- a/traffic_ops/app/t_integration/configfiles.t
+++ b/traffic_ops/app/t_integration/configfiles.t
@@ -66,12 +66,6 @@ foreach my $server ( @{ $servers->{response} } ) {
 			$t->get_ok($path)->status_is(200)->or( sub { diag $t->tx->res->content->asset->{content}; } );
 		}
 	}
-	elsif ( $server->{type} eq 'CCR' || $server->{type} eq 'RASCAL' ) {
-		my $cdn_name = $files->{other}->{CDN_name};
-		my $path     = '/tools/write_crconfig/' . $cdn_name;
-		$t->get_ok($path)->status_is(302)->or( sub { diag $t->tx->res->content->asset->{content}; } );
-	}
-
 }
 
 done_testing();
diff --git a/traffic_ops/app/templates/delivery_service/_form.html.ep b/traffic_ops/app/templates/delivery_service/_form.html.ep
index 86def8dd8..35b72a59c 100644
--- a/traffic_ops/app/templates/delivery_service/_form.html.ep
+++ b/traffic_ops/app/templates/delivery_service/_form.html.ep
@@ -598,6 +598,21 @@
 			<% } %>
         <% } %>
 	</div>
+	<div class="block form-row" id='anonymous_blocking_enabled_row'>
+		<% unless (field('ds.anonymous_blocking_enabled')->valid) { %>
+			<span class="field-with-error"><%= field('ds.anonymous_blocking_enabled')->error %></span>
+		<% } %>
+		%= label_for 'anonymous_blocking_enabled' => 'Anonymous Blocking', class => 'label'
+		<% if ($priv_level >= 20) { %>
+			%= field('ds.anonymous_blocking_enabled')->select([ [Disabled => 0], [Enabled => 1]]);
+		<% } else { %>
+			<% if ($ds->anonymous_blocking_enabled == 0) { %>
+				%= field('ds.anonymous_blocking_enabled')->text(class => 'field', value =>  'Disabled', readonly => 'readonly');
+			<% } else { %>
+				%= field('ds.anonymous_blocking_enabled')->text(class => 'field', value =>  'Enabled', readonly => 'readonly');
+			<% } %>
+		<% } %>
+  </div>
 	<div class="block form-row" id="active_row">
 		<% unless (field('ds.active')->valid) { %>
 			<span class="field-with-error"><%= field('ds.active')->error %></span>
diff --git a/traffic_ops/app/templates/delivery_service/add.html.ep b/traffic_ops/app/templates/delivery_service/add.html.ep
index e6cc5d81a..bb8521b6a 100644
--- a/traffic_ops/app/templates/delivery_service/add.html.ep
+++ b/traffic_ops/app/templates/delivery_service/add.html.ep
@@ -143,6 +143,7 @@
             $('#regexp_add').show(speed);
             $('#geo_limit_countries_row').show(speed);
             check_geolimit_redirect_url_row_showhide(1, speed);
+            $('#anonymous_blocking_enabled_row').show(speed);
 		}
 		else if (type_selected.match(/^DNS/)) {
 			$("#regexp_selector :nth-child(3)").attr('disabled','disabled');
@@ -186,6 +187,7 @@
             $('#regexp_add').show(speed);
             $('#geo_limit_countries_row').show(speed);
             check_geolimit_redirect_url_row_showhide(0, speed);
+            $('#anonymous_blocking_enabled_row').show(speed);
 		}
 		else if (type_selected.match(/^ANY_MAP$/)) {
             $('#protocoli_row').hide(speed);
@@ -226,6 +228,7 @@
             $('#remap_text_row').show(speed);
             $('#regexp_add').show(speed);
             $('#geo_limit_countries_row').show(speed);
+            $('#anonymous_blocking_enabled_row').hide(speed);
 		}
 		else if (type_selected.match(/STEERING$/)) {
             $('#protocoli_row').show(speed);
@@ -272,6 +275,7 @@
             $('#regexp_add').hide(speed);
             $('#geo_limit_countries_row').show(speed);
             check_geolimit_redirect_url_row_showhide(0, speed);
+            $('#anonymous_blocking_enabled_row').hide(speed);
 		}
 		//
 	}
diff --git a/traffic_ops/app/templates/delivery_service/edit.html.ep b/traffic_ops/app/templates/delivery_service/edit.html.ep
index 0c5114586..452a56f61 100644
--- a/traffic_ops/app/templates/delivery_service/edit.html.ep
+++ b/traffic_ops/app/templates/delivery_service/edit.html.ep
@@ -236,6 +236,7 @@ function setup_form(speed) {
             $('#regexp_add').show(speed);
             $('#steering_button').hide(speed);
 	    check_geolimit_redirect_url_row_showhide(1, speed);
+            $('#anonymous_blocking_enabled_row').show(speed);
 		}
 		else if (type_selected.match(/^DNS/)) {
 			$("#regexp_selector :nth-child(3)").attr('disabled','disabled');
@@ -278,6 +279,7 @@ function setup_form(speed) {
             $('#regexp_add').show(speed);
             $('#steering_button').hide(speed);
 	    $('#geolimit_redirect_url_row').hide(speed);
+            $('#anonymous_blocking_enabled_row').hide(speed);
 		}
 		else if (type_selected.match(/^ANY_MAP$/)) {
             $('#protocoli_row').hide(speed);
@@ -318,6 +320,7 @@ function setup_form(speed) {
             $('#regional_geo_blocking_row').show(speed);
             $('#regexp_add').show(speed);
             $('#steering_button').hide(speed);
+            $('#anonymous_blocking_enabled_row').hide(speed);
 		}
 		else if (type_selected.match(/STEERING$/)) {
             $('#protocoli_row').show(speed);
@@ -366,6 +369,7 @@ function setup_form(speed) {
             $('#server_assignment_button').hide(speed);
             $('#steering_button').show(speed);
             $('#geo_limit_countries_row').show(speed);
+            $('#anonymous_blocking_enabled_row').hide(speed);
 		}
 		//
 	}
diff --git a/traffic_ops/bin/traffic_ops_ort.pl b/traffic_ops/bin/traffic_ops_ort.pl
index 00ced01bb..a75326009 100755
--- a/traffic_ops/bin/traffic_ops_ort.pl
+++ b/traffic_ops/bin/traffic_ops_ort.pl
@@ -788,12 +788,24 @@ sub get_update_status {
 
 	##Some versions of Traffic Ops had the 1.3 API but did not have the use_reval_pending field.  If this field is not present, exit.
 	if ( !defined( $upd_json->[0]->{'use_reval_pending'} ) ) {
-		( $log_level >> $ERROR ) && printf("ERROR ORT version incompatible with current version of Traffic Ops. Please upgrade to Traffic Ops 2.2.\n");
-		exit 1;
+		my $info_uri = "/api/1.2/system/info.json";
+		my $info_ref = &lwp_get($info_uri);
+		if ($info_ref eq '404') {
+			( $log_level >> $ERROR ) && printf("ERROR Unable to get status of use_reval_pending parameter.  Stopping.\n");
+			exit 1;
+		}
+		if ( $info_ref =~ m/^\d{3}$/ ) {
+			( $log_level >> $ERROR ) && print "ERROR Update URL: $info_uri returned $info_ref. Exiting, not sure what else to do.\n";
+			exit 1;
+		}
+		my $info_json = decode_json($info_ref);
+		if (defined( $info_json->{'response'}->{'parameters'}->{'use_reval_pending'} ) ) {
+			$reval_in_use = $info_json->{'response'}->{'parameters'}->{'use_reval_pending'};
+		}
+	}
+	else {
+		$reval_in_use = $upd_json->[0]->{'use_reval_pending'};
 	}
-
-	$reval_in_use = $upd_json->[0]->{'use_reval_pending'};
-	
 	return ($upd_json, $uri);
 }
 
@@ -1280,8 +1292,9 @@ sub check_plugins {
 					{
 						($plugin_config_file) = split( /\s+/, $plugin_config_file);
 
-						# Skip parameters that start with '-', since those are probabably parameters, not config files.
+						# Skip parameters that start with '-' or 'proxy.config.', since those are probabably parameters, not config files.
 						last if $plugin_config_file =~ m/^-/; # Exit subblock.
+						last if $plugin_config_file =~ m/^proxy.config./;
 
 						( my @parts ) = split( /\//, $plugin_config_file );
 						$plugin_config_file = $parts[$#parts];
@@ -2552,10 +2565,6 @@ sub set_uri {
 		$URI = $cfg_file_tracker->{$filename}->{'url'};
 		( $log_level >> $DEBUG ) && print "DEBUG Setting external download URL.\n";
 	}
-	else {
-		( $log_level >> $ERROR ) && print "ERROR Configuration File API not found!  Please upgrade to Traffic Ops 2.2.  Unable to continue.\n";
-		exit 1;
-	}
 
 	return if (!defined($cfg_file_tracker->{$filename}->{'fname-in-TO'}));
 
@@ -2642,7 +2651,7 @@ sub open_file_get_contents {
 		chomp($line);
 		( $log_level >> $TRACE ) && print "TRACE Line from cfg file on disk:\t$line.\n";
 		if ( $line =~ m/^\#/ || $line =~ m/^$/ ) {
-			if ( ( $line !~ m/DO NOT EDIT - Generated for / && $line !~ m/$header_comment/ ) && $line !~ m/12M NOTE\:/ ) {
+			if ( ( $line !~ m/DO NOT EDIT - Generated for / && $line !~ m/$header_comment/ ) && $line !~ m/TRAFFIC OPS NOTE\:/ ) {
 				next;
 			}
 		}
@@ -2701,10 +2710,10 @@ sub diff_file_lines {
 					}
 				}
 			}
-			elsif ( ( $line =~ m/DO NOT EDIT - Generated for / && $line =~ m/$header_comment/ ) || $line =~ m/12M NOTE\:/ ) {
+			elsif ( ( $line =~ m/DO NOT EDIT - Generated for / && $line =~ m/$header_comment/ ) || $line =~ m/TRAFFIC OPS NOTE\:/ ) {
 				my $found_it = 0;
 				foreach my $line_disk (@disk_file_lines) {
-					if ( ( $line =~ m/DO NOT EDIT - Generated for / && $line =~ m/$header_comment/ ) || $line =~ m/12M NOTE\:/ ) {
+					if ( ( $line =~ m/DO NOT EDIT - Generated for / && $line =~ m/$header_comment/ ) || $line =~ m/TRAFFIC OPS NOTE\:/ ) {
 						$found_it++;
 					}
 				}
@@ -2732,7 +2741,7 @@ sub diff_file_lines {
 					}
 				}
 			}
-			elsif ( ( $line =~ m/DO NOT EDIT - Generated for / && $line =~ m/$header_comment/ ) || $line =~ m/12M NOTE\:/ ) {
+			elsif ( ( $line =~ m/DO NOT EDIT - Generated for / && $line =~ m/$header_comment/ ) || $line =~ m/TRAFFIC OPS NOTE\:/ ) {
 				next;
 			}
 			else {
diff --git a/traffic_ops/build/traffic_ops.spec b/traffic_ops/build/traffic_ops.spec
index 4cac1decd..4631b9de5 100644
--- a/traffic_ops/build/traffic_ops.spec
+++ b/traffic_ops/build/traffic_ops.spec
@@ -67,8 +67,6 @@ Built: %(date) by %{getenv: USER}
     # Create build area with proper gopath structure
     mkdir -p src pkg bin || { echo "Could not create directories in $(pwd): $!"; exit 1; }
 
-
-
     # build all internal go dependencies (expects package being built as argument)
     build_dependencies () {
        IFS=$'\n'
@@ -92,10 +90,16 @@ Built: %(date) by %{getenv: USER}
            fi
        done
     }
+    oldpwd=$(pwd)
+    #copy in traffic_ops/vendor
+    vendordir=src/github.com/apache/incubator-trafficcontrol/traffic_ops/vendor 
+    ( mkdir -p "$vendordir" && \
+      cd "$vendordir" && \
+      cp -r "$TC_DIR"/traffic_ops/vendor/* . \
+    ) || { echo "could not copy traffic_ops/vendor directory"; exit 1; } 
 
     # build traffic_ops_golang binary
     godir=src/github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang
-    oldpwd=$(pwd)
     ( mkdir -p "$godir" && \
       cd "$godir" && \
       cp -r "$TC_DIR"/traffic_ops/traffic_ops_golang/* . && \
diff --git a/traffic_ops/client/README.md b/traffic_ops/client/README.md
new file mode 100644
index 000000000..aca523225
--- /dev/null
+++ b/traffic_ops/client/README.md
@@ -0,0 +1,54 @@
+# TO Client Library Golang
+_This version of the SDK is deprecated in favor of the newer [TO API v1.3 Client Library](https://github.com/apache/incubator-trafficcontrol/tree/master/traffic_ops/client/v13)_
+
+## Getting Started
+1. Obtain the latest version of the library
+
+`go get github.com/apache/incubator-trafficcontrol/traffic_ops/client`
+
+2. Get a basic TO session started and fetch a list of CDNs
+```go
+package main
+
+import (
+	"fmt"
+	"os"
+	"time"
+
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc/v13"
+	toclient "github.com/apache/incubator-trafficcontrol/traffic_ops/client"
+)
+
+const TOURL = "http://localhost"
+const TOUser = "user"
+const TOPassword = "password"
+const AllowInsecureConnections = true
+const UserAgent = "MySampleApp"
+const UseClientCache = false
+const TrafficOpsRequestTimeout = time.Second * time.Duration(10)
+
+func main() {
+	session, remoteaddr, err := toclient.LoginWithAgent(
+		TOURL,
+		TOUser,
+		TOPassword,
+		AllowInsecureConnections,
+		UserAgent,
+		UseClientCache,
+		TrafficOpsRequestTimeout)
+	if err != nil {
+		fmt.Printf("An error occurred while logging in:\n\t%v\n", err)
+		os.Exit(1)
+	}
+	fmt.Println("Connected to: " + remoteaddr.String())
+	var cdns []v13.CDN
+	cdns, _, err = session.GetCDNs()
+	if err != nil {
+		fmt.Printf("An error occurred while getting cdns:\n\t%v\n", err)
+		os.Exit(1)
+	}
+	for _, cdn := range cdns {
+		fmt.Println(cdn.Name)
+	}
+}
+```
diff --git a/traffic_ops/client/v13/README.md b/traffic_ops/client/v13/README.md
new file mode 100644
index 000000000..bc61072fc
--- /dev/null
+++ b/traffic_ops/client/v13/README.md
@@ -0,0 +1,53 @@
+# TO Client Library Golang
+
+## Getting Started
+1. Obtain the latest version of the library
+
+`go get github.com/apache/incubator-trafficcontrol/traffic_ops/client/v13`
+
+2. Get a basic TO session started and fetch a list of CDNs
+```go
+package main
+
+import (
+	"fmt"
+	"os"
+	"time"
+
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc/v13"
+	toclient "github.com/apache/incubator-trafficcontrol/traffic_ops/client/v13"
+)
+
+const TOURL = "http://localhost"
+const TOUser = "user"
+const TOPassword = "password"
+const AllowInsecureConnections = true
+const UserAgent = "MySampleApp"
+const UseClientCache = false
+const TrafficOpsRequestTimeout = time.Second * time.Duration(10)
+
+func main() {
+	session, remoteaddr, err := toclient.LoginWithAgent(
+		TOURL,
+		TOUser,
+		TOPassword,
+		AllowInsecureConnections,
+		UserAgent,
+		UseClientCache,
+		TrafficOpsRequestTimeout)
+	if err != nil {
+		fmt.Printf("An error occurred while logging in:\n\t%v\n", err)
+		os.Exit(1)
+	}
+	fmt.Println("Connected to: " + remoteaddr.String())
+	var cdns []v13.CDN
+	cdns, _, err = session.GetCDNs()
+	if err != nil {
+		fmt.Printf("An error occurred while getting cdns:\n\t%v\n", err)
+		os.Exit(1)
+	}
+	for _, cdn := range cdns {
+		fmt.Println(cdn.Name)
+	}
+}
+```
diff --git a/traffic_ops/client/v13/coordinate.go b/traffic_ops/client/v13/coordinate.go
new file mode 100644
index 000000000..3dc8ea15d
--- /dev/null
+++ b/traffic_ops/client/v13/coordinate.go
@@ -0,0 +1,133 @@
+/*
+
+   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.
+*/
+
+package v13
+
+import (
+	"encoding/json"
+	"fmt"
+	"net"
+	"net/http"
+
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc"
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc/v13"
+)
+
+const (
+	API_v13_Coordinates = "/api/1.3/coordinates"
+)
+
+// Create a Coordinate
+func (to *Session) CreateCoordinate(coordinate v13.Coordinate) (tc.Alerts, ReqInf, error) {
+
+	var remoteAddr net.Addr
+	reqBody, err := json.Marshal(coordinate)
+	reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: remoteAddr}
+	if err != nil {
+		return tc.Alerts{}, reqInf, err
+	}
+	resp, remoteAddr, err := to.request(http.MethodPost, API_v13_Coordinates, reqBody)
+	if err != nil {
+		return tc.Alerts{}, reqInf, err
+	}
+	defer resp.Body.Close()
+	var alerts tc.Alerts
+	err = json.NewDecoder(resp.Body).Decode(&alerts)
+	return alerts, reqInf, nil
+}
+
+// Update a Coordinate by ID
+func (to *Session) UpdateCoordinateByID(id int, coordinate v13.Coordinate) (tc.Alerts, ReqInf, error) {
+
+	var remoteAddr net.Addr
+	reqBody, err := json.Marshal(coordinate)
+	reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: remoteAddr}
+	if err != nil {
+		return tc.Alerts{}, reqInf, err
+	}
+	route := fmt.Sprintf("%s?id=%d", API_v13_Coordinates, id)
+	resp, remoteAddr, err := to.request(http.MethodPut, route, reqBody)
+	if err != nil {
+		return tc.Alerts{}, reqInf, err
+	}
+	defer resp.Body.Close()
+	var alerts tc.Alerts
+	err = json.NewDecoder(resp.Body).Decode(&alerts)
+	return alerts, reqInf, nil
+}
+
+// Returns a list of Coordinates
+func (to *Session) GetCoordinates() ([]v13.Coordinate, ReqInf, error) {
+	resp, remoteAddr, err := to.request(http.MethodGet, API_v13_Coordinates, nil)
+	reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: remoteAddr}
+	if err != nil {
+		return nil, reqInf, err
+	}
+	defer resp.Body.Close()
+
+	var data v13.CoordinatesResponse
+	err = json.NewDecoder(resp.Body).Decode(&data)
+	return data.Response, reqInf, nil
+}
+
+// GET a Coordinate by the Coordinate id
+func (to *Session) GetCoordinateByID(id int) ([]v13.Coordinate, ReqInf, error) {
+	route := fmt.Sprintf("%s?id=%d", API_v13_Coordinates, id)
+	resp, remoteAddr, err := to.request(http.MethodGet, route, nil)
+	reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: remoteAddr}
+	if err != nil {
+		return nil, reqInf, err
+	}
+	defer resp.Body.Close()
+
+	var data v13.CoordinatesResponse
+	if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
+		return nil, reqInf, err
+	}
+
+	return data.Response, reqInf, nil
+}
+
+// GET a Coordinate by the Coordinate name
+func (to *Session) GetCoordinateByName(name string) ([]v13.Coordinate, ReqInf, error) {
+	url := fmt.Sprintf("%s?name=%s", API_v13_Coordinates, name)
+	resp, remoteAddr, err := to.request(http.MethodGet, url, nil)
+	reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: remoteAddr}
+	if err != nil {
+		return nil, reqInf, err
+	}
+	defer resp.Body.Close()
+
+	var data v13.CoordinatesResponse
+	if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
+		return nil, reqInf, err
+	}
+
+	return data.Response, reqInf, nil
+}
+
+// DELETE a Coordinate by ID
+func (to *Session) DeleteCoordinateByID(id int) (tc.Alerts, ReqInf, error) {
+	route := fmt.Sprintf("%s?id=%d", API_v13_Coordinates, id)
+	resp, remoteAddr, err := to.request(http.MethodDelete, route, nil)
+	reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: remoteAddr}
+	if err != nil {
+		return tc.Alerts{}, reqInf, err
+	}
+	defer resp.Body.Close()
+	var alerts tc.Alerts
+	err = json.NewDecoder(resp.Body).Decode(&alerts)
+	return alerts, reqInf, nil
+}
diff --git a/traffic_ops/testing/api/v13/coordinates_test.go b/traffic_ops/testing/api/v13/coordinates_test.go
new file mode 100644
index 000000000..708bc98ed
--- /dev/null
+++ b/traffic_ops/testing/api/v13/coordinates_test.go
@@ -0,0 +1,129 @@
+package v13
+
+/*
+
+ 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.
+*/
+
+import (
+	"testing"
+
+	"github.com/apache/incubator-trafficcontrol/lib/go-log"
+	tc "github.com/apache/incubator-trafficcontrol/lib/go-tc"
+)
+
+func TestCoordinates(t *testing.T) {
+	CreateTestCoordinates(t)
+	GetTestCoordinates(t)
+	UpdateTestCoordinates(t)
+	DeleteTestCoordinates(t)
+}
+
+func CreateTestCoordinates(t *testing.T) {
+	failed := false
+
+	for _, coord := range testData.Coordinates {
+
+		_, _, err := TOSession.CreateCoordinate(coord)
+		if err != nil {
+			t.Errorf("could not CREATE coordinates: %v\n", err)
+			failed = true
+		}
+	}
+	if !failed {
+		log.Debugln("CreateTestCoordinates() PASSED: ")
+	}
+}
+
+func GetTestCoordinates(t *testing.T) {
+	failed := false
+	for _, coord := range testData.Coordinates {
+		resp, _, err := TOSession.GetCoordinateByName(coord.Name)
+		if err != nil {
+			t.Errorf("cannot GET Coordinate: %v - %v\n", err, resp)
+			failed = true
+		}
+	}
+	if !failed {
+		log.Debugln("GetTestCoordinates() PASSED: ")
+	}
+}
+
+func UpdateTestCoordinates(t *testing.T) {
+	failed := false
+	firstCoord := testData.Coordinates[0]
+	resp, _, err := TOSession.GetCoordinateByName(firstCoord.Name)
+	if err != nil {
+		t.Errorf("cannot GET Coordinate by name: %v - %v\n", firstCoord.Name, err)
+		failed = true
+	}
+	coord := resp[0]
+	expectedLat := 12.34
+	coord.Latitude = expectedLat
+
+	var alert tc.Alerts
+	alert, _, err = TOSession.UpdateCoordinateByID(coord.ID, coord)
+	if err != nil {
+		t.Errorf("cannot UPDATE Coordinate by id: %v - %v\n", err, alert)
+		failed = true
+	}
+
+	// Retrieve the Coordinate to check Coordinate name got updated
+	resp, _, err = TOSession.GetCoordinateByID(coord.ID)
+	if err != nil {
+		t.Errorf("cannot GET Coordinate by name: '$%s', %v\n", firstCoord.Name, err)
+		failed = true
+	}
+	coord = resp[0]
+	if coord.Latitude != expectedLat {
+		t.Errorf("results do not match actual: %s, expected: %f\n", coord.Name, expectedLat)
+	}
+	if !failed {
+		log.Debugln("UpdateTestCoordinates() PASSED: ")
+	}
+}
+
+func DeleteTestCoordinates(t *testing.T) {
+	failed := false
+
+	for _, coord := range testData.Coordinates {
+		// Retrieve the Coordinate by name so we can get the id for the Update
+		resp, _, err := TOSession.GetCoordinateByName(coord.Name)
+		if err != nil {
+			t.Errorf("cannot GET Coordinate by name: %v - %v\n", coord.Name, err)
+			failed = true
+		}
+		if len(resp) > 0 {
+			respCoord := resp[0]
+			_, _, err := TOSession.DeleteCoordinateByID(respCoord.ID)
+			if err != nil {
+				t.Errorf("cannot DELETE Coordinate by name: '%s' %v\n", respCoord.Name, err)
+				failed = true
+			}
+			// Retrieve the Coordinate to see if it got deleted
+			coords, _, err := TOSession.GetCoordinateByName(coord.Name)
+			if err != nil {
+				t.Errorf("error deleting Coordinate name: %s\n", err.Error())
+				failed = true
+			}
+			if len(coords) > 0 {
+				t.Errorf("expected Coordinate name: %s to be deleted\n", coord.Name)
+				failed = true
+			}
+		}
+	}
+
+	if !failed {
+		log.Debugln("DeleteTestCoordinates() PASSED: ")
+	}
+}
diff --git a/traffic_ops/testing/api/v13/tc-fixtures.json b/traffic_ops/testing/api/v13/tc-fixtures.json
index 290dcc186..cecc13e99 100644
--- a/traffic_ops/testing/api/v13/tc-fixtures.json
+++ b/traffic_ops/testing/api/v13/tc-fixtures.json
@@ -183,6 +183,18 @@
             "name": "division2"
         }
     ],
+    "coordinates": [
+        {
+            "latitude": 1.1,
+            "longitude": 2.2,
+            "name": "coordinate1"
+        },
+        {
+            "latitude": 3.3,
+            "longitude": 4.4,
+            "name": "coordinate2"
+        }
+    ],
     "parameters": [
         {
             "configFile": "rascal.properties",
diff --git a/traffic_ops/testing/api/v13/traffic_control.go b/traffic_ops/testing/api/v13/traffic_control.go
index 015089e43..5e01a4ac8 100644
--- a/traffic_ops/testing/api/v13/traffic_control.go
+++ b/traffic_ops/testing/api/v13/traffic_control.go
@@ -29,6 +29,7 @@ type TrafficControl struct {
 	DeliveryServiceRequestComments []v12.DeliveryServiceRequestComment `json:"deliveryServiceRequestComments"`
 	DeliveryServices               []v12.DeliveryService               `json:"deliveryservices"`
 	Divisions                      []v12.Division                      `json:"divisions"`
+	Coordinates                    []v13.Coordinate                    `json:"coordinates"`
 	Profiles                       []v13.Profile                       `json:"profiles"`
 	Parameters                     []v12.Parameter                     `json:"parameters"`
 	ProfileParameters              []v13.ProfileParameter              `json:"profileParameters"`
diff --git a/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/.travis.yml b/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/.travis.yml
deleted file mode 100644
index f6edc3483..000000000
--- a/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/.travis.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-language: go
-
-go:
-  - 1.4.x
-  - 1.5.x
-  - 1.6.x
-  - 1.7.x
-  - 1.8.x
-  - 1.9.x
-  - tip
diff --git a/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/README.md b/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/README.md
deleted file mode 100644
index 3e8fdc693..000000000
--- a/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/README.md
+++ /dev/null
@@ -1,188 +0,0 @@
-# envconfig
-
-[![Build Status](https://travis-ci.org/kelseyhightower/envconfig.svg)](https://travis-ci.org/kelseyhightower/envconfig)
-
-```Go
-import "github.com/kelseyhightower/envconfig"
-```
-
-## Documentation
-
-See [godoc](http://godoc.org/github.com/kelseyhightower/envconfig)
-
-## Usage
-
-Set some environment variables:
-
-```Bash
-export MYAPP_DEBUG=false
-export MYAPP_PORT=8080
-export MYAPP_USER=Kelsey
-export MYAPP_RATE="0.5"
-export MYAPP_TIMEOUT="3m"
-export MYAPP_USERS="rob,ken,robert"
-export MYAPP_COLORCODES="red:1,green:2,blue:3"
-```
-
-Write some code:
-
-```Go
-package main
-
-import (
-    "fmt"
-    "log"
-    "time"
-
-    "github.com/kelseyhightower/envconfig"
-)
-
-type Specification struct {
-    Debug       bool
-    Port        int
-    User        string
-    Users       []string
-    Rate        float32
-    Timeout     time.Duration
-    ColorCodes  map[string]int
-}
-
-func main() {
-    var s Specification
-    err := envconfig.Process("myapp", &s)
-    if err != nil {
-        log.Fatal(err.Error())
-    }
-    format := "Debug: %v\nPort: %d\nUser: %s\nRate: %f\nTimeout: %s\n"
-    _, err = fmt.Printf(format, s.Debug, s.Port, s.User, s.Rate, s.Timeout)
-    if err != nil {
-        log.Fatal(err.Error())
-    }
-
-    fmt.Println("Users:")
-    for _, u := range s.Users {
-        fmt.Printf("  %s\n", u)
-    }
-
-    fmt.Println("Color codes:")
-    for k, v := range s.ColorCodes {
-        fmt.Printf("  %s: %d\n", k, v)
-    }
-}
-```
-
-Results:
-
-```Bash
-Debug: false
-Port: 8080
-User: Kelsey
-Rate: 0.500000
-Timeout: 3m0s
-Users:
-  rob
-  ken
-  robert
-Color codes:
-  red: 1
-  green: 2
-  blue: 3
-```
-
-## Struct Tag Support
-
-Envconfig supports the use of struct tags to specify alternate, default, and required
-environment variables.
-
-For example, consider the following struct:
-
-```Go
-type Specification struct {
-    ManualOverride1 string `envconfig:"manual_override_1"`
-    DefaultVar      string `default:"foobar"`
-    RequiredVar     string `required:"true"`
-    IgnoredVar      string `ignored:"true"`
-    AutoSplitVar    string `split_words:"true"`
-}
-```
-
-Envconfig has automatic support for CamelCased struct elements when the
-`split_words:"true"` tag is supplied. Without this tag, `AutoSplitVar` above
-would look for an environment variable called `MYAPP_AUTOSPLITVAR`. With the
-setting applied it will look for `MYAPP_AUTO_SPLIT_VAR`. Note that numbers
-will get globbed into the previous word. If the setting does not do the
-right thing, you may use a manual override.
-
-Envconfig will process value for `ManualOverride1` by populating it with the
-value for `MYAPP_MANUAL_OVERRIDE_1`. Without this struct tag, it would have
-instead looked up `MYAPP_MANUALOVERRIDE1`. With the `split_words:"true"` tag
-it would have looked up `MYAPP_MANUAL_OVERRIDE1`.
-
-```Bash
-export MYAPP_MANUAL_OVERRIDE_1="this will be the value"
-
-# export MYAPP_MANUALOVERRIDE1="and this will not"
-```
-
-If envconfig can't find an environment variable value for `MYAPP_DEFAULTVAR`,
-it will populate it with "foobar" as a default value.
-
-If envconfig can't find an environment variable value for `MYAPP_REQUIREDVAR`,
-it will return an error when asked to process the struct.
-
-If envconfig can't find an environment variable in the form `PREFIX_MYVAR`, and there
-is a struct tag defined, it will try to populate your variable with an environment
-variable that directly matches the envconfig tag in your struct definition:
-
-```shell
-export SERVICE_HOST=127.0.0.1
-export MYAPP_DEBUG=true
-```
-```Go
-type Specification struct {
-    ServiceHost string `envconfig:"SERVICE_HOST"`
-    Debug       bool
-}
-```
-
-Envconfig won't process a field with the "ignored" tag set to "true", even if a corresponding
-environment variable is set.
-
-## Supported Struct Field Types
-
-envconfig supports supports these struct field types:
-
-  * string
-  * int8, int16, int32, int64
-  * bool
-  * float32, float64
-  * slices of any supported type
-  * maps (keys and values of any supported type)
-  * [encoding.TextUnmarshaler](https://golang.org/pkg/encoding/#TextUnmarshaler)
-
-Embedded structs using these fields are also supported.
-
-## Custom Decoders
-
-Any field whose type (or pointer-to-type) implements `envconfig.Decoder` can
-control its own deserialization:
-
-```Bash
-export DNS_SERVER=8.8.8.8
-```
-
-```Go
-type IPDecoder net.IP
-
-func (ipd *IPDecoder) Decode(value string) error {
-    *ipd = IPDecoder(net.ParseIP(value))
-    return nil
-}
-
-type DNSConfig struct {
-    Address IPDecoder `envconfig:"DNS_SERVER"`
-}
-```
-
-Also, envconfig will use a `Set(string) error` method like from the
-[flag.Value](https://godoc.org/flag#Value) interface if implemented.
diff --git a/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/env_os.go b/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/env_os.go
deleted file mode 100644
index a6a014a2b..000000000
--- a/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/env_os.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build appengine
-
-package envconfig
-
-import "os"
-
-var lookupEnv = os.LookupEnv
diff --git a/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/usage.go b/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/usage.go
deleted file mode 100644
index 089f8c8a4..000000000
--- a/traffic_ops/testing/api/vendor/github.com/kelseyhightower/envconfig/usage.go
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright (c) 2016 Kelsey Hightower and others. All rights reserved.
-// Use of this source code is governed by the MIT License that can be found in
-// the LICENSE file.
-
-package envconfig
-
-import (
-	"encoding"
-	"fmt"
-	"io"
-	"os"
-	"reflect"
-	"strconv"
-	"strings"
-	"text/tabwriter"
-	"text/template"
-)
-
-const (
-	// DefaultListFormat constant to use to display usage in a list format
-	DefaultListFormat = `This application is configured via the environment. The following environment
-variables can be used:
-{{range .}}
-{{usage_key .}}
-  [description] {{usage_description .}}
-  [type]        {{usage_type .}}
-  [default]     {{usage_default .}}
-  [required]    {{usage_required .}}{{end}}
-`
-	// DefaultTableFormat constant to use to display usage in a tabular format
-	DefaultTableFormat = `This application is configured via the environment. The following environment
-variables can be used:
-
-KEY	TYPE	DEFAULT	REQUIRED	DESCRIPTION
-{{range .}}{{usage_key .}}	{{usage_type .}}	{{usage_default .}}	{{usage_required .}}	{{usage_description .}}
-{{end}}`
-)
-
-var (
-	decoderType     = reflect.TypeOf((*Decoder)(nil)).Elem()
-	setterType      = reflect.TypeOf((*Setter)(nil)).Elem()
-	unmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
-)
-
-func implementsInterface(t reflect.Type) bool {
-	return t.Implements(decoderType) ||
-		reflect.PtrTo(t).Implements(decoderType) ||
-		t.Implements(setterType) ||
-		reflect.PtrTo(t).Implements(setterType) ||
-		t.Implements(unmarshalerType) ||
-		reflect.PtrTo(t).Implements(unmarshalerType)
-}
-
-// toTypeDescription converts Go types into a human readable description
-func toTypeDescription(t reflect.Type) string {
-	switch t.Kind() {
-	case reflect.Array, reflect.Slice:
-		return fmt.Sprintf("Comma-separated list of %s", toTypeDescription(t.Elem()))
-	case reflect.Map:
-		return fmt.Sprintf(
-			"Comma-separated list of %s:%s pairs",
-			toTypeDescription(t.Key()),
-			toTypeDescription(t.Elem()),
-		)
-	case reflect.Ptr:
-		return toTypeDescription(t.Elem())
-	case reflect.Struct:
-		if implementsInterface(t) && t.Name() != "" {
-			return t.Name()
-		}
-		return ""
-	case reflect.String:
-		name := t.Name()
-		if name != "" && name != "string" {
-			return name
-		}
-		return "String"
-	case reflect.Bool:
-		name := t.Name()
-		if name != "" && name != "bool" {
-			return name
-		}
-		return "True or False"
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		name := t.Name()
-		if name != "" && !strings.HasPrefix(name, "int") {
-			return name
-		}
-		return "Integer"
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-		name := t.Name()
-		if name != "" && !strings.HasPrefix(name, "uint") {
-			return name
-		}
-		return "Unsigned Integer"
-	case reflect.Float32, reflect.Float64:
-		name := t.Name()
-		if name != "" && !strings.HasPrefix(name, "float") {
-			return name
-		}
-		return "Float"
-	}
-	return fmt.Sprintf("%+v", t)
-}
-
-// Usage writes usage information to stderr using the default header and table format
-func Usage(prefix string, spec interface{}) error {
-	// The default is to output the usage information as a table
-	// Create tabwriter instance to support table output
-	tabs := tabwriter.NewWriter(os.Stdout, 1, 0, 4, ' ', 0)
-
-	err := Usagef(prefix, spec, tabs, DefaultTableFormat)
-	tabs.Flush()
-	return err
-}
-
-// Usagef writes usage information to the specified io.Writer using the specifed template specification
-func Usagef(prefix string, spec interface{}, out io.Writer, format string) error {
-
-	// Specify the default usage template functions
-	functions := template.FuncMap{
-		"usage_key":         func(v varInfo) string { return v.Key },
-		"usage_description": func(v varInfo) string { return v.Tags.Get("desc") },
-		"usage_type":        func(v varInfo) string { return toTypeDescription(v.Field.Type()) },
-		"usage_default":     func(v varInfo) string { return v.Tags.Get("default") },
-		"usage_required": func(v varInfo) (string, error) {
-			req := v.Tags.Get("required")
-			if req != "" {
-				reqB, err := strconv.ParseBool(req)
-				if err != nil {
-					return "", err
-				}
-				if reqB {
-					req = "true"
-				}
-			}
-			return req, nil
-		},
-	}
-
-	tmpl, err := template.New("envconfig").Funcs(functions).Parse(format)
-	if err != nil {
-		return err
-	}
-
-	return Usaget(prefix, spec, out, tmpl)
-}
-
-// Usaget writes usage information to the specified io.Writer using the specified template
-func Usaget(prefix string, spec interface{}, out io.Writer, tmpl *template.Template) error {
-	// gather first
-	infos, err := gatherInfo(prefix, spec)
-	if err != nil {
-		return err
-	}
-
-	return tmpl.Execute(out, infos)
-}
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/README.md b/traffic_ops/testing/api/vendor/github.com/lib/pq/README.md
deleted file mode 100644
index 781c89eea..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/README.md
+++ /dev/null
@@ -1,106 +0,0 @@
-# pq - A pure Go postgres driver for Go's database/sql package
-
-[![GoDoc](https://godoc.org/github.com/lib/pq?status.svg)](https://godoc.org/github.com/lib/pq)
-[![Build Status](https://travis-ci.org/lib/pq.svg?branch=master)](https://travis-ci.org/lib/pq)
-
-## Install
-
-	go get github.com/lib/pq
-
-## Docs
-
-For detailed documentation and basic usage examples, please see the package
-documentation at <http://godoc.org/github.com/lib/pq>.
-
-## Tests
-
-`go test` is used for testing.  A running PostgreSQL server is
-required, with the ability to log in.  The default database to connect
-to test with is "pqgotest," but it can be overridden using environment
-variables.
-
-Example:
-
-	PGHOST=/run/postgresql go test github.com/lib/pq
-
-Optionally, a benchmark suite can be run as part of the tests:
-
-	PGHOST=/run/postgresql go test -bench .
-
-## Features
-
-* SSL
-* Handles bad connections for `database/sql`
-* Scan `time.Time` correctly (i.e. `timestamp[tz]`, `time[tz]`, `date`)
-* Scan binary blobs correctly (i.e. `bytea`)
-* Package for `hstore` support
-* COPY FROM support
-* pq.ParseURL for converting urls to connection strings for sql.Open.
-* Many libpq compatible environment variables
-* Unix socket support
-* Notifications: `LISTEN`/`NOTIFY`
-* pgpass support
-
-## Future / Things you can help with
-
-* Better COPY FROM / COPY TO (see discussion in #181)
-
-## Thank you (alphabetical)
-
-Some of these contributors are from the original library `bmizerany/pq.go` whose
-code still exists in here.
-
-* Andy Balholm (andybalholm)
-* Ben Berkert (benburkert)
-* Benjamin Heatwole (bheatwole)
-* Bill Mill (llimllib)
-* Bjørn Madsen (aeons)
-* Blake Gentry (bgentry)
-* Brad Fitzpatrick (bradfitz)
-* Charlie Melbye (cmelbye)
-* Chris Bandy (cbandy)
-* Chris Gilling (cgilling)
-* Chris Walsh (cwds)
-* Dan Sosedoff (sosedoff)
-* Daniel Farina (fdr)
-* Eric Chlebek (echlebek)
-* Eric Garrido (minusnine)
-* Eric Urban (hydrogen18)
-* Everyone at The Go Team
-* Evan Shaw (edsrzf)
-* Ewan Chou (coocood)
-* Fazal Majid (fazalmajid)
-* Federico Romero (federomero)
-* Fumin (fumin)
-* Gary Burd (garyburd)
-* Heroku (heroku)
-* James Pozdena (jpoz)
-* Jason McVetta (jmcvetta)
-* Jeremy Jay (pbnjay)
-* Joakim Sernbrant (serbaut)
-* John Gallagher (jgallagher)
-* Jonathan Rudenberg (titanous)
-* Joël Stemmer (jstemmer)
-* Kamil Kisiel (kisielk)
-* Kelly Dunn (kellydunn)
-* Keith Rarick (kr)
-* Kir Shatrov (kirs)
-* Lann Martin (lann)
-* Maciek Sakrejda (uhoh-itsmaciek)
-* Marc Brinkmann (mbr)
-* Marko Tiikkaja (johto)
-* Matt Newberry (MattNewberry)
-* Matt Robenolt (mattrobenolt)
-* Martin Olsen (martinolsen)
-* Mike Lewis (mikelikespie)
-* Nicolas Patry (Narsil)
-* Oliver Tonnhofer (olt)
-* Patrick Hayes (phayes)
-* Paul Hammond (paulhammond)
-* Ryan Smith (ryandotsmith)
-* Samuel Stauffer (samuel)
-* Timothée Peignier (cyberdelia)
-* Travis Cline (tmc)
-* TruongSinh Tran-Nguyen (truongsinh)
-* Yaismel Miranda (ympons)
-* notedit (notedit)
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/array.go b/traffic_ops/testing/api/vendor/github.com/lib/pq/array.go
deleted file mode 100644
index e4933e227..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/array.go
+++ /dev/null
@@ -1,756 +0,0 @@
-package pq
-
-import (
-	"bytes"
-	"database/sql"
-	"database/sql/driver"
-	"encoding/hex"
-	"fmt"
-	"reflect"
-	"strconv"
-	"strings"
-)
-
-var typeByteSlice = reflect.TypeOf([]byte{})
-var typeDriverValuer = reflect.TypeOf((*driver.Valuer)(nil)).Elem()
-var typeSQLScanner = reflect.TypeOf((*sql.Scanner)(nil)).Elem()
-
-// Array returns the optimal driver.Valuer and sql.Scanner for an array or
-// slice of any dimension.
-//
-// For example:
-//  db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array([]int{235, 401}))
-//
-//  var x []sql.NullInt64
-//  db.QueryRow('SELECT ARRAY[235, 401]').Scan(pq.Array(&x))
-//
-// Scanning multi-dimensional arrays is not supported.  Arrays where the lower
-// bound is not one (such as `[0:0]={1}') are not supported.
-func Array(a interface{}) interface {
-	driver.Valuer
-	sql.Scanner
-} {
-	switch a := a.(type) {
-	case []bool:
-		return (*BoolArray)(&a)
-	case []float64:
-		return (*Float64Array)(&a)
-	case []int64:
-		return (*Int64Array)(&a)
-	case []string:
-		return (*StringArray)(&a)
-
-	case *[]bool:
-		return (*BoolArray)(a)
-	case *[]float64:
-		return (*Float64Array)(a)
-	case *[]int64:
-		return (*Int64Array)(a)
-	case *[]string:
-		return (*StringArray)(a)
-	}
-
-	return GenericArray{a}
-}
-
-// ArrayDelimiter may be optionally implemented by driver.Valuer or sql.Scanner
-// to override the array delimiter used by GenericArray.
-type ArrayDelimiter interface {
-	// ArrayDelimiter returns the delimiter character(s) for this element's type.
-	ArrayDelimiter() string
-}
-
-// BoolArray represents a one-dimensional array of the PostgreSQL boolean type.
-type BoolArray []bool
-
-// Scan implements the sql.Scanner interface.
-func (a *BoolArray) Scan(src interface{}) error {
-	switch src := src.(type) {
-	case []byte:
-		return a.scanBytes(src)
-	case string:
-		return a.scanBytes([]byte(src))
-	case nil:
-		*a = nil
-		return nil
-	}
-
-	return fmt.Errorf("pq: cannot convert %T to BoolArray", src)
-}
-
-func (a *BoolArray) scanBytes(src []byte) error {
-	elems, err := scanLinearArray(src, []byte{','}, "BoolArray")
-	if err != nil {
-		return err
-	}
-	if *a != nil && len(elems) == 0 {
-		*a = (*a)[:0]
-	} else {
-		b := make(BoolArray, len(elems))
-		for i, v := range elems {
-			if len(v) != 1 {
-				return fmt.Errorf("pq: could not parse boolean array index %d: invalid boolean %q", i, v)
-			}
-			switch v[0] {
-			case 't':
-				b[i] = true
-			case 'f':
-				b[i] = false
-			default:
-				return fmt.Errorf("pq: could not parse boolean array index %d: invalid boolean %q", i, v)
-			}
-		}
-		*a = b
-	}
-	return nil
-}
-
-// Value implements the driver.Valuer interface.
-func (a BoolArray) Value() (driver.Value, error) {
-	if a == nil {
-		return nil, nil
-	}
-
-	if n := len(a); n > 0 {
-		// There will be exactly two curly brackets, N bytes of values,
-		// and N-1 bytes of delimiters.
-		b := make([]byte, 1+2*n)
-
-		for i := 0; i < n; i++ {
-			b[2*i] = ','
-			if a[i] {
-				b[1+2*i] = 't'
-			} else {
-				b[1+2*i] = 'f'
-			}
-		}
-
-		b[0] = '{'
-		b[2*n] = '}'
-
-		return string(b), nil
-	}
-
-	return "{}", nil
-}
-
-// ByteaArray represents a one-dimensional array of the PostgreSQL bytea type.
-type ByteaArray [][]byte
-
-// Scan implements the sql.Scanner interface.
-func (a *ByteaArray) Scan(src interface{}) error {
-	switch src := src.(type) {
-	case []byte:
-		return a.scanBytes(src)
-	case string:
-		return a.scanBytes([]byte(src))
-	case nil:
-		*a = nil
-		return nil
-	}
-
-	return fmt.Errorf("pq: cannot convert %T to ByteaArray", src)
-}
-
-func (a *ByteaArray) scanBytes(src []byte) error {
-	elems, err := scanLinearArray(src, []byte{','}, "ByteaArray")
-	if err != nil {
-		return err
-	}
-	if *a != nil && len(elems) == 0 {
-		*a = (*a)[:0]
-	} else {
-		b := make(ByteaArray, len(elems))
-		for i, v := range elems {
-			b[i], err = parseBytea(v)
-			if err != nil {
-				return fmt.Errorf("could not parse bytea array index %d: %s", i, err.Error())
-			}
-		}
-		*a = b
-	}
-	return nil
-}
-
-// Value implements the driver.Valuer interface. It uses the "hex" format which
-// is only supported on PostgreSQL 9.0 or newer.
-func (a ByteaArray) Value() (driver.Value, error) {
-	if a == nil {
-		return nil, nil
-	}
-
-	if n := len(a); n > 0 {
-		// There will be at least two curly brackets, 2*N bytes of quotes,
-		// 3*N bytes of hex formatting, and N-1 bytes of delimiters.
-		size := 1 + 6*n
-		for _, x := range a {
-			size += hex.EncodedLen(len(x))
-		}
-
-		b := make([]byte, size)
-
-		for i, s := 0, b; i < n; i++ {
-			o := copy(s, `,"\\x`)
-			o += hex.Encode(s[o:], a[i])
-			s[o] = '"'
-			s = s[o+1:]
-		}
-
-		b[0] = '{'
-		b[size-1] = '}'
-
-		return string(b), nil
-	}
-
-	return "{}", nil
-}
-
-// Float64Array represents a one-dimensional array of the PostgreSQL double
-// precision type.
-type Float64Array []float64
-
-// Scan implements the sql.Scanner interface.
-func (a *Float64Array) Scan(src interface{}) error {
-	switch src := src.(type) {
-	case []byte:
-		return a.scanBytes(src)
-	case string:
-		return a.scanBytes([]byte(src))
-	case nil:
-		*a = nil
-		return nil
-	}
-
-	return fmt.Errorf("pq: cannot convert %T to Float64Array", src)
-}
-
-func (a *Float64Array) scanBytes(src []byte) error {
-	elems, err := scanLinearArray(src, []byte{','}, "Float64Array")
-	if err != nil {
-		return err
-	}
-	if *a != nil && len(elems) == 0 {
-		*a = (*a)[:0]
-	} else {
-		b := make(Float64Array, len(elems))
-		for i, v := range elems {
-			if b[i], err = strconv.ParseFloat(string(v), 64); err != nil {
-				return fmt.Errorf("pq: parsing array element index %d: %v", i, err)
-			}
-		}
-		*a = b
-	}
-	return nil
-}
-
-// Value implements the driver.Valuer interface.
-func (a Float64Array) Value() (driver.Value, error) {
-	if a == nil {
-		return nil, nil
-	}
-
-	if n := len(a); n > 0 {
-		// There will be at least two curly brackets, N bytes of values,
-		// and N-1 bytes of delimiters.
-		b := make([]byte, 1, 1+2*n)
-		b[0] = '{'
-
-		b = strconv.AppendFloat(b, a[0], 'f', -1, 64)
-		for i := 1; i < n; i++ {
-			b = append(b, ',')
-			b = strconv.AppendFloat(b, a[i], 'f', -1, 64)
-		}
-
-		return string(append(b, '}')), nil
-	}
-
-	return "{}", nil
-}
-
-// GenericArray implements the driver.Valuer and sql.Scanner interfaces for
-// an array or slice of any dimension.
-type GenericArray struct{ A interface{} }
-
-func (GenericArray) evaluateDestination(rt reflect.Type) (reflect.Type, func([]byte, reflect.Value) error, string) {
-	var assign func([]byte, reflect.Value) error
-	var del = ","
-
-	// TODO calculate the assign function for other types
-	// TODO repeat this section on the element type of arrays or slices (multidimensional)
-	{
-		if reflect.PtrTo(rt).Implements(typeSQLScanner) {
-			// dest is always addressable because it is an element of a slice.
-			assign = func(src []byte, dest reflect.Value) (err error) {
-				ss := dest.Addr().Interface().(sql.Scanner)
-				if src == nil {
-					err = ss.Scan(nil)
-				} else {
-					err = ss.Scan(src)
-				}
-				return
-			}
-			goto FoundType
-		}
-
-		assign = func([]byte, reflect.Value) error {
-			return fmt.Errorf("pq: scanning to %s is not implemented; only sql.Scanner", rt)
-		}
-	}
-
-FoundType:
-
-	if ad, ok := reflect.Zero(rt).Interface().(ArrayDelimiter); ok {
-		del = ad.ArrayDelimiter()
-	}
-
-	return rt, assign, del
-}
-
-// Scan implements the sql.Scanner interface.
-func (a GenericArray) Scan(src interface{}) error {
-	dpv := reflect.ValueOf(a.A)
-	switch {
-	case dpv.Kind() != reflect.Ptr:
-		return fmt.Errorf("pq: destination %T is not a pointer to array or slice", a.A)
-	case dpv.IsNil():
-		return fmt.Errorf("pq: destination %T is nil", a.A)
-	}
-
-	dv := dpv.Elem()
-	switch dv.Kind() {
-	case reflect.Slice:
-	case reflect.Array:
-	default:
-		return fmt.Errorf("pq: destination %T is not a pointer to array or slice", a.A)
-	}
-
-	switch src := src.(type) {
-	case []byte:
-		return a.scanBytes(src, dv)
-	case string:
-		return a.scanBytes([]byte(src), dv)
-	case nil:
-		if dv.Kind() == reflect.Slice {
-			dv.Set(reflect.Zero(dv.Type()))
-			return nil
-		}
-	}
-
-	return fmt.Errorf("pq: cannot convert %T to %s", src, dv.Type())
-}
-
-func (a GenericArray) scanBytes(src []byte, dv reflect.Value) error {
-	dtype, assign, del := a.evaluateDestination(dv.Type().Elem())
-	dims, elems, err := parseArray(src, []byte(del))
-	if err != nil {
-		return err
-	}
-
-	// TODO allow multidimensional
-
-	if len(dims) > 1 {
-		return fmt.Errorf("pq: scanning from multidimensional ARRAY%s is not implemented",
-			strings.Replace(fmt.Sprint(dims), " ", "][", -1))
-	}
-
-	// Treat a zero-dimensional array like an array with a single dimension of zero.
-	if len(dims) == 0 {
-		dims = append(dims, 0)
-	}
-
-	for i, rt := 0, dv.Type(); i < len(dims); i, rt = i+1, rt.Elem() {
-		switch rt.Kind() {
-		case reflect.Slice:
-		case reflect.Array:
-			if rt.Len() != dims[i] {
-				return fmt.Errorf("pq: cannot convert ARRAY%s to %s",
-					strings.Replace(fmt.Sprint(dims), " ", "][", -1), dv.Type())
-			}
-		default:
-			// TODO handle multidimensional
-		}
-	}
-
-	values := reflect.MakeSlice(reflect.SliceOf(dtype), len(elems), len(elems))
-	for i, e := range elems {
-		if err := assign(e, values.Index(i)); err != nil {
-			return fmt.Errorf("pq: parsing array element index %d: %v", i, err)
-		}
-	}
-
-	// TODO handle multidimensional
-
-	switch dv.Kind() {
-	case reflect.Slice:
-		dv.Set(values.Slice(0, dims[0]))
-	case reflect.Array:
-		for i := 0; i < dims[0]; i++ {
-			dv.Index(i).Set(values.Index(i))
-		}
-	}
-
-	return nil
-}
-
-// Value implements the driver.Valuer interface.
-func (a GenericArray) Value() (driver.Value, error) {
-	if a.A == nil {
-		return nil, nil
-	}
-
-	rv := reflect.ValueOf(a.A)
-
-	switch rv.Kind() {
-	case reflect.Slice:
-		if rv.IsNil() {
-			return nil, nil
-		}
-	case reflect.Array:
-	default:
-		return nil, fmt.Errorf("pq: Unable to convert %T to array", a.A)
-	}
-
-	if n := rv.Len(); n > 0 {
-		// There will be at least two curly brackets, N bytes of values,
-		// and N-1 bytes of delimiters.
-		b := make([]byte, 0, 1+2*n)
-
-		b, _, err := appendArray(b, rv, n)
-		return string(b), err
-	}
-
-	return "{}", nil
-}
-
-// Int64Array represents a one-dimensional array of the PostgreSQL integer types.
-type Int64Array []int64
-
-// Scan implements the sql.Scanner interface.
-func (a *Int64Array) Scan(src interface{}) error {
-	switch src := src.(type) {
-	case []byte:
-		return a.scanBytes(src)
-	case string:
-		return a.scanBytes([]byte(src))
-	case nil:
-		*a = nil
-		return nil
-	}
-
-	return fmt.Errorf("pq: cannot convert %T to Int64Array", src)
-}
-
-func (a *Int64Array) scanBytes(src []byte) error {
-	elems, err := scanLinearArray(src, []byte{','}, "Int64Array")
-	if err != nil {
-		return err
-	}
-	if *a != nil && len(elems) == 0 {
-		*a = (*a)[:0]
-	} else {
-		b := make(Int64Array, len(elems))
-		for i, v := range elems {
-			if b[i], err = strconv.ParseInt(string(v), 10, 64); err != nil {
-				return fmt.Errorf("pq: parsing array element index %d: %v", i, err)
-			}
-		}
-		*a = b
-	}
-	return nil
-}
-
-// Value implements the driver.Valuer interface.
-func (a Int64Array) Value() (driver.Value, error) {
-	if a == nil {
-		return nil, nil
-	}
-
-	if n := len(a); n > 0 {
-		// There will be at least two curly brackets, N bytes of values,
-		// and N-1 bytes of delimiters.
-		b := make([]byte, 1, 1+2*n)
-		b[0] = '{'
-
-		b = strconv.AppendInt(b, a[0], 10)
-		for i := 1; i < n; i++ {
-			b = append(b, ',')
-			b = strconv.AppendInt(b, a[i], 10)
-		}
-
-		return string(append(b, '}')), nil
-	}
-
-	return "{}", nil
-}
-
-// StringArray represents a one-dimensional array of the PostgreSQL character types.
-type StringArray []string
-
-// Scan implements the sql.Scanner interface.
-func (a *StringArray) Scan(src interface{}) error {
-	switch src := src.(type) {
-	case []byte:
-		return a.scanBytes(src)
-	case string:
-		return a.scanBytes([]byte(src))
-	case nil:
-		*a = nil
-		return nil
-	}
-
-	return fmt.Errorf("pq: cannot convert %T to StringArray", src)
-}
-
-func (a *StringArray) scanBytes(src []byte) error {
-	elems, err := scanLinearArray(src, []byte{','}, "StringArray")
-	if err != nil {
-		return err
-	}
-	if *a != nil && len(elems) == 0 {
-		*a = (*a)[:0]
-	} else {
-		b := make(StringArray, len(elems))
-		for i, v := range elems {
-			if b[i] = string(v); v == nil {
-				return fmt.Errorf("pq: parsing array element index %d: cannot convert nil to string", i)
-			}
-		}
-		*a = b
-	}
-	return nil
-}
-
-// Value implements the driver.Valuer interface.
-func (a StringArray) Value() (driver.Value, error) {
-	if a == nil {
-		return nil, nil
-	}
-
-	if n := len(a); n > 0 {
-		// There will be at least two curly brackets, 2*N bytes of quotes,
-		// and N-1 bytes of delimiters.
-		b := make([]byte, 1, 1+3*n)
-		b[0] = '{'
-
-		b = appendArrayQuotedBytes(b, []byte(a[0]))
-		for i := 1; i < n; i++ {
-			b = append(b, ',')
-			b = appendArrayQuotedBytes(b, []byte(a[i]))
-		}
-
-		return string(append(b, '}')), nil
-	}
-
-	return "{}", nil
-}
-
-// appendArray appends rv to the buffer, returning the extended buffer and
-// the delimiter used between elements.
-//
-// It panics when n <= 0 or rv's Kind is not reflect.Array nor reflect.Slice.
-func appendArray(b []byte, rv reflect.Value, n int) ([]byte, string, error) {
-	var del string
-	var err error
-
-	b = append(b, '{')
-
-	if b, del, err = appendArrayElement(b, rv.Index(0)); err != nil {
-		return b, del, err
-	}
-
-	for i := 1; i < n; i++ {
-		b = append(b, del...)
-		if b, del, err = appendArrayElement(b, rv.Index(i)); err != nil {
-			return b, del, err
-		}
-	}
-
-	return append(b, '}'), del, nil
-}
-
-// appendArrayElement appends rv to the buffer, returning the extended buffer
-// and the delimiter to use before the next element.
-//
-// When rv's Kind is neither reflect.Array nor reflect.Slice, it is converted
-// using driver.DefaultParameterConverter and the resulting []byte or string
-// is double-quoted.
-//
-// See http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO
-func appendArrayElement(b []byte, rv reflect.Value) ([]byte, string, error) {
-	if k := rv.Kind(); k == reflect.Array || k == reflect.Slice {
-		if t := rv.Type(); t != typeByteSlice && !t.Implements(typeDriverValuer) {
-			if n := rv.Len(); n > 0 {
-				return appendArray(b, rv, n)
-			}
-
-			return b, "", nil
-		}
-	}
-
-	var del = ","
-	var err error
-	var iv interface{} = rv.Interface()
-
-	if ad, ok := iv.(ArrayDelimiter); ok {
-		del = ad.ArrayDelimiter()
-	}
-
-	if iv, err = driver.DefaultParameterConverter.ConvertValue(iv); err != nil {
-		return b, del, err
-	}
-
-	switch v := iv.(type) {
-	case nil:
-		return append(b, "NULL"...), del, nil
-	case []byte:
-		return appendArrayQuotedBytes(b, v), del, nil
-	case string:
-		return appendArrayQuotedBytes(b, []byte(v)), del, nil
-	}
-
-	b, err = appendValue(b, iv)
-	return b, del, err
-}
-
-func appendArrayQuotedBytes(b, v []byte) []byte {
-	b = append(b, '"')
-	for {
-		i := bytes.IndexAny(v, `"\`)
-		if i < 0 {
-			b = append(b, v...)
-			break
-		}
-		if i > 0 {
-			b = append(b, v[:i]...)
-		}
-		b = append(b, '\\', v[i])
-		v = v[i+1:]
-	}
-	return append(b, '"')
-}
-
-func appendValue(b []byte, v driver.Value) ([]byte, error) {
-	return append(b, encode(nil, v, 0)...), nil
-}
-
-// parseArray extracts the dimensions and elements of an array represented in
-// text format. Only representations emitted by the backend are supported.
-// Notably, whitespace around brackets and delimiters is significant, and NULL
-// is case-sensitive.
-//
-// See http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO
-func parseArray(src, del []byte) (dims []int, elems [][]byte, err error) {
-	var depth, i int
-
-	if len(src) < 1 || src[0] != '{' {
-		return nil, nil, fmt.Errorf("pq: unable to parse array; expected %q at offset %d", '{', 0)
-	}
-
-Open:
-	for i < len(src) {
-		switch src[i] {
-		case '{':
-			depth++
-			i++
-		case '}':
-			elems = make([][]byte, 0)
-			goto Close
-		default:
-			break Open
-		}
-	}
-	dims = make([]int, i)
-
-Element:
-	for i < len(src) {
-		switch src[i] {
-		case '{':
-			if depth == len(dims) {
-				break Element
-			}
-			depth++
-			dims[depth-1] = 0
-			i++
-		case '"':
-			var elem = []byte{}
-			var escape bool
-			for i++; i < len(src); i++ {
-				if escape {
-					elem = append(elem, src[i])
-					escape = false
-				} else {
-					switch src[i] {
-					default:
-						elem = append(elem, src[i])
-					case '\\':
-						escape = true
-					case '"':
-						elems = append(elems, elem)
-						i++
-						break Element
-					}
-				}
-			}
-		default:
-			for start := i; i < len(src); i++ {
-				if bytes.HasPrefix(src[i:], del) || src[i] == '}' {
-					elem := src[start:i]
-					if len(elem) == 0 {
-						return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i)
-					}
-					if bytes.Equal(elem, []byte("NULL")) {
-						elem = nil
-					}
-					elems = append(elems, elem)
-					break Element
-				}
-			}
-		}
-	}
-
-	for i < len(src) {
-		if bytes.HasPrefix(src[i:], del) && depth > 0 {
-			dims[depth-1]++
-			i += len(del)
-			goto Element
-		} else if src[i] == '}' && depth > 0 {
-			dims[depth-1]++
-			depth--
-			i++
-		} else {
-			return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i)
-		}
-	}
-
-Close:
-	for i < len(src) {
-		if src[i] == '}' && depth > 0 {
-			depth--
-			i++
-		} else {
-			return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i)
-		}
-	}
-	if depth > 0 {
-		err = fmt.Errorf("pq: unable to parse array; expected %q at offset %d", '}', i)
-	}
-	if err == nil {
-		for _, d := range dims {
-			if (len(elems) % d) != 0 {
-				err = fmt.Errorf("pq: multidimensional arrays must have elements with matching dimensions")
-			}
-		}
-	}
-	return
-}
-
-func scanLinearArray(src, del []byte, typ string) (elems [][]byte, err error) {
-	dims, elems, err := parseArray(src, del)
-	if err != nil {
-		return nil, err
-	}
-	if len(dims) > 1 {
-		return nil, fmt.Errorf("pq: cannot convert ARRAY%s to %s", strings.Replace(fmt.Sprint(dims), " ", "][", -1), typ)
-	}
-	return elems, err
-}
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/conn.go b/traffic_ops/testing/api/vendor/github.com/lib/pq/conn.go
deleted file mode 100644
index fadb88e5e..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/conn.go
+++ /dev/null
@@ -1,1835 +0,0 @@
-package pq
-
-import (
-	"bufio"
-	"crypto/md5"
-	"database/sql"
-	"database/sql/driver"
-	"encoding/binary"
-	"errors"
-	"fmt"
-	"io"
-	"net"
-	"os"
-	"os/user"
-	"path"
-	"path/filepath"
-	"strconv"
-	"strings"
-	"time"
-	"unicode"
-
-	"github.com/lib/pq/oid"
-)
-
-// Common error types
-var (
-	ErrNotSupported              = errors.New("pq: Unsupported command")
-	ErrInFailedTransaction       = errors.New("pq: Could not complete operation in a failed transaction")
-	ErrSSLNotSupported           = errors.New("pq: SSL is not enabled on the server")
-	ErrSSLKeyHasWorldPermissions = errors.New("pq: Private key file has group or world access. Permissions should be u=rw (0600) or less")
-	ErrCouldNotDetectUsername    = errors.New("pq: Could not detect default username. Please provide one explicitly")
-
-	errUnexpectedReady = errors.New("unexpected ReadyForQuery")
-	errNoRowsAffected  = errors.New("no RowsAffected available after the empty statement")
-	errNoLastInsertID  = errors.New("no LastInsertId available after the empty statement")
-)
-
-// Driver is the Postgres database driver.
-type Driver struct{}
-
-// Open opens a new connection to the database. name is a connection string.
-// Most users should only use it through database/sql package from the standard
-// library.
-func (d *Driver) Open(name string) (driver.Conn, error) {
-	return Open(name)
-}
-
-func init() {
-	sql.Register("postgres", &Driver{})
-}
-
-type parameterStatus struct {
-	// server version in the same format as server_version_num, or 0 if
-	// unavailable
-	serverVersion int
-
-	// the current location based on the TimeZone value of the session, if
-	// available
-	currentLocation *time.Location
-}
-
-type transactionStatus byte
-
-const (
-	txnStatusIdle                transactionStatus = 'I'
-	txnStatusIdleInTransaction   transactionStatus = 'T'
-	txnStatusInFailedTransaction transactionStatus = 'E'
-)
-
-func (s transactionStatus) String() string {
-	switch s {
-	case txnStatusIdle:
-		return "idle"
-	case txnStatusIdleInTransaction:
-		return "idle in transaction"
-	case txnStatusInFailedTransaction:
-		return "in a failed transaction"
-	default:
-		errorf("unknown transactionStatus %d", s)
-	}
-
-	panic("not reached")
-}
-
-// Dialer is the dialer interface. It can be used to obtain more control over
-// how pq creates network connections.
-type Dialer interface {
-	Dial(network, address string) (net.Conn, error)
-	DialTimeout(network, address string, timeout time.Duration) (net.Conn, error)
-}
-
-type defaultDialer struct{}
-
-func (d defaultDialer) Dial(ntw, addr string) (net.Conn, error) {
-	return net.Dial(ntw, addr)
-}
-func (d defaultDialer) DialTimeout(ntw, addr string, timeout time.Duration) (net.Conn, error) {
-	return net.DialTimeout(ntw, addr, timeout)
-}
-
-type conn struct {
-	c         net.Conn
-	buf       *bufio.Reader
-	namei     int
-	scratch   [512]byte
-	txnStatus transactionStatus
-	txnFinish func()
-
-	// Save connection arguments to use during CancelRequest.
-	dialer Dialer
-	opts   values
-
-	// Cancellation key data for use with CancelRequest messages.
-	processID int
-	secretKey int
-
-	parameterStatus parameterStatus
-
-	saveMessageType   byte
-	saveMessageBuffer []byte
-
-	// If true, this connection is bad and all public-facing functions should
-	// return ErrBadConn.
-	bad bool
-
-	// If set, this connection should never use the binary format when
-	// receiving query results from prepared statements.  Only provided for
-	// debugging.
-	disablePreparedBinaryResult bool
-
-	// Whether to always send []byte parameters over as binary.  Enables single
-	// round-trip mode for non-prepared Query calls.
-	binaryParameters bool
-
-	// If true this connection is in the middle of a COPY
-	inCopy bool
-}
-
-// Handle driver-side settings in parsed connection string.
-func (cn *conn) handleDriverSettings(o values) (err error) {
-	boolSetting := func(key string, val *bool) error {
-		if value, ok := o[key]; ok {
-			if value == "yes" {
-				*val = true
-			} else if value == "no" {
-				*val = false
-			} else {
-				return fmt.Errorf("unrecognized value %q for %s", value, key)
-			}
-		}
-		return nil
-	}
-
-	err = boolSetting("disable_prepared_binary_result", &cn.disablePreparedBinaryResult)
-	if err != nil {
-		return err
-	}
-	return boolSetting("binary_parameters", &cn.binaryParameters)
-}
-
-func (cn *conn) handlePgpass(o values) {
-	// if a password was supplied, do not process .pgpass
-	if _, ok := o["password"]; ok {
-		return
-	}
-	filename := os.Getenv("PGPASSFILE")
-	if filename == "" {
-		// XXX this code doesn't work on Windows where the default filename is
-		// XXX %APPDATA%\postgresql\pgpass.conf
-		// Prefer $HOME over user.Current due to glibc bug: golang.org/issue/13470
-		userHome := os.Getenv("HOME")
-		if userHome == "" {
-			user, err := user.Current()
-			if err != nil {
-				return
-			}
-			userHome = user.HomeDir
-		}
-		filename = filepath.Join(userHome, ".pgpass")
-	}
-	fileinfo, err := os.Stat(filename)
-	if err != nil {
-		return
-	}
-	mode := fileinfo.Mode()
-	if mode&(0x77) != 0 {
-		// XXX should warn about incorrect .pgpass permissions as psql does
-		return
-	}
-	file, err := os.Open(filename)
-	if err != nil {
-		return
-	}
-	defer file.Close()
-	scanner := bufio.NewScanner(io.Reader(file))
-	hostname := o["host"]
-	ntw, _ := network(o)
-	port := o["port"]
-	db := o["dbname"]
-	username := o["user"]
-	// From: https://github.com/tg/pgpass/blob/master/reader.go
-	getFields := func(s string) []string {
-		fs := make([]string, 0, 5)
-		f := make([]rune, 0, len(s))
-
-		var esc bool
-		for _, c := range s {
-			switch {
-			case esc:
-				f = append(f, c)
-				esc = false
-			case c == '\\':
-				esc = true
-			case c == ':':
-				fs = append(fs, string(f))
-				f = f[:0]
-			default:
-				f = append(f, c)
-			}
-		}
-		return append(fs, string(f))
-	}
-	for scanner.Scan() {
-		line := scanner.Text()
-		if len(line) == 0 || line[0] == '#' {
-			continue
-		}
-		split := getFields(line)
-		if len(split) != 5 {
-			continue
-		}
-		if (split[0] == "*" || split[0] == hostname || (split[0] == "localhost" && (hostname == "" || ntw == "unix"))) && (split[1] == "*" || split[1] == port) && (split[2] == "*" || split[2] == db) && (split[3] == "*" || split[3] == username) {
-			o["password"] = split[4]
-			return
-		}
-	}
-}
-
-func (cn *conn) writeBuf(b byte) *writeBuf {
-	cn.scratch[0] = b
-	return &writeBuf{
-		buf: cn.scratch[:5],
-		pos: 1,
-	}
-}
-
-// Open opens a new connection to the database. name is a connection string.
-// Most users should only use it through database/sql package from the standard
-// library.
-func Open(name string) (_ driver.Conn, err error) {
-	return DialOpen(defaultDialer{}, name)
-}
-
-// DialOpen opens a new connection to the database using a dialer.
-func DialOpen(d Dialer, name string) (_ driver.Conn, err error) {
-	// Handle any panics during connection initialization.  Note that we
-	// specifically do *not* want to use errRecover(), as that would turn any
-	// connection errors into ErrBadConns, hiding the real error message from
-	// the user.
-	defer errRecoverNoErrBadConn(&err)
-
-	o := make(values)
-
-	// A number of defaults are applied here, in this order:
-	//
-	// * Very low precedence defaults applied in every situation
-	// * Environment variables
-	// * Explicitly passed connection information
-	o["host"] = "localhost"
-	o["port"] = "5432"
-	// N.B.: Extra float digits should be set to 3, but that breaks
-	// Postgres 8.4 and older, where the max is 2.
-	o["extra_float_digits"] = "2"
-	for k, v := range parseEnviron(os.Environ()) {
-		o[k] = v
-	}
-
-	if strings.HasPrefix(name, "postgres://") || strings.HasPrefix(name, "postgresql://") {
-		name, err = ParseURL(name)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	if err := parseOpts(name, o); err != nil {
-		return nil, err
-	}
-
-	// Use the "fallback" application name if necessary
-	if fallback, ok := o["fallback_application_name"]; ok {
-		if _, ok := o["application_name"]; !ok {
-			o["application_name"] = fallback
-		}
-	}
-
-	// We can't work with any client_encoding other than UTF-8 currently.
-	// However, we have historically allowed the user to set it to UTF-8
-	// explicitly, and there's no reason to break such programs, so allow that.
-	// Note that the "options" setting could also set client_encoding, but
-	// parsing its value is not worth it.  Instead, we always explicitly send
-	// client_encoding as a separate run-time parameter, which should override
-	// anything set in options.
-	if enc, ok := o["client_encoding"]; ok && !isUTF8(enc) {
-		return nil, errors.New("client_encoding must be absent or 'UTF8'")
-	}
-	o["client_encoding"] = "UTF8"
-	// DateStyle needs a similar treatment.
-	if datestyle, ok := o["datestyle"]; ok {
-		if datestyle != "ISO, MDY" {
-			panic(fmt.Sprintf("setting datestyle must be absent or %v; got %v",
-				"ISO, MDY", datestyle))
-		}
-	} else {
-		o["datestyle"] = "ISO, MDY"
-	}
-
-	// If a user is not provided by any other means, the last
-	// resort is to use the current operating system provided user
-	// name.
-	if _, ok := o["user"]; !ok {
-		u, err := userCurrent()
-		if err != nil {
-			return nil, err
-		}
-		o["user"] = u
-	}
-
-	cn := &conn{
-		opts:   o,
-		dialer: d,
-	}
-	err = cn.handleDriverSettings(o)
-	if err != nil {
-		return nil, err
-	}
-	cn.handlePgpass(o)
-
-	cn.c, err = dial(d, o)
-	if err != nil {
-		return nil, err
-	}
-	cn.ssl(o)
-	cn.buf = bufio.NewReader(cn.c)
-	cn.startup(o)
-
-	// reset the deadline, in case one was set (see dial)
-	if timeout, ok := o["connect_timeout"]; ok && timeout != "0" {
-		err = cn.c.SetDeadline(time.Time{})
-	}
-	return cn, err
-}
-
-func dial(d Dialer, o values) (net.Conn, error) {
-	ntw, addr := network(o)
-	// SSL is not necessary or supported over UNIX domain sockets
-	if ntw == "unix" {
-		o["sslmode"] = "disable"
-	}
-
-	// Zero or not specified means wait indefinitely.
-	if timeout, ok := o["connect_timeout"]; ok && timeout != "0" {
-		seconds, err := strconv.ParseInt(timeout, 10, 0)
-		if err != nil {
-			return nil, fmt.Errorf("invalid value for parameter connect_timeout: %s", err)
-		}
-		duration := time.Duration(seconds) * time.Second
-		// connect_timeout should apply to the entire connection establishment
-		// procedure, so we both use a timeout for the TCP connection
-		// establishment and set a deadline for doing the initial handshake.
-		// The deadline is then reset after startup() is done.
-		deadline := time.Now().Add(duration)
-		conn, err := d.DialTimeout(ntw, addr, duration)
-		if err != nil {
-			return nil, err
-		}
-		err = conn.SetDeadline(deadline)
-		return conn, err
-	}
-	return d.Dial(ntw, addr)
-}
-
-func network(o values) (string, string) {
-	host := o["host"]
-
-	if strings.HasPrefix(host, "/") {
-		sockPath := path.Join(host, ".s.PGSQL."+o["port"])
-		return "unix", sockPath
-	}
-
-	return "tcp", net.JoinHostPort(host, o["port"])
-}
-
-type values map[string]string
-
-// scanner implements a tokenizer for libpq-style option strings.
-type scanner struct {
-	s []rune
-	i int
-}
-
-// newScanner returns a new scanner initialized with the option string s.
-func newScanner(s string) *scanner {
-	return &scanner{[]rune(s), 0}
-}
-
-// Next returns the next rune.
-// It returns 0, false if the end of the text has been reached.
-func (s *scanner) Next() (rune, bool) {
-	if s.i >= len(s.s) {
-		return 0, false
-	}
-	r := s.s[s.i]
-	s.i++
-	return r, true
-}
-
-// SkipSpaces returns the next non-whitespace rune.
-// It returns 0, false if the end of the text has been reached.
-func (s *scanner) SkipSpaces() (rune, bool) {
-	r, ok := s.Next()
-	for unicode.IsSpace(r) && ok {
-		r, ok = s.Next()
-	}
-	return r, ok
-}
-
-// parseOpts parses the options from name and adds them to the values.
-//
-// The parsing code is based on conninfo_parse from libpq's fe-connect.c
-func parseOpts(name string, o values) error {
-	s := newScanner(name)
-
-	for {
-		var (
-			keyRunes, valRunes []rune
-			r                  rune
-			ok                 bool
-		)
-
-		if r, ok = s.SkipSpaces(); !ok {
-			break
-		}
-
-		// Scan the key
-		for !unicode.IsSpace(r) && r != '=' {
-			keyRunes = append(keyRunes, r)
-			if r, ok = s.Next(); !ok {
-				break
-			}
-		}
-
-		// Skip any whitespace if we're not at the = yet
-		if r != '=' {
-			r, ok = s.SkipSpaces()
-		}
-
-		// The current character should be =
-		if r != '=' || !ok {
-			return fmt.Errorf(`missing "=" after %q in connection info string"`, string(keyRunes))
-		}
-
-		// Skip any whitespace after the =
-		if r, ok = s.SkipSpaces(); !ok {
-			// If we reach the end here, the last value is just an empty string as per libpq.
-			o[string(keyRunes)] = ""
-			break
-		}
-
-		if r != '\'' {
-			for !unicode.IsSpace(r) {
-				if r == '\\' {
-					if r, ok = s.Next(); !ok {
-						return fmt.Errorf(`missing character after backslash`)
-					}
-				}
-				valRunes = append(valRunes, r)
-
-				if r, ok = s.Next(); !ok {
-					break
-				}
-			}
-		} else {
-		quote:
-			for {
-				if r, ok = s.Next(); !ok {
-					return fmt.Errorf(`unterminated quoted string literal in connection string`)
-				}
-				switch r {
-				case '\'':
-					break quote
-				case '\\':
-					r, _ = s.Next()
-					fallthrough
-				default:
-					valRunes = append(valRunes, r)
-				}
-			}
-		}
-
-		o[string(keyRunes)] = string(valRunes)
-	}
-
-	return nil
-}
-
-func (cn *conn) isInTransaction() bool {
-	return cn.txnStatus == txnStatusIdleInTransaction ||
-		cn.txnStatus == txnStatusInFailedTransaction
-}
-
-func (cn *conn) checkIsInTransaction(intxn bool) {
-	if cn.isInTransaction() != intxn {
-		cn.bad = true
-		errorf("unexpected transaction status %v", cn.txnStatus)
-	}
-}
-
-func (cn *conn) Begin() (_ driver.Tx, err error) {
-	return cn.begin("")
-}
-
-func (cn *conn) begin(mode string) (_ driver.Tx, err error) {
-	if cn.bad {
-		return nil, driver.ErrBadConn
-	}
-	defer cn.errRecover(&err)
-
-	cn.checkIsInTransaction(false)
-	_, commandTag, err := cn.simpleExec("BEGIN" + mode)
-	if err != nil {
-		return nil, err
-	}
-	if commandTag != "BEGIN" {
-		cn.bad = true
-		return nil, fmt.Errorf("unexpected command tag %s", commandTag)
-	}
-	if cn.txnStatus != txnStatusIdleInTransaction {
-		cn.bad = true
-		return nil, fmt.Errorf("unexpected transaction status %v", cn.txnStatus)
-	}
-	return cn, nil
-}
-
-func (cn *conn) closeTxn() {
-	if finish := cn.txnFinish; finish != nil {
-		finish()
-	}
-}
-
-func (cn *conn) Commit() (err error) {
-	defer cn.closeTxn()
-	if cn.bad {
-		return driver.ErrBadConn
-	}
-	defer cn.errRecover(&err)
-
-	cn.checkIsInTransaction(true)
-	// We don't want the client to think that everything is okay if it tries
-	// to commit a failed transaction.  However, no matter what we return,
-	// database/sql will release this connection back into the free connection
-	// pool so we have to abort the current transaction here.  Note that you
-	// would get the same behaviour if you issued a COMMIT in a failed
-	// transaction, so it's also the least surprising thing to do here.
-	if cn.txnStatus == txnStatusInFailedTransaction {
-		if err := cn.Rollback(); err != nil {
-			return err
-		}
-		return ErrInFailedTransaction
-	}
-
-	_, commandTag, err := cn.simpleExec("COMMIT")
-	if err != nil {
-		if cn.isInTransaction() {
-			cn.bad = true
-		}
-		return err
-	}
-	if commandTag != "COMMIT" {
-		cn.bad = true
-		return fmt.Errorf("unexpected command tag %s", commandTag)
-	}
-	cn.checkIsInTransaction(false)
-	return nil
-}
-
-func (cn *conn) Rollback() (err error) {
-	defer cn.closeTxn()
-	if cn.bad {
-		return driver.ErrBadConn
-	}
-	defer cn.errRecover(&err)
-
-	cn.checkIsInTransaction(true)
-	_, commandTag, err := cn.simpleExec("ROLLBACK")
-	if err != nil {
-		if cn.isInTransaction() {
-			cn.bad = true
-		}
-		return err
-	}
-	if commandTag != "ROLLBACK" {
-		return fmt.Errorf("unexpected command tag %s", commandTag)
-	}
-	cn.checkIsInTransaction(false)
-	return nil
-}
-
-func (cn *conn) gname() string {
-	cn.namei++
-	return strconv.FormatInt(int64(cn.namei), 10)
-}
-
-func (cn *conn) simpleExec(q string) (res driver.Result, commandTag string, err error) {
-	b := cn.writeBuf('Q')
-	b.string(q)
-	cn.send(b)
-
-	for {
-		t, r := cn.recv1()
-		switch t {
-		case 'C':
-			res, commandTag = cn.parseComplete(r.string())
-		case 'Z':
-			cn.processReadyForQuery(r)
-			if res == nil && err == nil {
-				err = errUnexpectedReady
-			}
-			// done
-			return
-		case 'E':
-			err = parseError(r)
-		case 'I':
-			res = emptyRows
-		case 'T', 'D':
-			// ignore any results
-		default:
-			cn.bad = true
-			errorf("unknown response for simple query: %q", t)
-		}
-	}
-}
-
-func (cn *conn) simpleQuery(q string) (res *rows, err error) {
-	defer cn.errRecover(&err)
-
-	b := cn.writeBuf('Q')
-	b.string(q)
-	cn.send(b)
-
-	for {
-		t, r := cn.recv1()
-		switch t {
-		case 'C', 'I':
-			// We allow queries which don't return any results through Query as
-			// well as Exec.  We still have to give database/sql a rows object
-			// the user can close, though, to avoid connections from being
-			// leaked.  A "rows" with done=true works fine for that purpose.
-			if err != nil {
-				cn.bad = true
-				errorf("unexpected message %q in simple query execution", t)
-			}
-			if res == nil {
-				res = &rows{
-					cn: cn,
-				}
-			}
-			// Set the result and tag to the last command complete if there wasn't a
-			// query already run. Although queries usually return from here and cede
-			// control to Next, a query with zero results does not.
-			if t == 'C' && res.colNames == nil {
-				res.result, res.tag = cn.parseComplete(r.string())
-			}
-			res.done = true
-		case 'Z':
-			cn.processReadyForQuery(r)
-			// done
-			return
-		case 'E':
-			res = nil
-			err = parseError(r)
-		case 'D':
-			if res == nil {
-				cn.bad = true
-				errorf("unexpected DataRow in simple query execution")
-			}
-			// the query didn't fail; kick off to Next
-			cn.saveMessage(t, r)
-			return
-		case 'T':
-			// res might be non-nil here if we received a previous
-			// CommandComplete, but that's fine; just overwrite it
-			res = &rows{cn: cn}
-			res.colNames, res.colFmts, res.colTyps = parsePortalRowDescribe(r)
-
-			// To work around a bug in QueryRow in Go 1.2 and earlier, wait
-			// until the first DataRow has been received.
-		default:
-			cn.bad = true
-			errorf("unknown response for simple query: %q", t)
-		}
-	}
-}
-
-type noRows struct{}
-
-var emptyRows noRows
-
-var _ driver.Result = noRows{}
-
-func (noRows) LastInsertId() (int64, error) {
-	return 0, errNoLastInsertID
-}
-
-func (noRows) RowsAffected() (int64, error) {
-	return 0, errNoRowsAffected
-}
-
-// Decides which column formats to use for a prepared statement.  The input is
-// an array of type oids, one element per result column.
-func decideColumnFormats(colTyps []fieldDesc, forceText bool) (colFmts []format, colFmtData []byte) {
-	if len(colTyps) == 0 {
-		return nil, colFmtDataAllText
-	}
-
-	colFmts = make([]format, len(colTyps))
-	if forceText {
-		return colFmts, colFmtDataAllText
-	}
-
-	allBinary := true
-	allText := true
-	for i, t := range colTyps {
-		switch t.OID {
-		// This is the list of types to use binary mode for when receiving them
-		// through a prepared statement.  If a type appears in this list, it
-		// must also be implemented in binaryDecode in encode.go.
-		case oid.T_bytea:
-			fallthrough
-		case oid.T_int8:
-			fallthrough
-		case oid.T_int4:
-			fallthrough
-		case oid.T_int2:
-			fallthrough
-		case oid.T_uuid:
-			colFmts[i] = formatBinary
-			allText = false
-
-		default:
-			allBinary = false
-		}
-	}
-
-	if allBinary {
-		return colFmts, colFmtDataAllBinary
-	} else if allText {
-		return colFmts, colFmtDataAllText
-	} else {
-		colFmtData = make([]byte, 2+len(colFmts)*2)
-		binary.BigEndian.PutUint16(colFmtData, uint16(len(colFmts)))
-		for i, v := range colFmts {
-			binary.BigEndian.PutUint16(colFmtData[2+i*2:], uint16(v))
-		}
-		return colFmts, colFmtData
-	}
-}
-
-func (cn *conn) prepareTo(q, stmtName string) *stmt {
-	st := &stmt{cn: cn, name: stmtName}
-
-	b := cn.writeBuf('P')
-	b.string(st.name)
-	b.string(q)
-	b.int16(0)
-
-	b.next('D')
-	b.byte('S')
-	b.string(st.name)
-
-	b.next('S')
-	cn.send(b)
-
-	cn.readParseResponse()
-	st.paramTyps, st.colNames, st.colTyps = cn.readStatementDescribeResponse()
-	st.colFmts, st.colFmtData = decideColumnFormats(st.colTyps, cn.disablePreparedBinaryResult)
-	cn.readReadyForQuery()
-	return st
-}
-
-func (cn *conn) Prepare(q string) (_ driver.Stmt, err error) {
-	if cn.bad {
-		return nil, driver.ErrBadConn
-	}
-	defer cn.errRecover(&err)
-
-	if len(q) >= 4 && strings.EqualFold(q[:4], "COPY") {
-		s, err := cn.prepareCopyIn(q)
-		if err == nil {
-			cn.inCopy = true
-		}
-		return s, err
-	}
-	return cn.prepareTo(q, cn.gname()), nil
-}
-
-func (cn *conn) Close() (err error) {
-	// Skip cn.bad return here because we always want to close a connection.
-	defer cn.errRecover(&err)
-
-	// Ensure that cn.c.Close is always run. Since error handling is done with
-	// panics and cn.errRecover, the Close must be in a defer.
-	defer func() {
-		cerr := cn.c.Close()
-		if err == nil {
-			err = cerr
-		}
-	}()
-
-	// Don't go through send(); ListenerConn relies on us not scribbling on the
-	// scratch buffer of this connection.
-	return cn.sendSimpleMessage('X')
-}
-
-// Implement the "Queryer" interface
-func (cn *conn) Query(query string, args []driver.Value) (driver.Rows, error) {
-	return cn.query(query, args)
-}
-
-func (cn *conn) query(query string, args []driver.Value) (_ *rows, err error) {
-	if cn.bad {
-		return nil, driver.ErrBadConn
-	}
-	if cn.inCopy {
-		return nil, errCopyInProgress
-	}
-	defer cn.errRecover(&err)
-
-	// Check to see if we can use the "simpleQuery" interface, which is
-	// *much* faster than going through prepare/exec
-	if len(args) == 0 {
-		return cn.simpleQuery(query)
-	}
-
-	if cn.binaryParameters {
-		cn.sendBinaryModeQuery(query, args)
-
-		cn.readParseResponse()
-		cn.readBindResponse()
-		rows := &rows{cn: cn}
-		rows.colNames, rows.colFmts, rows.colTyps = cn.readPortalDescribeResponse()
-		cn.postExecuteWorkaround()
-		return rows, nil
-	}
-	st := cn.prepareTo(query, "")
-	st.exec(args)
-	return &rows{
-		cn:       cn,
-		colNames: st.colNames,
-		colTyps:  st.colTyps,
-		colFmts:  st.colFmts,
-	}, nil
-}
-
-// Implement the optional "Execer" interface for one-shot queries
-func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err error) {
-	if cn.bad {
-		return nil, driver.ErrBadConn
-	}
-	defer cn.errRecover(&err)
-
-	// Check to see if we can use the "simpleExec" interface, which is
-	// *much* faster than going through prepare/exec
-	if len(args) == 0 {
-		// ignore commandTag, our caller doesn't care
-		r, _, err := cn.simpleExec(query)
-		return r, err
-	}
-
-	if cn.binaryParameters {
-		cn.sendBinaryModeQuery(query, args)
-
-		cn.readParseResponse()
-		cn.readBindResponse()
-		cn.readPortalDescribeResponse()
-		cn.postExecuteWorkaround()
-		res, _, err = cn.readExecuteResponse("Execute")
-		return res, err
-	}
-	// Use the unnamed statement to defer planning until bind
-	// time, or else value-based selectivity estimates cannot be
-	// used.
-	st := cn.prepareTo(query, "")
-	r, err := st.Exec(args)
-	if err != nil {
-		panic(err)
-	}
-	return r, err
-}
-
-func (cn *conn) send(m *writeBuf) {
-	_, err := cn.c.Write(m.wrap())
-	if err != nil {
-		panic(err)
-	}
-}
-
-func (cn *conn) sendStartupPacket(m *writeBuf) error {
-	_, err := cn.c.Write((m.wrap())[1:])
-	return err
-}
-
-// Send a message of type typ to the server on the other end of cn.  The
-// message should have no payload.  This method does not use the scratch
-// buffer.
-func (cn *conn) sendSimpleMessage(typ byte) (err error) {
-	_, err = cn.c.Write([]byte{typ, '\x00', '\x00', '\x00', '\x04'})
-	return err
-}
-
-// saveMessage memorizes a message and its buffer in the conn struct.
-// recvMessage will then return these values on the next call to it.  This
-// method is useful in cases where you have to see what the next message is
-// going to be (e.g. to see whether it's an error or not) but you can't handle
-// the message yourself.
-func (cn *conn) saveMessage(typ byte, buf *readBuf) {
-	if cn.saveMessageType != 0 {
-		cn.bad = true
-		errorf("unexpected saveMessageType %d", cn.saveMessageType)
-	}
-	cn.saveMessageType = typ
-	cn.saveMessageBuffer = *buf
-}
-
-// recvMessage receives any message from the backend, or returns an error if
-// a problem occurred while reading the message.
-func (cn *conn) recvMessage(r *readBuf) (byte, error) {
-	// workaround for a QueryRow bug, see exec
-	if cn.saveMessageType != 0 {
-		t := cn.saveMessageType
-		*r = cn.saveMessageBuffer
-		cn.saveMessageType = 0
-		cn.saveMessageBuffer = nil
-		return t, nil
-	}
-
-	x := cn.scratch[:5]
-	_, err := io.ReadFull(cn.buf, x)
-	if err != nil {
-		return 0, err
-	}
-
-	// read the type and length of the message that follows
-	t := x[0]
-	n := int(binary.BigEndian.Uint32(x[1:])) - 4
-	var y []byte
-	if n <= len(cn.scratch) {
-		y = cn.scratch[:n]
-	} else {
-		y = make([]byte, n)
-	}
-	_, err = io.ReadFull(cn.buf, y)
-	if err != nil {
-		return 0, err
-	}
-	*r = y
-	return t, nil
-}
-
-// recv receives a message from the backend, but if an error happened while
-// reading the message or the received message was an ErrorResponse, it panics.
-// NoticeResponses are ignored.  This function should generally be used only
-// during the startup sequence.
-func (cn *conn) recv() (t byte, r *readBuf) {
-	for {
-		var err error
-		r = &readBuf{}
-		t, err = cn.recvMessage(r)
-		if err != nil {
-			panic(err)
-		}
-
-		switch t {
-		case 'E':
-			panic(parseError(r))
-		case 'N':
-			// ignore
-		default:
-			return
-		}
-	}
-}
-
-// recv1Buf is exactly equivalent to recv1, except it uses a buffer supplied by
-// the caller to avoid an allocation.
-func (cn *conn) recv1Buf(r *readBuf) byte {
-	for {
-		t, err := cn.recvMessage(r)
-		if err != nil {
-			panic(err)
-		}
-
-		switch t {
-		case 'A', 'N':
-			// ignore
-		case 'S':
-			cn.processParameterStatus(r)
-		default:
-			return t
-		}
-	}
-}
-
-// recv1 receives a message from the backend, panicking if an error occurs
-// while attempting to read it.  All asynchronous messages are ignored, with
-// the exception of ErrorResponse.
-func (cn *conn) recv1() (t byte, r *readBuf) {
-	r = &readBuf{}
-	t = cn.recv1Buf(r)
-	return t, r
-}
-
-func (cn *conn) ssl(o values) {
-	upgrade := ssl(o)
-	if upgrade == nil {
-		// Nothing to do
-		return
-	}
-
-	w := cn.writeBuf(0)
-	w.int32(80877103)
-	if err := cn.sendStartupPacket(w); err != nil {
-		panic(err)
-	}
-
-	b := cn.scratch[:1]
-	_, err := io.ReadFull(cn.c, b)
-	if err != nil {
-		panic(err)
-	}
-
-	if b[0] != 'S' {
-		panic(ErrSSLNotSupported)
-	}
-
-	cn.c = upgrade(cn.c)
-}
-
-// isDriverSetting returns true iff a setting is purely for configuring the
-// driver's options and should not be sent to the server in the connection
-// startup packet.
-func isDriverSetting(key string) bool {
-	switch key {
-	case "host", "port":
-		return true
-	case "password":
-		return true
-	case "sslmode", "sslcert", "sslkey", "sslrootcert":
-		return true
-	case "fallback_application_name":
-		return true
-	case "connect_timeout":
-		return true
-	case "disable_prepared_binary_result":
-		return true
-	case "binary_parameters":
-		return true
-
-	default:
-		return false
-	}
-}
-
-func (cn *conn) startup(o values) {
-	w := cn.writeBuf(0)
-	w.int32(196608)
-	// Send the backend the name of the database we want to connect to, and the
-	// user we want to connect as.  Additionally, we send over any run-time
-	// parameters potentially included in the connection string.  If the server
-	// doesn't recognize any of them, it will reply with an error.
-	for k, v := range o {
-		if isDriverSetting(k) {
-			// skip options which can't be run-time parameters
-			continue
-		}
-		// The protocol requires us to supply the database name as "database"
-		// instead of "dbname".
-		if k == "dbname" {
-			k = "database"
-		}
-		w.string(k)
-		w.string(v)
-	}
-	w.string("")
-	if err := cn.sendStartupPacket(w); err != nil {
-		panic(err)
-	}
-
-	for {
-		t, r := cn.recv()
-		switch t {
-		case 'K':
-			cn.processBackendKeyData(r)
-		case 'S':
-			cn.processParameterStatus(r)
-		case 'R':
-			cn.auth(r, o)
-		case 'Z':
-			cn.processReadyForQuery(r)
-			return
-		default:
-			errorf("unknown response for startup: %q", t)
-		}
-	}
-}
-
-func (cn *conn) auth(r *readBuf, o values) {
-	switch code := r.int32(); code {
-	case 0:
-		// OK
-	case 3:
-		w := cn.writeBuf('p')
-		w.string(o["password"])
-		cn.send(w)
-
-		t, r := cn.recv()
-		if t != 'R' {
-			errorf("unexpected password response: %q", t)
-		}
-
-		if r.int32() != 0 {
-			errorf("unexpected authentication response: %q", t)
-		}
-	case 5:
-		s := string(r.next(4))
-		w := cn.writeBuf('p')
-		w.string("md5" + md5s(md5s(o["password"]+o["user"])+s))
-		cn.send(w)
-
-		t, r := cn.recv()
-		if t != 'R' {
-			errorf("unexpected password response: %q", t)
-		}
-
-		if r.int32() != 0 {
-			errorf("unexpected authentication response: %q", t)
-		}
-	default:
-		errorf("unknown authentication response: %d", code)
-	}
-}
-
-type format int
-
-const formatText format = 0
-const formatBinary format = 1
-
-// One result-column format code with the value 1 (i.e. all binary).
-var colFmtDataAllBinary = []byte{0, 1, 0, 1}
-
-// No result-column format codes (i.e. all text).
-var colFmtDataAllText = []byte{0, 0}
-
-type stmt struct {
-	cn         *conn
-	name       string
-	colNames   []string
-	colFmts    []format
-	colFmtData []byte
-	colTyps    []fieldDesc
-	paramTyps  []oid.Oid
-	closed     bool
-}
-
-func (st *stmt) Close() (err error) {
-	if st.closed {
-		return nil
-	}
-	if st.cn.bad {
-		return driver.ErrBadConn
-	}
-	defer st.cn.errRecover(&err)
-
-	w := st.cn.writeBuf('C')
-	w.byte('S')
-	w.string(st.name)
-	st.cn.send(w)
-
-	st.cn.send(st.cn.writeBuf('S'))
-
-	t, _ := st.cn.recv1()
-	if t != '3' {
-		st.cn.bad = true
-		errorf("unexpected close response: %q", t)
-	}
-	st.closed = true
-
-	t, r := st.cn.recv1()
-	if t != 'Z' {
-		st.cn.bad = true
-		errorf("expected ready for query, but got: %q", t)
-	}
-	st.cn.processReadyForQuery(r)
-
-	return nil
-}
-
-func (st *stmt) Query(v []driver.Value) (r driver.Rows, err error) {
-	if st.cn.bad {
-		return nil, driver.ErrBadConn
-	}
-	defer st.cn.errRecover(&err)
-
-	st.exec(v)
-	return &rows{
-		cn:       st.cn,
-		colNames: st.colNames,
-		colTyps:  st.colTyps,
-		colFmts:  st.colFmts,
-	}, nil
-}
-
-func (st *stmt) Exec(v []driver.Value) (res driver.Result, err error) {
-	if st.cn.bad {
-		return nil, driver.ErrBadConn
-	}
-	defer st.cn.errRecover(&err)
-
-	st.exec(v)
-	res, _, err = st.cn.readExecuteResponse("simple query")
-	return res, err
-}
-
-func (st *stmt) exec(v []driver.Value) {
-	if len(v) >= 65536 {
-		errorf("got %d parameters but PostgreSQL only supports 65535 parameters", len(v))
-	}
-	if len(v) != len(st.paramTyps) {
-		errorf("got %d parameters but the statement requires %d", len(v), len(st.paramTyps))
-	}
-
-	cn := st.cn
-	w := cn.writeBuf('B')
-	w.byte(0) // unnamed portal
-	w.string(st.name)
-
-	if cn.binaryParameters {
-		cn.sendBinaryParameters(w, v)
-	} else {
-		w.int16(0)
-		w.int16(len(v))
-		for i, x := range v {
-			if x == nil {
-				w.int32(-1)
-			} else {
-				b := encode(&cn.parameterStatus, x, st.paramTyps[i])
-				w.int32(len(b))
-				w.bytes(b)
-			}
-		}
-	}
-	w.bytes(st.colFmtData)
-
-	w.next('E')
-	w.byte(0)
-	w.int32(0)
-
-	w.next('S')
-	cn.send(w)
-
-	cn.readBindResponse()
-	cn.postExecuteWorkaround()
-
-}
-
-func (st *stmt) NumInput() int {
-	return len(st.paramTyps)
-}
-
-// parseComplete parses the "command tag" from a CommandComplete message, and
-// returns the number of rows affected (if applicable) and a string
-// identifying only the command that was executed, e.g. "ALTER TABLE".  If the
-// command tag could not be parsed, parseComplete panics.
-func (cn *conn) parseComplete(commandTag string) (driver.Result, string) {
-	commandsWithAffectedRows := []string{
-		"SELECT ",
-		// INSERT is handled below
-		"UPDATE ",
-		"DELETE ",
-		"FETCH ",
-		"MOVE ",
-		"COPY ",
-	}
-
-	var affectedRows *string
-	for _, tag := range commandsWithAffectedRows {
-		if strings.HasPrefix(commandTag, tag) {
-			t := commandTag[len(tag):]
-			affectedRows = &t
-			commandTag = tag[:len(tag)-1]
-			break
-		}
-	}
-	// INSERT also includes the oid of the inserted row in its command tag.
-	// Oids in user tables are deprecated, and the oid is only returned when
-	// exactly one row is inserted, so it's unlikely to be of value to any
-	// real-world application and we can ignore it.
-	if affectedRows == nil && strings.HasPrefix(commandTag, "INSERT ") {
-		parts := strings.Split(commandTag, " ")
-		if len(parts) != 3 {
-			cn.bad = true
-			errorf("unexpected INSERT command tag %s", commandTag)
-		}
-		affectedRows = &parts[len(parts)-1]
-		commandTag = "INSERT"
-	}
-	// There should be no affected rows attached to the tag, just return it
-	if affectedRows == nil {
-		return driver.RowsAffected(0), commandTag
-	}
-	n, err := strconv.ParseInt(*affectedRows, 10, 64)
-	if err != nil {
-		cn.bad = true
-		errorf("could not parse commandTag: %s", err)
-	}
-	return driver.RowsAffected(n), commandTag
-}
-
-type rows struct {
-	cn       *conn
-	finish   func()
-	colNames []string
-	colTyps  []fieldDesc
-	colFmts  []format
-	done     bool
-	rb       readBuf
-	result   driver.Result
-	tag      string
-}
-
-func (rs *rows) Close() error {
-	if finish := rs.finish; finish != nil {
-		defer finish()
-	}
-	// no need to look at cn.bad as Next() will
-	for {
-		err := rs.Next(nil)
-		switch err {
-		case nil:
-		case io.EOF:
-			// rs.Next can return io.EOF on both 'Z' (ready for query) and 'T' (row
-			// description, used with HasNextResultSet). We need to fetch messages until
-			// we hit a 'Z', which is done by waiting for done to be set.
-			if rs.done {
-				return nil
-			}
-		default:
-			return err
-		}
-	}
-}
-
-func (rs *rows) Columns() []string {
-	return rs.colNames
-}
-
-func (rs *rows) Result() driver.Result {
-	if rs.result == nil {
-		return emptyRows
-	}
-	return rs.result
-}
-
-func (rs *rows) Tag() string {
-	return rs.tag
-}
-
-func (rs *rows) Next(dest []driver.Value) (err error) {
-	if rs.done {
-		return io.EOF
-	}
-
-	conn := rs.cn
-	if conn.bad {
-		return driver.ErrBadConn
-	}
-	defer conn.errRecover(&err)
-
-	for {
-		t := conn.recv1Buf(&rs.rb)
-		switch t {
-		case 'E':
-			err = parseError(&rs.rb)
-		case 'C', 'I':
-			if t == 'C' {
-				rs.result, rs.tag = conn.parseComplete(rs.rb.string())
-			}
-			continue
-		case 'Z':
-			conn.processReadyForQuery(&rs.rb)
-			rs.done = true
-			if err != nil {
-				return err
-			}
-			return io.EOF
-		case 'D':
-			n := rs.rb.int16()
-			if err != nil {
-				conn.bad = true
-				errorf("unexpected DataRow after error %s", err)
-			}
-			if n < len(dest) {
-				dest = dest[:n]
-			}
-			for i := range dest {
-				l := rs.rb.int32()
-				if l == -1 {
-					dest[i] = nil
-					continue
-				}
-				dest[i] = decode(&conn.parameterStatus, rs.rb.next(l), rs.colTyps[i].OID, rs.colFmts[i])
-			}
-			return
-		case 'T':
-			rs.colNames, rs.colFmts, rs.colTyps = parsePortalRowDescribe(&rs.rb)
-			return io.EOF
-		default:
-			errorf("unexpected message after execute: %q", t)
-		}
-	}
-}
-
-func (rs *rows) HasNextResultSet() bool {
-	return !rs.done
-}
-
-func (rs *rows) NextResultSet() error {
-	return nil
-}
-
-// QuoteIdentifier quotes an "identifier" (e.g. a table or a column name) to be
-// used as part of an SQL statement.  For example:
-//
-//    tblname := "my_table"
-//    data := "my_data"
-//    quoted := pq.QuoteIdentifier(tblname)
-//    err := db.Exec(fmt.Sprintf("INSERT INTO %s VALUES ($1)", quoted), data)
-//
-// Any double quotes in name will be escaped.  The quoted identifier will be
-// case sensitive when used in a query.  If the input string contains a zero
-// byte, the result will be truncated immediately before it.
-func QuoteIdentifier(name string) string {
-	end := strings.IndexRune(name, 0)
-	if end > -1 {
-		name = name[:end]
-	}
-	return `"` + strings.Replace(name, `"`, `""`, -1) + `"`
-}
-
-func md5s(s string) string {
-	h := md5.New()
-	h.Write([]byte(s))
-	return fmt.Sprintf("%x", h.Sum(nil))
-}
-
-func (cn *conn) sendBinaryParameters(b *writeBuf, args []driver.Value) {
-	// Do one pass over the parameters to see if we're going to send any of
-	// them over in binary.  If we are, create a paramFormats array at the
-	// same time.
-	var paramFormats []int
-	for i, x := range args {
-		_, ok := x.([]byte)
-		if ok {
-			if paramFormats == nil {
-				paramFormats = make([]int, len(args))
-			}
-			paramFormats[i] = 1
-		}
-	}
-	if paramFormats == nil {
-		b.int16(0)
-	} else {
-		b.int16(len(paramFormats))
-		for _, x := range paramFormats {
-			b.int16(x)
-		}
-	}
-
-	b.int16(len(args))
-	for _, x := range args {
-		if x == nil {
-			b.int32(-1)
-		} else {
-			datum := binaryEncode(&cn.parameterStatus, x)
-			b.int32(len(datum))
-			b.bytes(datum)
-		}
-	}
-}
-
-func (cn *conn) sendBinaryModeQuery(query string, args []driver.Value) {
-	if len(args) >= 65536 {
-		errorf("got %d parameters but PostgreSQL only supports 65535 parameters", len(args))
-	}
-
-	b := cn.writeBuf('P')
-	b.byte(0) // unnamed statement
-	b.string(query)
-	b.int16(0)
-
-	b.next('B')
-	b.int16(0) // unnamed portal and statement
-	cn.sendBinaryParameters(b, args)
-	b.bytes(colFmtDataAllText)
-
-	b.next('D')
-	b.byte('P')
-	b.byte(0) // unnamed portal
-
-	b.next('E')
-	b.byte(0)
-	b.int32(0)
-
-	b.next('S')
-	cn.send(b)
-}
-
-func (cn *conn) processParameterStatus(r *readBuf) {
-	var err error
-
-	param := r.string()
-	switch param {
-	case "server_version":
-		var major1 int
-		var major2 int
-		var minor int
-		_, err = fmt.Sscanf(r.string(), "%d.%d.%d", &major1, &major2, &minor)
-		if err == nil {
-			cn.parameterStatus.serverVersion = major1*10000 + major2*100 + minor
-		}
-
-	case "TimeZone":
-		cn.parameterStatus.currentLocation, err = time.LoadLocation(r.string())
-		if err != nil {
-			cn.parameterStatus.currentLocation = nil
-		}
-
-	default:
-		// ignore
-	}
-}
-
-func (cn *conn) processReadyForQuery(r *readBuf) {
-	cn.txnStatus = transactionStatus(r.byte())
-}
-
-func (cn *conn) readReadyForQuery() {
-	t, r := cn.recv1()
-	switch t {
-	case 'Z':
-		cn.processReadyForQuery(r)
-		return
-	default:
-		cn.bad = true
-		errorf("unexpected message %q; expected ReadyForQuery", t)
-	}
-}
-
-func (cn *conn) processBackendKeyData(r *readBuf) {
-	cn.processID = r.int32()
-	cn.secretKey = r.int32()
-}
-
-func (cn *conn) readParseResponse() {
-	t, r := cn.recv1()
-	switch t {
-	case '1':
-		return
-	case 'E':
-		err := parseError(r)
-		cn.readReadyForQuery()
-		panic(err)
-	default:
-		cn.bad = true
-		errorf("unexpected Parse response %q", t)
-	}
-}
-
-func (cn *conn) readStatementDescribeResponse() (paramTyps []oid.Oid, colNames []string, colTyps []fieldDesc) {
-	for {
-		t, r := cn.recv1()
-		switch t {
-		case 't':
-			nparams := r.int16()
-			paramTyps = make([]oid.Oid, nparams)
-			for i := range paramTyps {
-				paramTyps[i] = r.oid()
-			}
-		case 'n':
-			return paramTyps, nil, nil
-		case 'T':
-			colNames, colTyps = parseStatementRowDescribe(r)
-			return paramTyps, colNames, colTyps
-		case 'E':
-			err := parseError(r)
-			cn.readReadyForQuery()
-			panic(err)
-		default:
-			cn.bad = true
-			errorf("unexpected Describe statement response %q", t)
-		}
-	}
-}
-
-func (cn *conn) readPortalDescribeResponse() (colNames []string, colFmts []format, colTyps []fieldDesc) {
-	t, r := cn.recv1()
-	switch t {
-	case 'T':
-		return parsePortalRowDescribe(r)
-	case 'n':
-		return nil, nil, nil
-	case 'E':
-		err := parseError(r)
-		cn.readReadyForQuery()
-		panic(err)
-	default:
-		cn.bad = true
-		errorf("unexpected Describe response %q", t)
-	}
-	panic("not reached")
-}
-
-func (cn *conn) readBindResponse() {
-	t, r := cn.recv1()
-	switch t {
-	case '2':
-		return
-	case 'E':
-		err := parseError(r)
-		cn.readReadyForQuery()
-		panic(err)
-	default:
-		cn.bad = true
-		errorf("unexpected Bind response %q", t)
-	}
-}
-
-func (cn *conn) postExecuteWorkaround() {
-	// Work around a bug in sql.DB.QueryRow: in Go 1.2 and earlier it ignores
-	// any errors from rows.Next, which masks errors that happened during the
-	// execution of the query.  To avoid the problem in common cases, we wait
-	// here for one more message from the database.  If it's not an error the
-	// query will likely succeed (or perhaps has already, if it's a
-	// CommandComplete), so we push the message into the conn struct; recv1
-	// will return it as the next message for rows.Next or rows.Close.
-	// However, if it's an error, we wait until ReadyForQuery and then return
-	// the error to our caller.
-	for {
-		t, r := cn.recv1()
-		switch t {
-		case 'E':
-			err := parseError(r)
-			cn.readReadyForQuery()
-			panic(err)
-		case 'C', 'D', 'I':
-			// the query didn't fail, but we can't process this message
-			cn.saveMessage(t, r)
-			return
-		default:
-			cn.bad = true
-			errorf("unexpected message during extended query execution: %q", t)
-		}
-	}
-}
-
-// Only for Exec(), since we ignore the returned data
-func (cn *conn) readExecuteResponse(protocolState string) (res driver.Result, commandTag string, err error) {
-	for {
-		t, r := cn.recv1()
-		switch t {
-		case 'C':
-			if err != nil {
-				cn.bad = true
-				errorf("unexpected CommandComplete after error %s", err)
-			}
-			res, commandTag = cn.parseComplete(r.string())
-		case 'Z':
-			cn.processReadyForQuery(r)
-			if res == nil && err == nil {
-				err = errUnexpectedReady
-			}
-			return res, commandTag, err
-		case 'E':
-			err = parseError(r)
-		case 'T', 'D', 'I':
-			if err != nil {
-				cn.bad = true
-				errorf("unexpected %q after error %s", t, err)
-			}
-			if t == 'I' {
-				res = emptyRows
-			}
-			// ignore any results
-		default:
-			cn.bad = true
-			errorf("unknown %s response: %q", protocolState, t)
-		}
-	}
-}
-
-func parseStatementRowDescribe(r *readBuf) (colNames []string, colTyps []fieldDesc) {
-	n := r.int16()
-	colNames = make([]string, n)
-	colTyps = make([]fieldDesc, n)
-	for i := range colNames {
-		colNames[i] = r.string()
-		r.next(6)
-		colTyps[i].OID = r.oid()
-		colTyps[i].Len = r.int16()
-		colTyps[i].Mod = r.int32()
-		// format code not known when describing a statement; always 0
-		r.next(2)
-	}
-	return
-}
-
-func parsePortalRowDescribe(r *readBuf) (colNames []string, colFmts []format, colTyps []fieldDesc) {
-	n := r.int16()
-	colNames = make([]string, n)
-	colFmts = make([]format, n)
-	colTyps = make([]fieldDesc, n)
-	for i := range colNames {
-		colNames[i] = r.string()
-		r.next(6)
-		colTyps[i].OID = r.oid()
-		colTyps[i].Len = r.int16()
-		colTyps[i].Mod = r.int32()
-		colFmts[i] = format(r.int16())
-	}
-	return
-}
-
-// parseEnviron tries to mimic some of libpq's environment handling
-//
-// To ease testing, it does not directly reference os.Environ, but is
-// designed to accept its output.
-//
-// Environment-set connection information is intended to have a higher
-// precedence than a library default but lower than any explicitly
-// passed information (such as in the URL or connection string).
-func parseEnviron(env []string) (out map[string]string) {
-	out = make(map[string]string)
-
-	for _, v := range env {
-		parts := strings.SplitN(v, "=", 2)
-
-		accrue := func(keyname string) {
-			out[keyname] = parts[1]
-		}
-		unsupported := func() {
-			panic(fmt.Sprintf("setting %v not supported", parts[0]))
-		}
-
-		// The order of these is the same as is seen in the
-		// PostgreSQL 9.1 manual. Unsupported but well-defined
-		// keys cause a panic; these should be unset prior to
-		// execution. Options which pq expects to be set to a
-		// certain value are allowed, but must be set to that
-		// value if present (they can, of course, be absent).
-		switch parts[0] {
-		case "PGHOST":
-			accrue("host")
-		case "PGHOSTADDR":
-			unsupported()
-		case "PGPORT":
-			accrue("port")
-		case "PGDATABASE":
-			accrue("dbname")
-		case "PGUSER":
-			accrue("user")
-		case "PGPASSWORD":
-			accrue("password")
-		case "PGSERVICE", "PGSERVICEFILE", "PGREALM":
-			unsupported()
-		case "PGOPTIONS":
-			accrue("options")
-		case "PGAPPNAME":
-			accrue("application_name")
-		case "PGSSLMODE":
-			accrue("sslmode")
-		case "PGSSLCERT":
-			accrue("sslcert")
-		case "PGSSLKEY":
-			accrue("sslkey")
-		case "PGSSLROOTCERT":
-			accrue("sslrootcert")
-		case "PGREQUIRESSL", "PGSSLCRL":
-			unsupported()
-		case "PGREQUIREPEER":
-			unsupported()
-		case "PGKRBSRVNAME", "PGGSSLIB":
-			unsupported()
-		case "PGCONNECT_TIMEOUT":
-			accrue("connect_timeout")
-		case "PGCLIENTENCODING":
-			accrue("client_encoding")
-		case "PGDATESTYLE":
-			accrue("datestyle")
-		case "PGTZ":
-			accrue("timezone")
-		case "PGGEQO":
-			accrue("geqo")
-		case "PGSYSCONFDIR", "PGLOCALEDIR":
-			unsupported()
-		}
-	}
-
-	return out
-}
-
-// isUTF8 returns whether name is a fuzzy variation of the string "UTF-8".
-func isUTF8(name string) bool {
-	// Recognize all sorts of silly things as "UTF-8", like Postgres does
-	s := strings.Map(alnumLowerASCII, name)
-	return s == "utf8" || s == "unicode"
-}
-
-func alnumLowerASCII(ch rune) rune {
-	if 'A' <= ch && ch <= 'Z' {
-		return ch + ('a' - 'A')
-	}
-	if 'a' <= ch && ch <= 'z' || '0' <= ch && ch <= '9' {
-		return ch
-	}
-	return -1 // discard
-}
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/doc.go b/traffic_ops/testing/api/vendor/github.com/lib/pq/doc.go
deleted file mode 100644
index a1b029713..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/doc.go
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
-Package pq is a pure Go Postgres driver for the database/sql package.
-
-In most cases clients will use the database/sql package instead of
-using this package directly. For example:
-
-	import (
-		"database/sql"
-
-		_ "github.com/lib/pq"
-	)
-
-	func main() {
-		connStr := "user=pqgotest dbname=pqgotest sslmode=verify-full"
-		db, err := sql.Open("postgres", connStr)
-		if err != nil {
-			log.Fatal(err)
-		}
-
-		age := 21
-		rows, err := db.Query("SELECT name FROM users WHERE age = $1", age)
-		…
-	}
-
-You can also connect to a database using a URL. For example:
-
-	connStr := "postgres://pqgotest:password@localhost/pqgotest?sslmode=verify-full"
-	db, err := sql.Open("postgres", connStr)
-
-
-Connection String Parameters
-
-
-Similarly to libpq, when establishing a connection using pq you are expected to
-supply a connection string containing zero or more parameters.
-A subset of the connection parameters supported by libpq are also supported by pq.
-Additionally, pq also lets you specify run-time parameters (such as search_path or work_mem)
-directly in the connection string.  This is different from libpq, which does not allow
-run-time parameters in the connection string, instead requiring you to supply
-them in the options parameter.
-
-For compatibility with libpq, the following special connection parameters are
-supported:
-
-	* dbname - The name of the database to connect to
-	* user - The user to sign in as
-	* password - The user's password
-	* host - The host to connect to. Values that start with / are for unix
-	  domain sockets. (default is localhost)
-	* port - The port to bind to. (default is 5432)
-	* sslmode - Whether or not to use SSL (default is require, this is not
-	  the default for libpq)
-	* fallback_application_name - An application_name to fall back to if one isn't provided.
-	* connect_timeout - Maximum wait for connection, in seconds. Zero or
-	  not specified means wait indefinitely.
-	* sslcert - Cert file location. The file must contain PEM encoded data.
-	* sslkey - Key file location. The file must contain PEM encoded data.
-	* sslrootcert - The location of the root certificate file. The file
-	  must contain PEM encoded data.
-
-Valid values for sslmode are:
-
-	* disable - No SSL
-	* require - Always SSL (skip verification)
-	* verify-ca - Always SSL (verify that the certificate presented by the
-	  server was signed by a trusted CA)
-	* verify-full - Always SSL (verify that the certification presented by
-	  the server was signed by a trusted CA and the server host name
-	  matches the one in the certificate)
-
-See http://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
-for more information about connection string parameters.
-
-Use single quotes for values that contain whitespace:
-
-    "user=pqgotest password='with spaces'"
-
-A backslash will escape the next character in values:
-
-    "user=space\ man password='it\'s valid'"
-
-Note that the connection parameter client_encoding (which sets the
-text encoding for the connection) may be set but must be "UTF8",
-matching with the same rules as Postgres. It is an error to provide
-any other value.
-
-In addition to the parameters listed above, any run-time parameter that can be
-set at backend start time can be set in the connection string.  For more
-information, see
-http://www.postgresql.org/docs/current/static/runtime-config.html.
-
-Most environment variables as specified at http://www.postgresql.org/docs/current/static/libpq-envars.html
-supported by libpq are also supported by pq.  If any of the environment
-variables not supported by pq are set, pq will panic during connection
-establishment.  Environment variables have a lower precedence than explicitly
-provided connection parameters.
-
-The pgpass mechanism as described in http://www.postgresql.org/docs/current/static/libpq-pgpass.html
-is supported, but on Windows PGPASSFILE must be specified explicitly.
-
-
-Queries
-
-
-database/sql does not dictate any specific format for parameter
-markers in query strings, and pq uses the Postgres-native ordinal markers,
-as shown above. The same marker can be reused for the same parameter:
-
-	rows, err := db.Query(`SELECT name FROM users WHERE favorite_fruit = $1
-		OR age BETWEEN $2 AND $2 + 3`, "orange", 64)
-
-pq does not support the LastInsertId() method of the Result type in database/sql.
-To return the identifier of an INSERT (or UPDATE or DELETE), use the Postgres
-RETURNING clause with a standard Query or QueryRow call:
-
-	var userid int
-	err := db.QueryRow(`INSERT INTO users(name, favorite_fruit, age)
-		VALUES('beatrice', 'starfruit', 93) RETURNING id`).Scan(&userid)
-
-For more details on RETURNING, see the Postgres documentation:
-
-	http://www.postgresql.org/docs/current/static/sql-insert.html
-	http://www.postgresql.org/docs/current/static/sql-update.html
-	http://www.postgresql.org/docs/current/static/sql-delete.html
-
-For additional instructions on querying see the documentation for the database/sql package.
-
-
-Data Types
-
-
-Parameters pass through driver.DefaultParameterConverter before they are handled
-by this package. When the binary_parameters connection option is enabled,
-[]byte values are sent directly to the backend as data in binary format.
-
-This package returns the following types for values from the PostgreSQL backend:
-
-	- integer types smallint, integer, and bigint are returned as int64
-	- floating-point types real and double precision are returned as float64
-	- character types char, varchar, and text are returned as string
-	- temporal types date, time, timetz, timestamp, and timestamptz are
-	  returned as time.Time
-	- the boolean type is returned as bool
-	- the bytea type is returned as []byte
-
-All other types are returned directly from the backend as []byte values in text format.
-
-
-Errors
-
-
-pq may return errors of type *pq.Error which can be interrogated for error details:
-
-        if err, ok := err.(*pq.Error); ok {
-            fmt.Println("pq error:", err.Code.Name())
-        }
-
-See the pq.Error type for details.
-
-
-Bulk imports
-
-You can perform bulk imports by preparing a statement returned by pq.CopyIn (or
-pq.CopyInSchema) in an explicit transaction (sql.Tx). The returned statement
-handle can then be repeatedly "executed" to copy data into the target table.
-After all data has been processed you should call Exec() once with no arguments
-to flush all buffered data. Any call to Exec() might return an error which
-should be handled appropriately, but because of the internal buffering an error
-returned by Exec() might not be related to the data passed in the call that
-failed.
-
-CopyIn uses COPY FROM internally. It is not possible to COPY outside of an
-explicit transaction in pq.
-
-Usage example:
-
-	txn, err := db.Begin()
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	stmt, err := txn.Prepare(pq.CopyIn("users", "name", "age"))
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	for _, user := range users {
-		_, err = stmt.Exec(user.Name, int64(user.Age))
-		if err != nil {
-			log.Fatal(err)
-		}
-	}
-
-	_, err = stmt.Exec()
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	err = stmt.Close()
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	err = txn.Commit()
-	if err != nil {
-		log.Fatal(err)
-	}
-
-
-Notifications
-
-
-PostgreSQL supports a simple publish/subscribe model over database
-connections.  See http://www.postgresql.org/docs/current/static/sql-notify.html
-for more information about the general mechanism.
-
-To start listening for notifications, you first have to open a new connection
-to the database by calling NewListener.  This connection can not be used for
-anything other than LISTEN / NOTIFY.  Calling Listen will open a "notification
-channel"; once a notification channel is open, a notification generated on that
-channel will effect a send on the Listener.Notify channel.  A notification
-channel will remain open until Unlisten is called, though connection loss might
-result in some notifications being lost.  To solve this problem, Listener sends
-a nil pointer over the Notify channel any time the connection is re-established
-following a connection loss.  The application can get information about the
-state of the underlying connection by setting an event callback in the call to
-NewListener.
-
-A single Listener can safely be used from concurrent goroutines, which means
-that there is often no need to create more than one Listener in your
-application.  However, a Listener is always connected to a single database, so
-you will need to create a new Listener instance for every database you want to
-receive notifications in.
-
-The channel name in both Listen and Unlisten is case sensitive, and can contain
-any characters legal in an identifier (see
-http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
-for more information).  Note that the channel name will be truncated to 63
-bytes by the PostgreSQL server.
-
-You can find a complete, working example of Listener usage at
-http://godoc.org/github.com/lib/pq/example/listen.
-
-*/
-package pq
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/encode.go b/traffic_ops/testing/api/vendor/github.com/lib/pq/encode.go
deleted file mode 100644
index 3b0d365f2..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/encode.go
+++ /dev/null
@@ -1,603 +0,0 @@
-package pq
-
-import (
-	"bytes"
-	"database/sql/driver"
-	"encoding/binary"
-	"encoding/hex"
-	"errors"
-	"fmt"
-	"math"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-
-	"github.com/lib/pq/oid"
-)
-
-func binaryEncode(parameterStatus *parameterStatus, x interface{}) []byte {
-	switch v := x.(type) {
-	case []byte:
-		return v
-	default:
-		return encode(parameterStatus, x, oid.T_unknown)
-	}
-}
-
-func encode(parameterStatus *parameterStatus, x interface{}, pgtypOid oid.Oid) []byte {
-	switch v := x.(type) {
-	case int64:
-		return strconv.AppendInt(nil, v, 10)
-	case float64:
-		return strconv.AppendFloat(nil, v, 'f', -1, 64)
-	case []byte:
-		if pgtypOid == oid.T_bytea {
-			return encodeBytea(parameterStatus.serverVersion, v)
-		}
-
-		return v
-	case string:
-		if pgtypOid == oid.T_bytea {
-			return encodeBytea(parameterStatus.serverVersion, []byte(v))
-		}
-
-		return []byte(v)
-	case bool:
-		return strconv.AppendBool(nil, v)
-	case time.Time:
-		return formatTs(v)
-
-	default:
-		errorf("encode: unknown type for %T", v)
-	}
-
-	panic("not reached")
-}
-
-func decode(parameterStatus *parameterStatus, s []byte, typ oid.Oid, f format) interface{} {
-	switch f {
-	case formatBinary:
-		return binaryDecode(parameterStatus, s, typ)
-	case formatText:
-		return textDecode(parameterStatus, s, typ)
-	default:
-		panic("not reached")
-	}
-}
-
-func binaryDecode(parameterStatus *parameterStatus, s []byte, typ oid.Oid) interface{} {
-	switch typ {
-	case oid.T_bytea:
-		return s
-	case oid.T_int8:
-		return int64(binary.BigEndian.Uint64(s))
-	case oid.T_int4:
-		return int64(int32(binary.BigEndian.Uint32(s)))
-	case oid.T_int2:
-		return int64(int16(binary.BigEndian.Uint16(s)))
-	case oid.T_uuid:
-		b, err := decodeUUIDBinary(s)
-		if err != nil {
-			panic(err)
-		}
-		return b
-
-	default:
-		errorf("don't know how to decode binary parameter of type %d", uint32(typ))
-	}
-
-	panic("not reached")
-}
-
-func textDecode(parameterStatus *parameterStatus, s []byte, typ oid.Oid) interface{} {
-	switch typ {
-	case oid.T_char, oid.T_varchar, oid.T_text:
-		return string(s)
-	case oid.T_bytea:
-		b, err := parseBytea(s)
-		if err != nil {
-			errorf("%s", err)
-		}
-		return b
-	case oid.T_timestamptz:
-		return parseTs(parameterStatus.currentLocation, string(s))
-	case oid.T_timestamp, oid.T_date:
-		return parseTs(nil, string(s))
-	case oid.T_time:
-		return mustParse("15:04:05", typ, s)
-	case oid.T_timetz:
-		return mustParse("15:04:05-07", typ, s)
-	case oid.T_bool:
-		return s[0] == 't'
-	case oid.T_int8, oid.T_int4, oid.T_int2:
-		i, err := strconv.ParseInt(string(s), 10, 64)
-		if err != nil {
-			errorf("%s", err)
-		}
-		return i
-	case oid.T_float4, oid.T_float8:
-		bits := 64
-		if typ == oid.T_float4 {
-			bits = 32
-		}
-		f, err := strconv.ParseFloat(string(s), bits)
-		if err != nil {
-			errorf("%s", err)
-		}
-		return f
-	}
-
-	return s
-}
-
-// appendEncodedText encodes item in text format as required by COPY
-// and appends to buf
-func appendEncodedText(parameterStatus *parameterStatus, buf []byte, x interface{}) []byte {
-	switch v := x.(type) {
-	case int64:
-		return strconv.AppendInt(buf, v, 10)
-	case float64:
-		return strconv.AppendFloat(buf, v, 'f', -1, 64)
-	case []byte:
-		encodedBytea := encodeBytea(parameterStatus.serverVersion, v)
-		return appendEscapedText(buf, string(encodedBytea))
-	case string:
-		return appendEscapedText(buf, v)
-	case bool:
-		return strconv.AppendBool(buf, v)
-	case time.Time:
-		return append(buf, formatTs(v)...)
-	case nil:
-		return append(buf, "\\N"...)
-	default:
-		errorf("encode: unknown type for %T", v)
-	}
-
-	panic("not reached")
-}
-
-func appendEscapedText(buf []byte, text string) []byte {
-	escapeNeeded := false
-	startPos := 0
-	var c byte
-
-	// check if we need to escape
-	for i := 0; i < len(text); i++ {
-		c = text[i]
-		if c == '\\' || c == '\n' || c == '\r' || c == '\t' {
-			escapeNeeded = true
-			startPos = i
-			break
-		}
-	}
-	if !escapeNeeded {
-		return append(buf, text...)
-	}
-
-	// copy till first char to escape, iterate the rest
-	result := append(buf, text[:startPos]...)
-	for i := startPos; i < len(text); i++ {
-		c = text[i]
-		switch c {
-		case '\\':
-			result = append(result, '\\', '\\')
-		case '\n':
-			result = append(result, '\\', 'n')
-		case '\r':
-			result = append(result, '\\', 'r')
-		case '\t':
-			result = append(result, '\\', 't')
-		default:
-			result = append(result, c)
-		}
-	}
-	return result
-}
-
-func mustParse(f string, typ oid.Oid, s []byte) time.Time {
-	str := string(s)
-
-	// check for a 30-minute-offset timezone
-	if (typ == oid.T_timestamptz || typ == oid.T_timetz) &&
-		str[len(str)-3] == ':' {
-		f += ":00"
-	}
-	t, err := time.Parse(f, str)
-	if err != nil {
-		errorf("decode: %s", err)
-	}
-	return t
-}
-
-var errInvalidTimestamp = errors.New("invalid timestamp")
-
-type timestampParser struct {
-	err error
-}
-
-func (p *timestampParser) expect(str string, char byte, pos int) {
-	if p.err != nil {
-		return
-	}
-	if pos+1 > len(str) {
-		p.err = errInvalidTimestamp
-		return
-	}
-	if c := str[pos]; c != char && p.err == nil {
-		p.err = fmt.Errorf("expected '%v' at position %v; got '%v'", char, pos, c)
-	}
-}
-
-func (p *timestampParser) mustAtoi(str string, begin int, end int) int {
-	if p.err != nil {
-		return 0
-	}
-	if begin < 0 || end < 0 || begin > end || end > len(str) {
-		p.err = errInvalidTimestamp
-		return 0
-	}
-	result, err := strconv.Atoi(str[begin:end])
-	if err != nil {
-		if p.err == nil {
-			p.err = fmt.Errorf("expected number; got '%v'", str)
-		}
-		return 0
-	}
-	return result
-}
-
-// The location cache caches the time zones typically used by the client.
-type locationCache struct {
-	cache map[int]*time.Location
-	lock  sync.Mutex
-}
-
-// All connections share the same list of timezones. Benchmarking shows that
-// about 5% speed could be gained by putting the cache in the connection and
-// losing the mutex, at the cost of a small amount of memory and a somewhat
-// significant increase in code complexity.
-var globalLocationCache = newLocationCache()
-
-func newLocationCache() *locationCache {
-	return &locationCache{cache: make(map[int]*time.Location)}
-}
-
-// Returns the cached timezone for the specified offset, creating and caching
-// it if necessary.
-func (c *locationCache) getLocation(offset int) *time.Location {
-	c.lock.Lock()
-	defer c.lock.Unlock()
-
-	location, ok := c.cache[offset]
-	if !ok {
-		location = time.FixedZone("", offset)
-		c.cache[offset] = location
-	}
-
-	return location
-}
-
-var infinityTsEnabled = false
-var infinityTsNegative time.Time
-var infinityTsPositive time.Time
-
-const (
-	infinityTsEnabledAlready        = "pq: infinity timestamp enabled already"
-	infinityTsNegativeMustBeSmaller = "pq: infinity timestamp: negative value must be smaller (before) than positive"
-)
-
-// EnableInfinityTs controls the handling of Postgres' "-infinity" and
-// "infinity" "timestamp"s.
-//
-// If EnableInfinityTs is not called, "-infinity" and "infinity" will return
-// []byte("-infinity") and []byte("infinity") respectively, and potentially
-// cause error "sql: Scan error on column index 0: unsupported driver -> Scan
-// pair: []uint8 -> *time.Time", when scanning into a time.Time value.
-//
-// Once EnableInfinityTs has been called, all connections created using this
-// driver will decode Postgres' "-infinity" and "infinity" for "timestamp",
-// "timestamp with time zone" and "date" types to the predefined minimum and
-// maximum times, respectively.  When encoding time.Time values, any time which
-// equals or precedes the predefined minimum time will be encoded to
-// "-infinity".  Any values at or past the maximum time will similarly be
-// encoded to "infinity".
-//
-// If EnableInfinityTs is called with negative >= positive, it will panic.
-// Calling EnableInfinityTs after a connection has been established results in
-// undefined behavior.  If EnableInfinityTs is called more than once, it will
-// panic.
-func EnableInfinityTs(negative time.Time, positive time.Time) {
-	if infinityTsEnabled {
-		panic(infinityTsEnabledAlready)
-	}
-	if !negative.Before(positive) {
-		panic(infinityTsNegativeMustBeSmaller)
-	}
-	infinityTsEnabled = true
-	infinityTsNegative = negative
-	infinityTsPositive = positive
-}
-
-/*
- * Testing might want to toggle infinityTsEnabled
- */
-func disableInfinityTs() {
-	infinityTsEnabled = false
-}
-
-// This is a time function specific to the Postgres default DateStyle
-// setting ("ISO, MDY"), the only one we currently support. This
-// accounts for the discrepancies between the parsing available with
-// time.Parse and the Postgres date formatting quirks.
-func parseTs(currentLocation *time.Location, str string) interface{} {
-	switch str {
-	case "-infinity":
-		if infinityTsEnabled {
-			return infinityTsNegative
-		}
-		return []byte(str)
-	case "infinity":
-		if infinityTsEnabled {
-			return infinityTsPositive
-		}
-		return []byte(str)
-	}
-	t, err := ParseTimestamp(currentLocation, str)
-	if err != nil {
-		panic(err)
-	}
-	return t
-}
-
-// ParseTimestamp parses Postgres' text format. It returns a time.Time in
-// currentLocation iff that time's offset agrees with the offset sent from the
-// Postgres server. Otherwise, ParseTimestamp returns a time.Time with the
-// fixed offset offset provided by the Postgres server.
-func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, error) {
-	p := timestampParser{}
-
-	monSep := strings.IndexRune(str, '-')
-	// this is Gregorian year, not ISO Year
-	// In Gregorian system, the year 1 BC is followed by AD 1
-	year := p.mustAtoi(str, 0, monSep)
-	daySep := monSep + 3
-	month := p.mustAtoi(str, monSep+1, daySep)
-	p.expect(str, '-', daySep)
-	timeSep := daySep + 3
-	day := p.mustAtoi(str, daySep+1, timeSep)
-
-	minLen := monSep + len("01-01") + 1
-
-	isBC := strings.HasSuffix(str, " BC")
-	if isBC {
-		minLen += 3
-	}
-
-	var hour, minute, second int
-	if len(str) > minLen {
-		p.expect(str, ' ', timeSep)
-		minSep := timeSep + 3
-		p.expect(str, ':', minSep)
-		hour = p.mustAtoi(str, timeSep+1, minSep)
-		secSep := minSep + 3
-		p.expect(str, ':', secSep)
-		minute = p.mustAtoi(str, minSep+1, secSep)
-		secEnd := secSep + 3
-		second = p.mustAtoi(str, secSep+1, secEnd)
-	}
-	remainderIdx := monSep + len("01-01 00:00:00") + 1
-	// Three optional (but ordered) sections follow: the
-	// fractional seconds, the time zone offset, and the BC
-	// designation. We set them up here and adjust the other
-	// offsets if the preceding sections exist.
-
-	nanoSec := 0
-	tzOff := 0
-
-	if remainderIdx < len(str) && str[remainderIdx] == '.' {
-		fracStart := remainderIdx + 1
-		fracOff := strings.IndexAny(str[fracStart:], "-+ ")
-		if fracOff < 0 {
-			fracOff = len(str) - fracStart
-		}
-		fracSec := p.mustAtoi(str, fracStart, fracStart+fracOff)
-		nanoSec = fracSec * (1000000000 / int(math.Pow(10, float64(fracOff))))
-
-		remainderIdx += fracOff + 1
-	}
-	if tzStart := remainderIdx; tzStart < len(str) && (str[tzStart] == '-' || str[tzStart] == '+') {
-		// time zone separator is always '-' or '+' (UTC is +00)
-		var tzSign int
-		switch c := str[tzStart]; c {
-		case '-':
-			tzSign = -1
-		case '+':
-			tzSign = +1
-		default:
-			return time.Time{}, fmt.Errorf("expected '-' or '+' at position %v; got %v", tzStart, c)
-		}
-		tzHours := p.mustAtoi(str, tzStart+1, tzStart+3)
-		remainderIdx += 3
-		var tzMin, tzSec int
-		if remainderIdx < len(str) && str[remainderIdx] == ':' {
-			tzMin = p.mustAtoi(str, remainderIdx+1, remainderIdx+3)
-			remainderIdx += 3
-		}
-		if remainderIdx < len(str) && str[remainderIdx] == ':' {
-			tzSec = p.mustAtoi(str, remainderIdx+1, remainderIdx+3)
-			remainderIdx += 3
-		}
-		tzOff = tzSign * ((tzHours * 60 * 60) + (tzMin * 60) + tzSec)
-	}
-	var isoYear int
-
-	if isBC {
-		isoYear = 1 - year
-		remainderIdx += 3
-	} else {
-		isoYear = year
-	}
-	if remainderIdx < len(str) {
-		return time.Time{}, fmt.Errorf("expected end of input, got %v", str[remainderIdx:])
-	}
-	t := time.Date(isoYear, time.Month(month), day,
-		hour, minute, second, nanoSec,
-		globalLocationCache.getLocation(tzOff))
-
-	if currentLocation != nil {
-		// Set the location of the returned Time based on the session's
-		// TimeZone value, but only if the local time zone database agrees with
-		// the remote database on the offset.
-		lt := t.In(currentLocation)
-		_, newOff := lt.Zone()
-		if newOff == tzOff {
-			t = lt
-		}
-	}
-
-	return t, p.err
-}
-
-// formatTs formats t into a format postgres understands.
-func formatTs(t time.Time) []byte {
-	if infinityTsEnabled {
-		// t <= -infinity : ! (t > -infinity)
-		if !t.After(infinityTsNegative) {
-			return []byte("-infinity")
-		}
-		// t >= infinity : ! (!t < infinity)
-		if !t.Before(infinityTsPositive) {
-			return []byte("infinity")
-		}
-	}
-	return FormatTimestamp(t)
-}
-
-// FormatTimestamp formats t into Postgres' text format for timestamps.
-func FormatTimestamp(t time.Time) []byte {
-	// Need to send dates before 0001 A.D. with " BC" suffix, instead of the
-	// minus sign preferred by Go.
-	// Beware, "0000" in ISO is "1 BC", "-0001" is "2 BC" and so on
-	bc := false
-	if t.Year() <= 0 {
-		// flip year sign, and add 1, e.g: "0" will be "1", and "-10" will be "11"
-		t = t.AddDate((-t.Year())*2+1, 0, 0)
-		bc = true
-	}
-	b := []byte(t.Format("2006-01-02 15:04:05.999999999Z07:00"))
-
-	_, offset := t.Zone()
-	offset = offset % 60
-	if offset != 0 {
-		// RFC3339Nano already printed the minus sign
-		if offset < 0 {
-			offset = -offset
-		}
-
-		b = append(b, ':')
-		if offset < 10 {
-			b = append(b, '0')
-		}
-		b = strconv.AppendInt(b, int64(offset), 10)
-	}
-
-	if bc {
-		b = append(b, " BC"...)
-	}
-	return b
-}
-
-// Parse a bytea value received from the server.  Both "hex" and the legacy
-// "escape" format are supported.
-func parseBytea(s []byte) (result []byte, err error) {
-	if len(s) >= 2 && bytes.Equal(s[:2], []byte("\\x")) {
-		// bytea_output = hex
-		s = s[2:] // trim off leading "\\x"
-		result = make([]byte, hex.DecodedLen(len(s)))
-		_, err := hex.Decode(result, s)
-		if err != nil {
-			return nil, err
-		}
-	} else {
-		// bytea_output = escape
-		for len(s) > 0 {
-			if s[0] == '\\' {
-				// escaped '\\'
-				if len(s) >= 2 && s[1] == '\\' {
-					result = append(result, '\\')
-					s = s[2:]
-					continue
-				}
-
-				// '\\' followed by an octal number
-				if len(s) < 4 {
-					return nil, fmt.Errorf("invalid bytea sequence %v", s)
-				}
-				r, err := strconv.ParseInt(string(s[1:4]), 8, 9)
-				if err != nil {
-					return nil, fmt.Errorf("could not parse bytea value: %s", err.Error())
-				}
-				result = append(result, byte(r))
-				s = s[4:]
-			} else {
-				// We hit an unescaped, raw byte.  Try to read in as many as
-				// possible in one go.
-				i := bytes.IndexByte(s, '\\')
-				if i == -1 {
-					result = append(result, s...)
-					break
-				}
-				result = append(result, s[:i]...)
-				s = s[i:]
-			}
-		}
-	}
-
-	return result, nil
-}
-
-func encodeBytea(serverVersion int, v []byte) (result []byte) {
-	if serverVersion >= 90000 {
-		// Use the hex format if we know that the server supports it
-		result = make([]byte, 2+hex.EncodedLen(len(v)))
-		result[0] = '\\'
-		result[1] = 'x'
-		hex.Encode(result[2:], v)
-	} else {
-		// .. or resort to "escape"
-		for _, b := range v {
-			if b == '\\' {
-				result = append(result, '\\', '\\')
-			} else if b < 0x20 || b > 0x7e {
-				result = append(result, []byte(fmt.Sprintf("\\%03o", b))...)
-			} else {
-				result = append(result, b)
-			}
-		}
-	}
-
-	return result
-}
-
-// NullTime represents a time.Time that may be null. NullTime implements the
-// sql.Scanner interface so it can be used as a scan destination, similar to
-// sql.NullString.
-type NullTime struct {
-	Time  time.Time
-	Valid bool // Valid is true if Time is not NULL
-}
-
-// Scan implements the Scanner interface.
-func (nt *NullTime) Scan(value interface{}) error {
-	nt.Time, nt.Valid = value.(time.Time)
-	return nil
-}
-
-// Value implements the driver Valuer interface.
-func (nt NullTime) Value() (driver.Value, error) {
-	if !nt.Valid {
-		return nil, nil
-	}
-	return nt.Time, nil
-}
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/notify.go b/traffic_ops/testing/api/vendor/github.com/lib/pq/notify.go
deleted file mode 100644
index 412c6ac1e..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/notify.go
+++ /dev/null
@@ -1,794 +0,0 @@
-package pq
-
-// Package pq is a pure Go Postgres driver for the database/sql package.
-// This module contains support for Postgres LISTEN/NOTIFY.
-
-import (
-	"errors"
-	"fmt"
-	"sync"
-	"sync/atomic"
-	"time"
-)
-
-// Notification represents a single notification from the database.
-type Notification struct {
-	// Process ID (PID) of the notifying postgres backend.
-	BePid int
-	// Name of the channel the notification was sent on.
-	Channel string
-	// Payload, or the empty string if unspecified.
-	Extra string
-}
-
-func recvNotification(r *readBuf) *Notification {
-	bePid := r.int32()
-	channel := r.string()
-	extra := r.string()
-
-	return &Notification{bePid, channel, extra}
-}
-
-const (
-	connStateIdle int32 = iota
-	connStateExpectResponse
-	connStateExpectReadyForQuery
-)
-
-type message struct {
-	typ byte
-	err error
-}
-
-var errListenerConnClosed = errors.New("pq: ListenerConn has been closed")
-
-// ListenerConn is a low-level interface for waiting for notifications.  You
-// should use Listener instead.
-type ListenerConn struct {
-	// guards cn and err
-	connectionLock sync.Mutex
-	cn             *conn
-	err            error
-
-	connState int32
-
-	// the sending goroutine will be holding this lock
-	senderLock sync.Mutex
-
-	notificationChan chan<- *Notification
-
-	replyChan chan message
-}
-
-// NewListenerConn creates a new ListenerConn. Use NewListener instead.
-func NewListenerConn(name string, notificationChan chan<- *Notification) (*ListenerConn, error) {
-	return newDialListenerConn(defaultDialer{}, name, notificationChan)
-}
-
-func newDialListenerConn(d Dialer, name string, c chan<- *Notification) (*ListenerConn, error) {
-	cn, err := DialOpen(d, name)
-	if err != nil {
-		return nil, err
-	}
-
-	l := &ListenerConn{
-		cn:               cn.(*conn),
-		notificationChan: c,
-		connState:        connStateIdle,
-		replyChan:        make(chan message, 2),
-	}
-
-	go l.listenerConnMain()
-
-	return l, nil
-}
-
-// We can only allow one goroutine at a time to be running a query on the
-// connection for various reasons, so the goroutine sending on the connection
-// must be holding senderLock.
-//
-// Returns an error if an unrecoverable error has occurred and the ListenerConn
-// should be abandoned.
-func (l *ListenerConn) acquireSenderLock() error {
-	// we must acquire senderLock first to avoid deadlocks; see ExecSimpleQuery
-	l.senderLock.Lock()
-
-	l.connectionLock.Lock()
-	err := l.err
-	l.connectionLock.Unlock()
-	if err != nil {
-		l.senderLock.Unlock()
-		return err
-	}
-	return nil
-}
-
-func (l *ListenerConn) releaseSenderLock() {
-	l.senderLock.Unlock()
-}
-
-// setState advances the protocol state to newState.  Returns false if moving
-// to that state from the current state is not allowed.
-func (l *ListenerConn) setState(newState int32) bool {
-	var expectedState int32
-
-	switch newState {
-	case connStateIdle:
-		expectedState = connStateExpectReadyForQuery
-	case connStateExpectResponse:
-		expectedState = connStateIdle
-	case connStateExpectReadyForQuery:
-		expectedState = connStateExpectResponse
-	default:
-		panic(fmt.Sprintf("unexpected listenerConnState %d", newState))
-	}
-
-	return atomic.CompareAndSwapInt32(&l.connState, expectedState, newState)
-}
-
-// Main logic is here: receive messages from the postgres backend, forward
-// notifications and query replies and keep the internal state in sync with the
-// protocol state.  Returns when the connection has been lost, is about to go
-// away or should be discarded because we couldn't agree on the state with the
-// server backend.
-func (l *ListenerConn) listenerConnLoop() (err error) {
-	defer errRecoverNoErrBadConn(&err)
-
-	r := &readBuf{}
-	for {
-		t, err := l.cn.recvMessage(r)
-		if err != nil {
-			return err
-		}
-
-		switch t {
-		case 'A':
-			// recvNotification copies all the data so we don't need to worry
-			// about the scratch buffer being overwritten.
-			l.notificationChan <- recvNotification(r)
-
-		case 'T', 'D':
-			// only used by tests; ignore
-
-		case 'E':
-			// We might receive an ErrorResponse even when not in a query; it
-			// is expected that the server will close the connection after
-			// that, but we should make sure that the error we display is the
-			// one from the stray ErrorResponse, not io.ErrUnexpectedEOF.
-			if !l.setState(connStateExpectReadyForQuery) {
-				return parseError(r)
-			}
-			l.replyChan <- message{t, parseError(r)}
-
-		case 'C', 'I':
-			if !l.setState(connStateExpectReadyForQuery) {
-				// protocol out of sync
-				return fmt.Errorf("unexpected CommandComplete")
-			}
-			// ExecSimpleQuery doesn't need to know about this message
-
-		case 'Z':
-			if !l.setState(connStateIdle) {
-				// protocol out of sync
-				return fmt.Errorf("unexpected ReadyForQuery")
-			}
-			l.replyChan <- message{t, nil}
-
-		case 'N', 'S':
-			// ignore
-		default:
-			return fmt.Errorf("unexpected message %q from server in listenerConnLoop", t)
-		}
-	}
-}
-
-// This is the main routine for the goroutine receiving on the database
-// connection.  Most of the main logic is in listenerConnLoop.
-func (l *ListenerConn) listenerConnMain() {
-	err := l.listenerConnLoop()
-
-	// listenerConnLoop terminated; we're done, but we still have to clean up.
-	// Make sure nobody tries to start any new queries by making sure the err
-	// pointer is set.  It is important that we do not overwrite its value; a
-	// connection could be closed by either this goroutine or one sending on
-	// the connection -- whoever closes the connection is assumed to have the
-	// more meaningful error message (as the other one will probably get
-	// net.errClosed), so that goroutine sets the error we expose while the
-	// other error is discarded.  If the connection is lost while two
-	// goroutines are operating on the socket, it probably doesn't matter which
-	// error we expose so we don't try to do anything more complex.
-	l.connectionLock.Lock()
-	if l.err == nil {
-		l.err = err
-	}
-	l.cn.Close()
-	l.connectionLock.Unlock()
-
-	// There might be a query in-flight; make sure nobody's waiting for a
-	// response to it, since there's not going to be one.
-	close(l.replyChan)
-
-	// let the listener know we're done
-	close(l.notificationChan)
-
-	// this ListenerConn is done
-}
-
-// Listen sends a LISTEN query to the server. See ExecSimpleQuery.
-func (l *ListenerConn) Listen(channel string) (bool, error) {
-	return l.ExecSimpleQuery("LISTEN " + QuoteIdentifier(channel))
-}
-
-// Unlisten sends an UNLISTEN query to the server. See ExecSimpleQuery.
-func (l *ListenerConn) Unlisten(channel string) (bool, error) {
-	return l.ExecSimpleQuery("UNLISTEN " + QuoteIdentifier(channel))
-}
-
-// UnlistenAll sends an `UNLISTEN *` query to the server. See ExecSimpleQuery.
-func (l *ListenerConn) UnlistenAll() (bool, error) {
-	return l.ExecSimpleQuery("UNLISTEN *")
-}
-
-// Ping the remote server to make sure it's alive.  Non-nil error means the
-// connection has failed and should be abandoned.
-func (l *ListenerConn) Ping() error {
-	sent, err := l.ExecSimpleQuery("")
-	if !sent {
-		return err
-	}
-	if err != nil {
-		// shouldn't happen
-		panic(err)
-	}
-	return nil
-}
-
-// Attempt to send a query on the connection.  Returns an error if sending the
-// query failed, and the caller should initiate closure of this connection.
-// The caller must be holding senderLock (see acquireSenderLock and
-// releaseSenderLock).
-func (l *ListenerConn) sendSimpleQuery(q string) (err error) {
-	defer errRecoverNoErrBadConn(&err)
-
-	// must set connection state before sending the query
-	if !l.setState(connStateExpectResponse) {
-		panic("two queries running at the same time")
-	}
-
-	// Can't use l.cn.writeBuf here because it uses the scratch buffer which
-	// might get overwritten by listenerConnLoop.
-	b := &writeBuf{
-		buf: []byte("Q\x00\x00\x00\x00"),
-		pos: 1,
-	}
-	b.string(q)
-	l.cn.send(b)
-
-	return nil
-}
-
-// ExecSimpleQuery executes a "simple query" (i.e. one with no bindable
-// parameters) on the connection. The possible return values are:
-//   1) "executed" is true; the query was executed to completion on the
-//      database server.  If the query failed, err will be set to the error
-//      returned by the database, otherwise err will be nil.
-//   2) If "executed" is false, the query could not be executed on the remote
-//      server.  err will be non-nil.
-//
-// After a call to ExecSimpleQuery has returned an executed=false value, the
-// connection has either been closed or will be closed shortly thereafter, and
-// all subsequently executed queries will return an error.
-func (l *ListenerConn) ExecSimpleQuery(q string) (executed bool, err error) {
-	if err = l.acquireSenderLock(); err != nil {
-		return false, err
-	}
-	defer l.releaseSenderLock()
-
-	err = l.sendSimpleQuery(q)
-	if err != nil {
-		// We can't know what state the protocol is in, so we need to abandon
-		// this connection.
-		l.connectionLock.Lock()
-		// Set the error pointer if it hasn't been set already; see
-		// listenerConnMain.
-		if l.err == nil {
-			l.err = err
-		}
-		l.connectionLock.Unlock()
-		l.cn.c.Close()
-		return false, err
-	}
-
-	// now we just wait for a reply..
-	for {
-		m, ok := <-l.replyChan
-		if !ok {
-			// We lost the connection to server, don't bother waiting for a
-			// a response.  err should have been set already.
-			l.connectionLock.Lock()
-			err := l.err
-			l.connectionLock.Unlock()
-			return false, err
-		}
-		switch m.typ {
-		case 'Z':
-			// sanity check
-			if m.err != nil {
-				panic("m.err != nil")
-			}
-			// done; err might or might not be set
-			return true, err
-
-		case 'E':
-			// sanity check
-			if m.err == nil {
-				panic("m.err == nil")
-			}
-			// server responded with an error; ReadyForQuery to follow
-			err = m.err
-
-		default:
-			return false, fmt.Errorf("unknown response for simple query: %q", m.typ)
-		}
-	}
-}
-
-// Close closes the connection.
-func (l *ListenerConn) Close() error {
-	l.connectionLock.Lock()
-	if l.err != nil {
-		l.connectionLock.Unlock()
-		return errListenerConnClosed
-	}
-	l.err = errListenerConnClosed
-	l.connectionLock.Unlock()
-	// We can't send anything on the connection without holding senderLock.
-	// Simply close the net.Conn to wake up everyone operating on it.
-	return l.cn.c.Close()
-}
-
-// Err returns the reason the connection was closed. It is not safe to call
-// this function until l.Notify has been closed.
-func (l *ListenerConn) Err() error {
-	return l.err
-}
-
-var errListenerClosed = errors.New("pq: Listener has been closed")
-
-// ErrChannelAlreadyOpen is returned from Listen when a channel is already
-// open.
-var ErrChannelAlreadyOpen = errors.New("pq: channel is already open")
-
-// ErrChannelNotOpen is returned from Unlisten when a channel is not open.
-var ErrChannelNotOpen = errors.New("pq: channel is not open")
-
-// ListenerEventType is an enumeration of listener event types.
-type ListenerEventType int
-
-const (
-	// ListenerEventConnected is emitted only when the database connection
-	// has been initially initialized. The err argument of the callback
-	// will always be nil.
-	ListenerEventConnected ListenerEventType = iota
-
-	// ListenerEventDisconnected is emitted after a database connection has
-	// been lost, either because of an error or because Close has been
-	// called. The err argument will be set to the reason the database
-	// connection was lost.
-	ListenerEventDisconnected
-
-	// ListenerEventReconnected is emitted after a database connection has
-	// been re-established after connection loss. The err argument of the
-	// callback will always be nil. After this event has been emitted, a
-	// nil pq.Notification is sent on the Listener.Notify channel.
-	ListenerEventReconnected
-
-	// ListenerEventConnectionAttemptFailed is emitted after a connection
-	// to the database was attempted, but failed. The err argument will be
-	// set to an error describing why the connection attempt did not
-	// succeed.
-	ListenerEventConnectionAttemptFailed
-)
-
-// EventCallbackType is the event callback type. See also ListenerEventType
-// constants' documentation.
-type EventCallbackType func(event ListenerEventType, err error)
-
-// Listener provides an interface for listening to notifications from a
-// PostgreSQL database.  For general usage information, see section
-// "Notifications".
-//
-// Listener can safely be used from concurrently running goroutines.
-type Listener struct {
-	// Channel for receiving notifications from the database.  In some cases a
-	// nil value will be sent.  See section "Notifications" above.
-	Notify chan *Notification
-
-	name                 string
-	minReconnectInterval time.Duration
-	maxReconnectInterval time.Duration
-	dialer               Dialer
-	eventCallback        EventCallbackType
-
-	lock                 sync.Mutex
-	isClosed             bool
-	reconnectCond        *sync.Cond
-	cn                   *ListenerConn
-	connNotificationChan <-chan *Notification
-	channels             map[string]struct{}
-}
-
-// NewListener creates a new database connection dedicated to LISTEN / NOTIFY.
-//
-// name should be set to a connection string to be used to establish the
-// database connection (see section "Connection String Parameters" above).
-//
-// minReconnectInterval controls the duration to wait before trying to
-// re-establish the database connection after connection loss.  After each
-// consecutive failure this interval is doubled, until maxReconnectInterval is
-// reached.  Successfully completing the connection establishment procedure
-// resets the interval back to minReconnectInterval.
-//
-// The last parameter eventCallback can be set to a function which will be
-// called by the Listener when the state of the underlying database connection
-// changes.  This callback will be called by the goroutine which dispatches the
-// notifications over the Notify channel, so you should try to avoid doing
-// potentially time-consuming operations from the callback.
-func NewListener(name string,
-	minReconnectInterval time.Duration,
-	maxReconnectInterval time.Duration,
-	eventCallback EventCallbackType) *Listener {
-	return NewDialListener(defaultDialer{}, name, minReconnectInterval, maxReconnectInterval, eventCallback)
-}
-
-// NewDialListener is like NewListener but it takes a Dialer.
-func NewDialListener(d Dialer,
-	name string,
-	minReconnectInterval time.Duration,
-	maxReconnectInterval time.Duration,
-	eventCallback EventCallbackType) *Listener {
-
-	l := &Listener{
-		name:                 name,
-		minReconnectInterval: minReconnectInterval,
-		maxReconnectInterval: maxReconnectInterval,
-		dialer:               d,
-		eventCallback:        eventCallback,
-
-		channels: make(map[string]struct{}),
-
-		Notify: make(chan *Notification, 32),
-	}
-	l.reconnectCond = sync.NewCond(&l.lock)
-
-	go l.listenerMain()
-
-	return l
-}
-
-// NotificationChannel returns the notification channel for this listener.
-// This is the same channel as Notify, and will not be recreated during the
-// life time of the Listener.
-func (l *Listener) NotificationChannel() <-chan *Notification {
-	return l.Notify
-}
-
-// Listen starts listening for notifications on a channel.  Calls to this
-// function will block until an acknowledgement has been received from the
-// server.  Note that Listener automatically re-establishes the connection
-// after connection loss, so this function may block indefinitely if the
-// connection can not be re-established.
-//
-// Listen will only fail in three conditions:
-//   1) The channel is already open.  The returned error will be
-//      ErrChannelAlreadyOpen.
-//   2) The query was executed on the remote server, but PostgreSQL returned an
-//      error message in response to the query.  The returned error will be a
-//      pq.Error containing the information the server supplied.
-//   3) Close is called on the Listener before the request could be completed.
-//
-// The channel name is case-sensitive.
-func (l *Listener) Listen(channel string) error {
-	l.lock.Lock()
-	defer l.lock.Unlock()
-
-	if l.isClosed {
-		return errListenerClosed
-	}
-
-	// The server allows you to issue a LISTEN on a channel which is already
-	// open, but it seems useful to be able to detect this case to spot for
-	// mistakes in application logic.  If the application genuinely does't
-	// care, it can check the exported error and ignore it.
-	_, exists := l.channels[channel]
-	if exists {
-		return ErrChannelAlreadyOpen
-	}
-
-	if l.cn != nil {
-		// If gotResponse is true but error is set, the query was executed on
-		// the remote server, but resulted in an error.  This should be
-		// relatively rare, so it's fine if we just pass the error to our
-		// caller.  However, if gotResponse is false, we could not complete the
-		// query on the remote server and our underlying connection is about
-		// to go away, so we only add relname to l.channels, and wait for
-		// resync() to take care of the rest.
-		gotResponse, err := l.cn.Listen(channel)
-		if gotResponse && err != nil {
-			return err
-		}
-	}
-
-	l.channels[channel] = struct{}{}
-	for l.cn == nil {
-		l.reconnectCond.Wait()
-		// we let go of the mutex for a while
-		if l.isClosed {
-			return errListenerClosed
-		}
-	}
-
-	return nil
-}
-
-// Unlisten removes a channel from the Listener's channel list.  Returns
-// ErrChannelNotOpen if the Listener is not listening on the specified channel.
-// Returns immediately with no error if there is no connection.  Note that you
-// might still get notifications for this channel even after Unlisten has
-// returned.
-//
-// The channel name is case-sensitive.
-func (l *Listener) Unlisten(channel string) error {
-	l.lock.Lock()
-	defer l.lock.Unlock()
-
-	if l.isClosed {
-		return errListenerClosed
-	}
-
-	// Similarly to LISTEN, this is not an error in Postgres, but it seems
-	// useful to distinguish from the normal conditions.
-	_, exists := l.channels[channel]
-	if !exists {
-		return ErrChannelNotOpen
-	}
-
-	if l.cn != nil {
-		// Similarly to Listen (see comment in that function), the caller
-		// should only be bothered with an error if it came from the backend as
-		// a response to our query.
-		gotResponse, err := l.cn.Unlisten(channel)
-		if gotResponse && err != nil {
-			return err
-		}
-	}
-
-	// Don't bother waiting for resync if there's no connection.
-	delete(l.channels, channel)
-	return nil
-}
-
-// UnlistenAll removes all channels from the Listener's channel list.  Returns
-// immediately with no error if there is no connection.  Note that you might
-// still get notifications for any of the deleted channels even after
-// UnlistenAll has returned.
-func (l *Listener) UnlistenAll() error {
-	l.lock.Lock()
-	defer l.lock.Unlock()
-
-	if l.isClosed {
-		return errListenerClosed
-	}
-
-	if l.cn != nil {
-		// Similarly to Listen (see comment in that function), the caller
-		// should only be bothered with an error if it came from the backend as
-		// a response to our query.
-		gotResponse, err := l.cn.UnlistenAll()
-		if gotResponse && err != nil {
-			return err
-		}
-	}
-
-	// Don't bother waiting for resync if there's no connection.
-	l.channels = make(map[string]struct{})
-	return nil
-}
-
-// Ping the remote server to make sure it's alive.  Non-nil return value means
-// that there is no active connection.
-func (l *Listener) Ping() error {
-	l.lock.Lock()
-	defer l.lock.Unlock()
-
-	if l.isClosed {
-		return errListenerClosed
-	}
-	if l.cn == nil {
-		return errors.New("no connection")
-	}
-
-	return l.cn.Ping()
-}
-
-// Clean up after losing the server connection.  Returns l.cn.Err(), which
-// should have the reason the connection was lost.
-func (l *Listener) disconnectCleanup() error {
-	l.lock.Lock()
-	defer l.lock.Unlock()
-
-	// sanity check; can't look at Err() until the channel has been closed
-	select {
-	case _, ok := <-l.connNotificationChan:
-		if ok {
-			panic("connNotificationChan not closed")
-		}
-	default:
-		panic("connNotificationChan not closed")
-	}
-
-	err := l.cn.Err()
-	l.cn.Close()
-	l.cn = nil
-	return err
-}
-
-// Synchronize the list of channels we want to be listening on with the server
-// after the connection has been established.
-func (l *Listener) resync(cn *ListenerConn, notificationChan <-chan *Notification) error {
-	doneChan := make(chan error)
-	go func() {
-		for channel := range l.channels {
-			// If we got a response, return that error to our caller as it's
-			// going to be more descriptive than cn.Err().
-			gotResponse, err := cn.Listen(channel)
-			if gotResponse && err != nil {
-				doneChan <- err
-				return
-			}
-
-			// If we couldn't reach the server, wait for notificationChan to
-			// close and then return the error message from the connection, as
-			// per ListenerConn's interface.
-			if err != nil {
-				for range notificationChan {
-				}
-				doneChan <- cn.Err()
-				return
-			}
-		}
-		doneChan <- nil
-	}()
-
-	// Ignore notifications while synchronization is going on to avoid
-	// deadlocks.  We have to send a nil notification over Notify anyway as
-	// we can't possibly know which notifications (if any) were lost while
-	// the connection was down, so there's no reason to try and process
-	// these messages at all.
-	for {
-		select {
-		case _, ok := <-notificationChan:
-			if !ok {
-				notificationChan = nil
-			}
-
-		case err := <-doneChan:
-			return err
-		}
-	}
-}
-
-// caller should NOT be holding l.lock
-func (l *Listener) closed() bool {
-	l.lock.Lock()
-	defer l.lock.Unlock()
-
-	return l.isClosed
-}
-
-func (l *Listener) connect() error {
-	notificationChan := make(chan *Notification, 32)
-	cn, err := newDialListenerConn(l.dialer, l.name, notificationChan)
-	if err != nil {
-		return err
-	}
-
-	l.lock.Lock()
-	defer l.lock.Unlock()
-
-	err = l.resync(cn, notificationChan)
-	if err != nil {
-		cn.Close()
-		return err
-	}
-
-	l.cn = cn
-	l.connNotificationChan = notificationChan
-	l.reconnectCond.Broadcast()
-
-	return nil
-}
-
-// Close disconnects the Listener from the database and shuts it down.
-// Subsequent calls to its methods will return an error.  Close returns an
-// error if the connection has already been closed.
-func (l *Listener) Close() error {
-	l.lock.Lock()
-	defer l.lock.Unlock()
-
-	if l.isClosed {
-		return errListenerClosed
-	}
-
-	if l.cn != nil {
-		l.cn.Close()
-	}
-	l.isClosed = true
-
-	return nil
-}
-
-func (l *Listener) emitEvent(event ListenerEventType, err error) {
-	if l.eventCallback != nil {
-		l.eventCallback(event, err)
-	}
-}
-
-// Main logic here: maintain a connection to the server when possible, wait
-// for notifications and emit events.
-func (l *Listener) listenerConnLoop() {
-	var nextReconnect time.Time
-
-	reconnectInterval := l.minReconnectInterval
-	for {
-		for {
-			err := l.connect()
-			if err == nil {
-				break
-			}
-
-			if l.closed() {
-				return
-			}
-			l.emitEvent(ListenerEventConnectionAttemptFailed, err)
-
-			time.Sleep(reconnectInterval)
-			reconnectInterval *= 2
-			if reconnectInterval > l.maxReconnectInterval {
-				reconnectInterval = l.maxReconnectInterval
-			}
-		}
-
-		if nextReconnect.IsZero() {
-			l.emitEvent(ListenerEventConnected, nil)
-		} else {
-			l.emitEvent(ListenerEventReconnected, nil)
-			l.Notify <- nil
-		}
-
-		reconnectInterval = l.minReconnectInterval
-		nextReconnect = time.Now().Add(reconnectInterval)
-
-		for {
-			notification, ok := <-l.connNotificationChan
-			if !ok {
-				// lost connection, loop again
-				break
-			}
-			l.Notify <- notification
-		}
-
-		err := l.disconnectCleanup()
-		if l.closed() {
-			return
-		}
-		l.emitEvent(ListenerEventDisconnected, err)
-
-		time.Sleep(nextReconnect.Sub(time.Now()))
-	}
-}
-
-func (l *Listener) listenerMain() {
-	l.listenerConnLoop()
-	close(l.Notify)
-}
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/oid/gen.go b/traffic_ops/testing/api/vendor/github.com/lib/pq/oid/gen.go
deleted file mode 100644
index 7c634cdc5..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/oid/gen.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// +build ignore
-
-// Generate the table of OID values
-// Run with 'go run gen.go'.
-package main
-
-import (
-	"database/sql"
-	"fmt"
-	"log"
-	"os"
-	"os/exec"
-	"strings"
-
-	_ "github.com/lib/pq"
-)
-
-// OID represent a postgres Object Identifier Type.
-type OID struct {
-	ID   int
-	Type string
-}
-
-// Name returns an upper case version of the oid type.
-func (o OID) Name() string {
-	return strings.ToUpper(o.Type)
-}
-
-func main() {
-	datname := os.Getenv("PGDATABASE")
-	sslmode := os.Getenv("PGSSLMODE")
-
-	if datname == "" {
-		os.Setenv("PGDATABASE", "pqgotest")
-	}
-
-	if sslmode == "" {
-		os.Setenv("PGSSLMODE", "disable")
-	}
-
-	db, err := sql.Open("postgres", "")
-	if err != nil {
-		log.Fatal(err)
-	}
-	rows, err := db.Query(`
-		SELECT typname, oid
-		FROM pg_type WHERE oid < 10000
-		ORDER BY oid;
-	`)
-	if err != nil {
-		log.Fatal(err)
-	}
-	oids := make([]*OID, 0)
-	for rows.Next() {
-		var oid OID
-		if err = rows.Scan(&oid.Type, &oid.ID); err != nil {
-			log.Fatal(err)
-		}
-		oids = append(oids, &oid)
-	}
-	if err = rows.Err(); err != nil {
-		log.Fatal(err)
-	}
-	cmd := exec.Command("gofmt")
-	cmd.Stderr = os.Stderr
-	w, err := cmd.StdinPipe()
-	if err != nil {
-		log.Fatal(err)
-	}
-	f, err := os.Create("types.go")
-	if err != nil {
-		log.Fatal(err)
-	}
-	cmd.Stdout = f
-	err = cmd.Start()
-	if err != nil {
-		log.Fatal(err)
-	}
-	fmt.Fprintln(w, "// Code generated by gen.go. DO NOT EDIT.")
-	fmt.Fprintln(w, "\npackage oid")
-	fmt.Fprintln(w, "const (")
-	for _, oid := range oids {
-		fmt.Fprintf(w, "T_%s Oid = %d\n", oid.Type, oid.ID)
-	}
-	fmt.Fprintln(w, ")")
-	fmt.Fprintln(w, "var TypeName = map[Oid]string{")
-	for _, oid := range oids {
-		fmt.Fprintf(w, "T_%s: \"%s\",\n", oid.Type, oid.Name())
-	}
-	fmt.Fprintln(w, "}")
-	w.Close()
-	cmd.Wait()
-}
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/oid/types.go b/traffic_ops/testing/api/vendor/github.com/lib/pq/oid/types.go
deleted file mode 100644
index ecc84c2c8..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/oid/types.go
+++ /dev/null
@@ -1,343 +0,0 @@
-// Code generated by gen.go. DO NOT EDIT.
-
-package oid
-
-const (
-	T_bool             Oid = 16
-	T_bytea            Oid = 17
-	T_char             Oid = 18
-	T_name             Oid = 19
-	T_int8             Oid = 20
-	T_int2             Oid = 21
-	T_int2vector       Oid = 22
-	T_int4             Oid = 23
-	T_regproc          Oid = 24
-	T_text             Oid = 25
-	T_oid              Oid = 26
-	T_tid              Oid = 27
-	T_xid              Oid = 28
-	T_cid              Oid = 29
-	T_oidvector        Oid = 30
-	T_pg_ddl_command   Oid = 32
-	T_pg_type          Oid = 71
-	T_pg_attribute     Oid = 75
-	T_pg_proc          Oid = 81
-	T_pg_class         Oid = 83
-	T_json             Oid = 114
-	T_xml              Oid = 142
-	T__xml             Oid = 143
-	T_pg_node_tree     Oid = 194
-	T__json            Oid = 199
-	T_smgr             Oid = 210
-	T_index_am_handler Oid = 325
-	T_point            Oid = 600
-	T_lseg             Oid = 601
-	T_path             Oid = 602
-	T_box              Oid = 603
-	T_polygon          Oid = 604
-	T_line             Oid = 628
-	T__line            Oid = 629
-	T_cidr             Oid = 650
-	T__cidr            Oid = 651
-	T_float4           Oid = 700
-	T_float8           Oid = 701
-	T_abstime          Oid = 702
-	T_reltime          Oid = 703
-	T_tinterval        Oid = 704
-	T_unknown          Oid = 705
-	T_circle           Oid = 718
-	T__circle          Oid = 719
-	T_money            Oid = 790
-	T__money           Oid = 791
-	T_macaddr          Oid = 829
-	T_inet             Oid = 869
-	T__bool            Oid = 1000
-	T__bytea           Oid = 1001
-	T__char            Oid = 1002
-	T__name            Oid = 1003
-	T__int2            Oid = 1005
-	T__int2vector      Oid = 1006
-	T__int4            Oid = 1007
-	T__regproc         Oid = 1008
-	T__text            Oid = 1009
-	T__tid             Oid = 1010
-	T__xid             Oid = 1011
-	T__cid             Oid = 1012
-	T__oidvector       Oid = 1013
-	T__bpchar          Oid = 1014
-	T__varchar         Oid = 1015
-	T__int8            Oid = 1016
-	T__point           Oid = 1017
-	T__lseg            Oid = 1018
-	T__path            Oid = 1019
-	T__box             Oid = 1020
-	T__float4          Oid = 1021
-	T__float8          Oid = 1022
-	T__abstime         Oid = 1023
-	T__reltime         Oid = 1024
-	T__tinterval       Oid = 1025
-	T__polygon         Oid = 1027
-	T__oid             Oid = 1028
-	T_aclitem          Oid = 1033
-	T__aclitem         Oid = 1034
-	T__macaddr         Oid = 1040
-	T__inet            Oid = 1041
-	T_bpchar           Oid = 1042
-	T_varchar          Oid = 1043
-	T_date             Oid = 1082
-	T_time             Oid = 1083
-	T_timestamp        Oid = 1114
-	T__timestamp       Oid = 1115
-	T__date            Oid = 1182
-	T__time            Oid = 1183
-	T_timestamptz      Oid = 1184
-	T__timestamptz     Oid = 1185
-	T_interval         Oid = 1186
-	T__interval        Oid = 1187
-	T__numeric         Oid = 1231
-	T_pg_database      Oid = 1248
-	T__cstring         Oid = 1263
-	T_timetz           Oid = 1266
-	T__timetz          Oid = 1270
-	T_bit              Oid = 1560
-	T__bit             Oid = 1561
-	T_varbit           Oid = 1562
-	T__varbit          Oid = 1563
-	T_numeric          Oid = 1700
-	T_refcursor        Oid = 1790
-	T__refcursor       Oid = 2201
-	T_regprocedure     Oid = 2202
-	T_regoper          Oid = 2203
-	T_regoperator      Oid = 2204
-	T_regclass         Oid = 2205
-	T_regtype          Oid = 2206
-	T__regprocedure    Oid = 2207
-	T__regoper         Oid = 2208
-	T__regoperator     Oid = 2209
-	T__regclass        Oid = 2210
-	T__regtype         Oid = 2211
-	T_record           Oid = 2249
-	T_cstring          Oid = 2275
-	T_any              Oid = 2276
-	T_anyarray         Oid = 2277
-	T_void             Oid = 2278
-	T_trigger          Oid = 2279
-	T_language_handler Oid = 2280
-	T_internal         Oid = 2281
-	T_opaque           Oid = 2282
-	T_anyelement       Oid = 2283
-	T__record          Oid = 2287
-	T_anynonarray      Oid = 2776
-	T_pg_authid        Oid = 2842
-	T_pg_auth_members  Oid = 2843
-	T__txid_snapshot   Oid = 2949
-	T_uuid             Oid = 2950
-	T__uuid            Oid = 2951
-	T_txid_snapshot    Oid = 2970
-	T_fdw_handler      Oid = 3115
-	T_pg_lsn           Oid = 3220
-	T__pg_lsn          Oid = 3221
-	T_tsm_handler      Oid = 3310
-	T_anyenum          Oid = 3500
-	T_tsvector         Oid = 3614
-	T_tsquery          Oid = 3615
-	T_gtsvector        Oid = 3642
-	T__tsvector        Oid = 3643
-	T__gtsvector       Oid = 3644
-	T__tsquery         Oid = 3645
-	T_regconfig        Oid = 3734
-	T__regconfig       Oid = 3735
-	T_regdictionary    Oid = 3769
-	T__regdictionary   Oid = 3770
-	T_jsonb            Oid = 3802
-	T__jsonb           Oid = 3807
-	T_anyrange         Oid = 3831
-	T_event_trigger    Oid = 3838
-	T_int4range        Oid = 3904
-	T__int4range       Oid = 3905
-	T_numrange         Oid = 3906
-	T__numrange        Oid = 3907
-	T_tsrange          Oid = 3908
-	T__tsrange         Oid = 3909
-	T_tstzrange        Oid = 3910
-	T__tstzrange       Oid = 3911
-	T_daterange        Oid = 3912
-	T__daterange       Oid = 3913
-	T_int8range        Oid = 3926
-	T__int8range       Oid = 3927
-	T_pg_shseclabel    Oid = 4066
-	T_regnamespace     Oid = 4089
-	T__regnamespace    Oid = 4090
-	T_regrole          Oid = 4096
-	T__regrole         Oid = 4097
-)
-
-var TypeName = map[Oid]string{
-	T_bool:             "BOOL",
-	T_bytea:            "BYTEA",
-	T_char:             "CHAR",
-	T_name:             "NAME",
-	T_int8:             "INT8",
-	T_int2:             "INT2",
-	T_int2vector:       "INT2VECTOR",
-	T_int4:             "INT4",
-	T_regproc:          "REGPROC",
-	T_text:             "TEXT",
-	T_oid:              "OID",
-	T_tid:              "TID",
-	T_xid:              "XID",
-	T_cid:              "CID",
-	T_oidvector:        "OIDVECTOR",
-	T_pg_ddl_command:   "PG_DDL_COMMAND",
-	T_pg_type:          "PG_TYPE",
-	T_pg_attribute:     "PG_ATTRIBUTE",
-	T_pg_proc:          "PG_PROC",
-	T_pg_class:         "PG_CLASS",
-	T_json:             "JSON",
-	T_xml:              "XML",
-	T__xml:             "_XML",
-	T_pg_node_tree:     "PG_NODE_TREE",
-	T__json:            "_JSON",
-	T_smgr:             "SMGR",
-	T_index_am_handler: "INDEX_AM_HANDLER",
-	T_point:            "POINT",
-	T_lseg:             "LSEG",
-	T_path:             "PATH",
-	T_box:              "BOX",
-	T_polygon:          "POLYGON",
-	T_line:             "LINE",
-	T__line:            "_LINE",
-	T_cidr:             "CIDR",
-	T__cidr:            "_CIDR",
-	T_float4:           "FLOAT4",
-	T_float8:           "FLOAT8",
-	T_abstime:          "ABSTIME",
-	T_reltime:          "RELTIME",
-	T_tinterval:        "TINTERVAL",
-	T_unknown:          "UNKNOWN",
-	T_circle:           "CIRCLE",
-	T__circle:          "_CIRCLE",
-	T_money:            "MONEY",
-	T__money:           "_MONEY",
-	T_macaddr:          "MACADDR",
-	T_inet:             "INET",
-	T__bool:            "_BOOL",
-	T__bytea:           "_BYTEA",
-	T__char:            "_CHAR",
-	T__name:            "_NAME",
-	T__int2:            "_INT2",
-	T__int2vector:      "_INT2VECTOR",
-	T__int4:            "_INT4",
-	T__regproc:         "_REGPROC",
-	T__text:            "_TEXT",
-	T__tid:             "_TID",
-	T__xid:             "_XID",
-	T__cid:             "_CID",
-	T__oidvector:       "_OIDVECTOR",
-	T__bpchar:          "_BPCHAR",
-	T__varchar:         "_VARCHAR",
-	T__int8:            "_INT8",
-	T__point:           "_POINT",
-	T__lseg:            "_LSEG",
-	T__path:            "_PATH",
-	T__box:             "_BOX",
-	T__float4:          "_FLOAT4",
-	T__float8:          "_FLOAT8",
-	T__abstime:         "_ABSTIME",
-	T__reltime:         "_RELTIME",
-	T__tinterval:       "_TINTERVAL",
-	T__polygon:         "_POLYGON",
-	T__oid:             "_OID",
-	T_aclitem:          "ACLITEM",
-	T__aclitem:         "_ACLITEM",
-	T__macaddr:         "_MACADDR",
-	T__inet:            "_INET",
-	T_bpchar:           "BPCHAR",
-	T_varchar:          "VARCHAR",
-	T_date:             "DATE",
-	T_time:             "TIME",
-	T_timestamp:        "TIMESTAMP",
-	T__timestamp:       "_TIMESTAMP",
-	T__date:            "_DATE",
-	T__time:            "_TIME",
-	T_timestamptz:      "TIMESTAMPTZ",
-	T__timestamptz:     "_TIMESTAMPTZ",
-	T_interval:         "INTERVAL",
-	T__interval:        "_INTERVAL",
-	T__numeric:         "_NUMERIC",
-	T_pg_database:      "PG_DATABASE",
-	T__cstring:         "_CSTRING",
-	T_timetz:           "TIMETZ",
-	T__timetz:          "_TIMETZ",
-	T_bit:              "BIT",
-	T__bit:             "_BIT",
-	T_varbit:           "VARBIT",
-	T__varbit:          "_VARBIT",
-	T_numeric:          "NUMERIC",
-	T_refcursor:        "REFCURSOR",
-	T__refcursor:       "_REFCURSOR",
-	T_regprocedure:     "REGPROCEDURE",
-	T_regoper:          "REGOPER",
-	T_regoperator:      "REGOPERATOR",
-	T_regclass:         "REGCLASS",
-	T_regtype:          "REGTYPE",
-	T__regprocedure:    "_REGPROCEDURE",
-	T__regoper:         "_REGOPER",
-	T__regoperator:     "_REGOPERATOR",
-	T__regclass:        "_REGCLASS",
-	T__regtype:         "_REGTYPE",
-	T_record:           "RECORD",
-	T_cstring:          "CSTRING",
-	T_any:              "ANY",
-	T_anyarray:         "ANYARRAY",
-	T_void:             "VOID",
-	T_trigger:          "TRIGGER",
-	T_language_handler: "LANGUAGE_HANDLER",
-	T_internal:         "INTERNAL",
-	T_opaque:           "OPAQUE",
-	T_anyelement:       "ANYELEMENT",
-	T__record:          "_RECORD",
-	T_anynonarray:      "ANYNONARRAY",
-	T_pg_authid:        "PG_AUTHID",
-	T_pg_auth_members:  "PG_AUTH_MEMBERS",
-	T__txid_snapshot:   "_TXID_SNAPSHOT",
-	T_uuid:             "UUID",
-	T__uuid:            "_UUID",
-	T_txid_snapshot:    "TXID_SNAPSHOT",
-	T_fdw_handler:      "FDW_HANDLER",
-	T_pg_lsn:           "PG_LSN",
-	T__pg_lsn:          "_PG_LSN",
-	T_tsm_handler:      "TSM_HANDLER",
-	T_anyenum:          "ANYENUM",
-	T_tsvector:         "TSVECTOR",
-	T_tsquery:          "TSQUERY",
-	T_gtsvector:        "GTSVECTOR",
-	T__tsvector:        "_TSVECTOR",
-	T__gtsvector:       "_GTSVECTOR",
-	T__tsquery:         "_TSQUERY",
-	T_regconfig:        "REGCONFIG",
-	T__regconfig:       "_REGCONFIG",
-	T_regdictionary:    "REGDICTIONARY",
-	T__regdictionary:   "_REGDICTIONARY",
-	T_jsonb:            "JSONB",
-	T__jsonb:           "_JSONB",
-	T_anyrange:         "ANYRANGE",
-	T_event_trigger:    "EVENT_TRIGGER",
-	T_int4range:        "INT4RANGE",
-	T__int4range:       "_INT4RANGE",
-	T_numrange:         "NUMRANGE",
-	T__numrange:        "_NUMRANGE",
-	T_tsrange:          "TSRANGE",
-	T__tsrange:         "_TSRANGE",
-	T_tstzrange:        "TSTZRANGE",
-	T__tstzrange:       "_TSTZRANGE",
-	T_daterange:        "DATERANGE",
-	T__daterange:       "_DATERANGE",
-	T_int8range:        "INT8RANGE",
-	T__int8range:       "_INT8RANGE",
-	T_pg_shseclabel:    "PG_SHSECLABEL",
-	T_regnamespace:     "REGNAMESPACE",
-	T__regnamespace:    "_REGNAMESPACE",
-	T_regrole:          "REGROLE",
-	T__regrole:         "_REGROLE",
-}
diff --git a/traffic_ops/testing/api/vendor/github.com/lib/pq/rows.go b/traffic_ops/testing/api/vendor/github.com/lib/pq/rows.go
deleted file mode 100644
index c6aa5b9a3..000000000
--- a/traffic_ops/testing/api/vendor/github.com/lib/pq/rows.go
+++ /dev/null
@@ -1,93 +0,0 @@
-package pq
-
-import (
-	"math"
-	"reflect"
-	"time"
-
-	"github.com/lib/pq/oid"
-)
-
-const headerSize = 4
-
-type fieldDesc struct {
-	// The object ID of the data type.
-	OID oid.Oid
-	// The data type size (see pg_type.typlen).
-	// Note that negative values denote variable-width types.
-	Len int
-	// The type modifier (see pg_attribute.atttypmod).
-	// The meaning of the modifier is type-specific.
-	Mod int
-}
-
-func (fd fieldDesc) Type() reflect.Type {
-	switch fd.OID {
-	case oid.T_int8:
-		return reflect.TypeOf(int64(0))
-	case oid.T_int4:
-		return reflect.TypeOf(int32(0))
-	case oid.T_int2:
-		return reflect.TypeOf(int16(0))
-	case oid.T_varchar, oid.T_text:
-		return reflect.TypeOf("")
-	case oid.T_bool:
-		return reflect.TypeOf(false)
-	case oid.T_date, oid.T_time, oid.T_timetz, oid.T_timestamp, oid.T_timestamptz:
-		return reflect.TypeOf(time.Time{})
-	case oid.T_bytea:
-		return reflect.TypeOf([]byte(nil))
-	default:
-		return reflect.TypeOf(new(interface{})).Elem()
-	}
-}
-
-func (fd fieldDesc) Name() string {
-	return oid.TypeName[fd.OID]
-}
-
-func (fd fieldDesc) Length() (length int64, ok bool) {
-	switch fd.OID {
-	case oid.T_text, oid.T_bytea:
-		return math.MaxInt64, true
-	case oid.T_varchar, oid.T_bpchar:
-		return int64(fd.Mod - headerSize), true
-	default:
-		return 0, false
-	}
-}
-
-func (fd fieldDesc) PrecisionScale() (precision, scale int64, ok bool) {
-	switch fd.OID {
-	case oid.T_numeric, oid.T__numeric:
-		mod := fd.Mod - headerSize
-		precision = int64((mod >> 16) & 0xffff)
-		scale = int64(mod & 0xffff)
-		return precision, scale, true
-	default:
-		return 0, 0, false
-	}
-}
-
-// ColumnTypeScanType returns the value type that can be used to scan types into.
-func (rs *rows) ColumnTypeScanType(index int) reflect.Type {
-	return rs.colTyps[index].Type()
-}
-
-// ColumnTypeDatabaseTypeName return the database system type name.
-func (rs *rows) ColumnTypeDatabaseTypeName(index int) string {
-	return rs.colTyps[index].Name()
-}
-
-// ColumnTypeLength returns the length of the column type if the column is a
-// variable length type. If the column is not a variable length type ok
-// should return false.
-func (rs *rows) ColumnTypeLength(index int) (length int64, ok bool) {
-	return rs.colTyps[index].Length()
-}
-
-// ColumnTypePrecisionScale should return the precision and scale for decimal
-// types. If not applicable, ok should be false.
-func (rs *rows) ColumnTypePrecisionScale(index int) (precision, scale int64, ok bool) {
-	return rs.colTyps[index].PrecisionScale()
-}
diff --git a/traffic_ops/testing/compare/compare.go b/traffic_ops/testing/compare/compare.go
index 58e3badbc..b11f88436 100644
--- a/traffic_ops/testing/compare/compare.go
+++ b/traffic_ops/testing/compare/compare.go
@@ -295,9 +295,13 @@ func main() {
 		}
 		log.Printf("CDNNames are %+v", cdnNames)
 
-		wg.Add(len(cdnNames))
+		wg.Add(2*len(cdnNames))
 		for _, cdnName := range cdnNames {
 			log.Print("CDN ", cdnName)
+			go func(c string) {
+				testRoute(tos, `api/1.3/cdns/`+c+`/snapshot`)
+				wg.Done()
+			}(cdnName)
 			go func(c string) {
 				testRoute(tos, `api/1.3/cdns/`+c+`/snapshot/new`)
 				wg.Done()
diff --git a/traffic_ops/testing/compare/testroutes.txt b/traffic_ops/testing/compare/testroutes.txt
index 27e768c76..4c9e72c49 100644
--- a/traffic_ops/testing/compare/testroutes.txt
+++ b/traffic_ops/testing/compare/testroutes.txt
@@ -1,3 +1,4 @@
+api/1.3/about
 api/1.3/asns?orderby=id
 api/1.3/cdns?orderby=id
 api/1.3/divisions?orderby=id
diff --git a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/LICENSE b/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/LICENSE
deleted file mode 100644
index 4bfa7a84d..000000000
--- a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2013 Kelsey Hightower
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/MAINTAINERS b/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/MAINTAINERS
deleted file mode 100644
index 6527a9f2c..000000000
--- a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Kelsey Hightower kelsey.hightower@gmail.com github.com/kelseyhightower
-Travis Parker    travis.parker@gmail.com    github.com/teepark
diff --git a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/doc.go b/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/doc.go
deleted file mode 100644
index f28561cd1..000000000
--- a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/doc.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2013 Kelsey Hightower. All rights reserved.
-// Use of this source code is governed by the MIT License that can be found in
-// the LICENSE file.
-
-// Package envconfig implements decoding of environment variables based on a user
-// defined specification. A typical use is using environment variables for
-// configuration settings.
-package envconfig
diff --git a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/env_syscall.go b/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/env_syscall.go
deleted file mode 100644
index 9d98085b9..000000000
--- a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/env_syscall.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build !appengine
-
-package envconfig
-
-import "syscall"
-
-var lookupEnv = syscall.Getenv
diff --git a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/envconfig.go b/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/envconfig.go
deleted file mode 100644
index 10f2de8d7..000000000
--- a/traffic_ops/testing/compare/vendor/github.com/kelseyhightower/envconfig/envconfig.go
+++ /dev/null
@@ -1,326 +0,0 @@
-// Copyright (c) 2013 Kelsey Hightower. All rights reserved.
-// Use of this source code is governed by the MIT License that can be found in
-// the LICENSE file.
-
-package envconfig
-
-import (
-	"encoding"
-	"errors"
-	"fmt"
-	"reflect"
-	"regexp"
-	"strconv"
-	"strings"
-	"time"
-)
-
-// ErrInvalidSpecification indicates that a specification is of the wrong type.
-var ErrInvalidSpecification = errors.New("specification must be a struct pointer")
-
-// A ParseError occurs when an environment variable cannot be converted to
-// the type required by a struct field during assignment.
-type ParseError struct {
-	KeyName   string
-	FieldName string
-	TypeName  string
-	Value     string
-	Err       error
-}
-
-// Decoder has the same semantics as Setter, but takes higher precedence.
-// It is provided for historical compatibility.
-type Decoder interface {
-	Decode(value string) error
-}
-
-// Setter is implemented by types can self-deserialize values.
-// Any type that implements flag.Value also implements Setter.
-type Setter interface {
-	Set(value string) error
-}
-
-func (e *ParseError) Error() string {
-	return fmt.Sprintf("envconfig.Process: assigning %[1]s to %[2]s: converting '%[3]s' to type %[4]s. details: %[5]s", e.KeyName, e.FieldName, e.Value, e.TypeName, e.Err)
-}
-
-// varInfo maintains information about the configuration variable
-type varInfo struct {
-	Name  string
-	Alt   string
-	Key   string
-	Field reflect.Value
-	Tags  reflect.StructTag
-}
-
-// GatherInfo gathers information about the specified struct
-func gatherInfo(prefix string, spec interface{}) ([]varInfo, error) {
-	expr := regexp.MustCompile("([^A-Z]+|[A-Z][^A-Z]+|[A-Z]+)")
-	s := reflect.ValueOf(spec)
-
-	if s.Kind() != reflect.Ptr {
-		return nil, ErrInvalidSpecification
-	}
-	s = s.Elem()
-	if s.Kind() != reflect.Struct {
-		return nil, ErrInvalidSpecification
-	}
-	typeOfSpec := s.Type()
-
-	// over allocate an info array, we will extend if needed later
-	infos := make([]varInfo, 0, s.NumField())
-	for i := 0; i < s.NumField(); i++ {
-		f := s.Field(i)
-		ftype := typeOfSpec.Field(i)
-		if !f.CanSet() || isTrue(ftype.Tag.Get("ignored")) {
-			continue
-		}
-
-		for f.Kind() == reflect.Ptr {
-			if f.IsNil() {
-				if f.Type().Elem().Kind() != reflect.Struct {
-					// nil pointer to a non-struct: leave it alone
-					break
-				}
-				// nil pointer to struct: create a zero instance
-				f.Set(reflect.New(f.Type().Elem()))
-			}
-			f = f.Elem()
-		}
-
-		// Capture information about the config variable
-		info := varInfo{
-			Name:  ftype.Name,
-			Field: f,
-			Tags:  ftype.Tag,
-			Alt:   strings.ToUpper(ftype.Tag.Get("envconfig")),
-		}
-
-		// Default to the field name as the env var name (will be upcased)
-		info.Key = info.Name
-
-		// Best effort to un-pick camel casing as separate words
-		if isTrue(ftype.Tag.Get("split_words")) {
-			words := expr.FindAllStringSubmatch(ftype.Name, -1)
-			if len(words) > 0 {
-				var name []string
-				for _, words := range words {
-					name = append(name, words[0])
-				}
-
-				info.Key = strings.Join(name, "_")
-			}
-		}
-		if info.Alt != "" {
-			info.Key = info.Alt
-		}
-		if prefix != "" {
-			info.Key = fmt.Sprintf("%s_%s", prefix, info.Key)
-		}
-		info.Key = strings.ToUpper(info.Key)
-		infos = append(infos, info)
-
-		if f.Kind() == reflect.Struct {
-			// honor Decode if present
-			if decoderFrom(f) == nil && setterFrom(f) == nil && textUnmarshaler(f) == nil {
-				innerPrefix := prefix
-				if !ftype.Anonymous {
-					innerPrefix = info.Key
-				}
-
-				embeddedPtr := f.Addr().Interface()
-				embeddedInfos, err := gatherInfo(innerPrefix, embeddedPtr)
-				if err != nil {
-					return nil, err
-				}
-				infos = append(infos[:len(infos)-1], embeddedInfos...)
-
-				continue
-			}
-		}
-	}
-	return infos, nil
-}
-
-// Process populates the specified struct based on environment variables
-func Process(prefix string, spec interface{}) error {
-	infos, err := gatherInfo(prefix, spec)
-
-	for _, info := range infos {
-
-		// `os.Getenv` cannot differentiate between an explicitly set empty value
-		// and an unset value. `os.LookupEnv` is preferred to `syscall.Getenv`,
-		// but it is only available in go1.5 or newer. We're using Go build tags
-		// here to use os.LookupEnv for >=go1.5
-		value, ok := lookupEnv(info.Key)
-		if !ok && info.Alt != "" {
-			value, ok = lookupEnv(info.Alt)
-		}
-
-		def := info.Tags.Get("default")
-		if def != "" && !ok {
-			value = def
-		}
-
-		req := info.Tags.Get("required")
-		if !ok && def == "" {
-			if isTrue(req) {
-				return fmt.Errorf("required key %s missing value", info.Key)
-			}
-			continue
-		}
-
-		err := processField(value, info.Field)
-		if err != nil {
-			return &ParseError{
-				KeyName:   info.Key,
-				FieldName: info.Name,
-				TypeName:  info.Field.Type().String(),
-				Value:     value,
-				Err:       err,
-			}
-		}
-	}
-
-	return err
-}
-
-// MustProcess is the same as Process but panics if an error occurs
-func MustProcess(prefix string, spec interface{}) {
-	if err := Process(prefix, spec); err != nil {
-		panic(err)
-	}
-}
-
-func processField(value string, field reflect.Value) error {
-	typ := field.Type()
-
-	decoder := decoderFrom(field)
-	if decoder != nil {
-		return decoder.Decode(value)
-	}
-	// look for Set method if Decode not defined
-	setter := setterFrom(field)
-	if setter != nil {
-		return setter.Set(value)
-	}
-
-	if t := textUnmarshaler(field); t != nil {
-		return t.UnmarshalText([]byte(value))
-	}
-
-	if typ.Kind() == reflect.Ptr {
-		typ = typ.Elem()
-		if field.IsNil() {
-			field.Set(reflect.New(typ))
-		}
-		field = field.Elem()
-	}
-
-	switch typ.Kind() {
-	case reflect.String:
-		field.SetString(value)
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		var (
-			val int64
-			err error
-		)
-		if field.Kind() == reflect.Int64 && typ.PkgPath() == "time" && typ.Name() == "Duration" {
-			var d time.Duration
-			d, err = time.ParseDuration(value)
-			val = int64(d)
-		} else {
-			val, err = strconv.ParseInt(value, 0, typ.Bits())
-		}
-		if err != nil {
-			return err
-		}
-
-		field.SetInt(val)
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-		val, err := strconv.ParseUint(value, 0, typ.Bits())
-		if err != nil {
-			return err
-		}
-		field.SetUint(val)
-	case reflect.Bool:
-		val, err := strconv.ParseBool(value)
-		if err != nil {
-			return err
-		}
-		field.SetBool(val)
-	case reflect.Float32, reflect.Float64:
-		val, err := strconv.ParseFloat(value, typ.Bits())
-		if err != nil {
-			return err
-		}
-		field.SetFloat(val)
-	case reflect.Slice:
-		vals := strings.Split(value, ",")
-		sl := reflect.MakeSlice(typ, len(vals), len(vals))
-		for i, val := range vals {
-			err := processField(val, sl.Index(i))
-			if err != nil {
-				return err
-			}
-		}
-		field.Set(sl)
-	case reflect.Map:
-		mp := reflect.MakeMap(typ)
-		if len(strings.TrimSpace(value)) != 0 {
-			pairs := strings.Split(value, ",")
-			for _, pair := range pairs {
-				kvpair := strings.Split(pair, ":")
-				if len(kvpair) != 2 {
-					return fmt.Errorf("invalid map item: %q", pair)
-				}
-				k := reflect.New(typ.Key()).Elem()
-				err := processField(kvpair[0], k)
-				if err != nil {
-					return err
-				}
-				v := reflect.New(typ.Elem()).Elem()
-				err = processField(kvpair[1], v)
-				if err != nil {
-					return err
-				}
-				mp.SetMapIndex(k, v)
-			}
-		}
-		field.Set(mp)
-	}
-
-	return nil
-}
-
-func interfaceFrom(field reflect.Value, fn func(interface{}, *bool)) {
-	// it may be impossible for a struct field to fail this check
-	if !field.CanInterface() {
-		return
-	}
-	var ok bool
-	fn(field.Interface(), &ok)
-	if !ok && field.CanAddr() {
-		fn(field.Addr().Interface(), &ok)
-	}
-}
-
-func decoderFrom(field reflect.Value) (d Decoder) {
-	interfaceFrom(field, func(v interface{}, ok *bool) { d, *ok = v.(Decoder) })
-	return d
-}
-
-func setterFrom(field reflect.Value) (s Setter) {
-	interfaceFrom(field, func(v interface{}, ok *bool) { s, *ok = v.(Setter) })
-	return s
-}
-
-func textUnmarshaler(field reflect.Value) (t encoding.TextUnmarshaler) {
-	interfaceFrom(field, func(v interface{}, ok *bool) { t, *ok = v.(encoding.TextUnmarshaler) })
-	return t
-}
-
-func isTrue(s string) bool {
-	b, _ := strconv.ParseBool(s)
-	return b
-}
diff --git a/traffic_ops/testing/compare/vendor/vendor.json b/traffic_ops/testing/compare/vendor/vendor.json
deleted file mode 100644
index e6e3c12b6..000000000
--- a/traffic_ops/testing/compare/vendor/vendor.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-	"comment": "",
-	"ignore": "test",
-	"package": [
-		{
-			"checksumSHA1": "Jrjxy16tD9mUgr/jbhXwbHVeSa0=",
-			"path": "github.com/kelseyhightower/envconfig",
-			"revision": "462fda1f11d8cad3660e52737b8beefd27acfb3f",
-			"revisionTime": "2017-09-18T16:15:10Z"
-		},
-		{
-			"checksumSHA1": "nt4o3cMOyP9prgVeAZgRf82/Et0=",
-			"path": "golang.org/x/net/publicsuffix",
-			"revision": "894f8ed5849b15b810ae41e9590a0d05395bba27",
-			"revisionTime": "2017-11-28T02:01:48Z"
-		}
-	],
-	"rootPath": "github.com/dangogh/incubator-trafficcontrol/traffic_ops/testing/cfg"
-}
diff --git a/traffic_ops/traffic_ops_golang/asn/asns.go b/traffic_ops/traffic_ops_golang/asn/asns.go
index 4a5db6707..ff77b4410 100644
--- a/traffic_ops/traffic_ops_golang/asn/asns.go
+++ b/traffic_ops/traffic_ops_golang/asn/asns.go
@@ -21,8 +21,10 @@ package asn
 
 import (
 	"errors"
+	"net/http"
 	"fmt"
 	"strconv"
+	"encoding/json"
 
 	"github.com/apache/incubator-trafficcontrol/lib/go-log"
 	"github.com/apache/incubator-trafficcontrol/lib/go-tc"
@@ -39,33 +41,40 @@ import (
 const ASNsPrivLevel = 10
 
 //we need a type alias to define functions on
-type TOASN tc.ASNNullable
+type TOASNV11 tc.ASNNullable
 
-//the refType is passed into the handlers where a copy of its type is used to decode the json.
-var refType = TOASN(tc.ASNNullable{})
+type TOASNV12 TOASNV11
 
-func GetRefType() *TOASN {
-	return &refType
+func GetRefTypeV11() *TOASNV11 {
+	asn := TOASNV11(tc.ASNNullable{})
+	return &asn
 }
 
-func (asn TOASN) GetKeyFieldsInfo() []api.KeyFieldInfo {
+func GetRefTypeV12() *TOASNV12 {
+	asn := TOASNV12(tc.ASNNullable{})
+	return &asn
+}
+
+func (asn TOASNV11) GetKeyFieldsInfo() []api.KeyFieldInfo {
 	return []api.KeyFieldInfo{{"id", api.GetIntKey}}
 }
 
+// func (asn TOASNV12) GetKeyFieldsInfo() []api.KeyFieldInfo { return TOASNV11(asn).GetKeyFieldsInfo() }
+
 //Implementation of the Identifier, Validator interface functions
-func (asn TOASN) GetKeys() (map[string]interface{}, bool) {
+func (asn TOASNV11) GetKeys() (map[string]interface{}, bool) {
 	if asn.ID == nil {
 		return map[string]interface{}{"id": 0}, false
 	}
 	return map[string]interface{}{"id": *asn.ID}, true
 }
 
-func (asn *TOASN) SetKeys(keys map[string]interface{}) {
+func (asn *TOASNV11) SetKeys(keys map[string]interface{}) {
 	i, _ := keys["id"].(int) //this utilizes the non panicking type assertion, if the thrown away ok variable is false i will be the zero of the type, 0 here.
 	asn.ID = &i
 }
 
-func (asn TOASN) GetAuditName() string {
+func (asn TOASNV11) GetAuditName() string {
 	if asn.ASN != nil {
 		return strconv.Itoa(*asn.ASN)
 	}
@@ -75,11 +84,11 @@ func (asn TOASN) GetAuditName() string {
 	return "unknown"
 }
 
-func (asn TOASN) GetType() string {
+func (asn TOASNV11) GetType() string {
 	return "asn"
 }
 
-func (asn TOASN) Validate(db *sqlx.DB) []error {
+func (asn TOASNV11) Validate(db *sqlx.DB) []error {
 	errs := validation.Errors{
 		"asn":          validation.Validate(asn.ASN, validation.NotNil, validation.Min(0)),
 		"cachegroupId": validation.Validate(asn.CachegroupID, validation.NotNil, validation.Min(0)),
@@ -87,14 +96,14 @@ func (asn TOASN) Validate(db *sqlx.DB) []error {
 	return tovalidate.ToErrors(errs)
 }
 
-//The TOASN implementation of the Creator interface
+//The TOASNV11 implementation of the Creator interface
 //all implementations of Creator should use transactions and return the proper errorType
 //ParsePQUniqueConstraintError is used to determine if a asn with conflicting values exists
 //if so, it will return an errorType of DataConflict and the type should be appended to the
 //generic error message returned
 //The insert sql returns the id and lastUpdated values of the newly inserted asn and have
 //to be added to the struct
-func (asn *TOASN) Create(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+func (asn *TOASNV11) Create(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
 	rollbackTransaction := true
 	tx, err := db.Beginx()
 	defer func() {
@@ -156,9 +165,64 @@ func (asn *TOASN) Create(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiError
 	return nil, tc.NoError
 }
 
-func (asn *TOASN) Read(db *sqlx.DB, parameters map[string]string, user auth.CurrentUser) ([]interface{}, []error, tc.ApiErrorType) {
-	var rows *sqlx.Rows
+func (asn *TOASNV12) Read(db *sqlx.DB, parameters map[string]string, user auth.CurrentUser) ([]interface{}, []error, tc.ApiErrorType) {
+	asns, err, errType := read(db, parameters, user)
+	if len(err) > 0 {
+		return nil, err, errType
+	}
+	iasns := make([]interface{}, len(asns), len(asns))
+	for i, readASN := range asns {
+		iasns[i] = readASN
+	}
+	return iasns, err, errType
+}
+
+// Read implements the /api/1.1/asns/id route for reading individual ASNs.
+// Note this does NOT correctly implement the 1.1 API for all ASNs, because that route is in a different format than the CRUD utilities and all other routes.
+// The /api/1.1/asns route MUST call V11ReadAll, not this function, to correctly implement the 1.1 API.
+func (asn *TOASNV11) Read(db *sqlx.DB, params map[string]string, user auth.CurrentUser) ([]interface{}, []error, tc.ApiErrorType) {
+	v12 := TOASNV12(*asn)
+	return v12.Read(db, params, user)
+}
+
+// V11ReadAll implements the asns 1.1 route, which is different from the 1.1 route for a single ASN and from 1.2+ routes, in that it wraps the content in an additional "asns" object.
+func V11ReadAll(db *sqlx.DB) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		handleErrs := tc.GetHandleErrorsFunc(w, r)
+		ctx := r.Context()
+		params, err := api.GetCombinedParams(r)
+		if err != nil {
+			handleErrs(http.StatusInternalServerError, err)
+			return
+		}
+		user, err := auth.GetCurrentUser(ctx)
+		if err != nil {
+			log.Errorf("unable to retrieve current user from context: %s", err)
+			handleErrs(http.StatusInternalServerError, err)
+			return
+		}
+		asns, errs, errType := read(db, params, *user)
+		if len(errs) > 0 {
+			tc.HandleErrorsWithType(errs, errType, handleErrs)
+			return
+		}
+		resp := struct {
+			Response struct {
+				ASNs []TOASNV12 `json:"asns"`
+			} `json:"response"`
+		}{Response: struct {ASNs []TOASNV12  `json:"asns"` }{ASNs: asns}}
+
+		respBts, err := json.Marshal(resp)
+		if err != nil {
+			handleErrs(http.StatusInternalServerError, err)
+			return
+		}
+		w.Header().Set("Content-Type", "application/json")
+		fmt.Fprintf(w, "%s", respBts)
+	}
+}
 
+func read(db *sqlx.DB, parameters map[string]string, user auth.CurrentUser) ([]TOASNV12, []error, tc.ApiErrorType) {
 	// Query Parameters to Database Query column mappings
 	// see the fields mapped in the SQL query
 	queryParamsToQueryCols := map[string]dbhelpers.WhereColumnInfo{
@@ -182,9 +246,9 @@ func (asn *TOASN) Read(db *sqlx.DB, parameters map[string]string, user auth.Curr
 	}
 	defer rows.Close()
 
-	ASNs := []interface{}{}
+	ASNs := []TOASNV12{}
 	for rows.Next() {
-		var s TOASN
+		var s TOASNV12
 		if err = rows.StructScan(&s); err != nil {
 			log.Errorf("error parsing ASN rows: %v", err)
 			return nil, []error{err}, tc.SystemError
@@ -207,12 +271,12 @@ FROM asn a JOIN cachegroup c ON a.cachegroup = c.id`
 	return query
 }
 
-//The TOASN implementation of the Updater interface
+//The TOASNV11 implementation of the Updater interface
 //all implementations of Updater should use transactions and return the proper errorType
 //ParsePQUniqueConstraintError is used to determine if a asn with conflicting values exists
 //if so, it will return an errorType of DataConflict and the type should be appended to the
 //generic error message returned
-func (asn *TOASN) Update(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+func (asn *TOASNV11) Update(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
 	rollbackTransaction := true
 	tx, err := db.Beginx()
 	defer func() {
@@ -274,7 +338,7 @@ func (asn *TOASN) Update(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiError
 
 //The ASN implementation of the Deleter interface
 //all implementations of Deleter should use transactions and return the proper errorType
-func (asn *TOASN) Delete(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+func (asn *TOASNV11) Delete(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
 	rollbackTransaction := true
 	tx, err := db.Beginx()
 	defer func() {
diff --git a/traffic_ops/traffic_ops_golang/asn/asns_test.go b/traffic_ops/traffic_ops_golang/asn/asns_test.go
index 6c500ff1e..ac13975ce 100644
--- a/traffic_ops/traffic_ops_golang/asn/asns_test.go
+++ b/traffic_ops/traffic_ops_golang/asn/asns_test.go
@@ -34,11 +34,11 @@ import (
 	sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1"
 )
 
-func getTestASNs() []TOASN {
-	ASNs := []TOASN{}
+func getTestASNs() []TOASNV11 {
+	ASNs := []TOASNV11{}
 	i := 1
 	c := "Yukon"
-	testCase := TOASN{
+	testCase := TOASNV11{
 		ASN:          &i,
 		Cachegroup:   &c,
 		CachegroupID: &i,
@@ -65,7 +65,7 @@ func TestGetASNs(t *testing.T) {
 	defer db.Close()
 
 	testCase := getTestASNs()
-	cols := test.ColsFromStructByTag("db", TOASN{})
+	cols := test.ColsFromStructByTag("db", TOASNV11{})
 	rows := sqlmock.NewRows(cols)
 
 	for _, ts := range testCase {
@@ -79,7 +79,7 @@ func TestGetASNs(t *testing.T) {
 	mock.ExpectQuery("SELECT").WillReturnRows(rows)
 	v := map[string]string{"dsId": "1"}
 
-	asns, errs, _ := refType.Read(db, v, auth.CurrentUser{})
+	asns, errs, _ := GetRefTypeV11().Read(db, v, auth.CurrentUser{})
 
 	if len(errs) > 0 {
 		t.Errorf("asn.Read expected: no errors, actual: %v", errs)
@@ -93,7 +93,7 @@ func TestGetASNs(t *testing.T) {
 
 func TestInterfaces(t *testing.T) {
 	var i interface{}
-	i = &TOASN{}
+	i = &TOASNV11{}
 
 	if _, ok := i.(api.Creator); !ok {
 		t.Errorf("asn must be creator")
@@ -114,7 +114,7 @@ func TestInterfaces(t *testing.T) {
 
 func TestValidate(t *testing.T) {
 	i := -99
-	asn := TOASN{ASN: &i, CachegroupID: &i}
+	asn := TOASNV11{ASN: &i, CachegroupID: &i}
 
 	errs := test.SortErrors(asn.Validate(nil))
 	expected := []error{
diff --git a/traffic_ops/traffic_ops_golang/coordinate/coordinates.go b/traffic_ops/traffic_ops_golang/coordinate/coordinates.go
new file mode 100644
index 000000000..331e48ee6
--- /dev/null
+++ b/traffic_ops/traffic_ops_golang/coordinate/coordinates.go
@@ -0,0 +1,369 @@
+package coordinate
+
+/*
+ * 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.
+ */
+
+import (
+	"errors"
+	"fmt"
+	"strconv"
+	"strings"
+
+	"github.com/apache/incubator-trafficcontrol/lib/go-log"
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc"
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc/v13"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/api"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/auth"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/dbhelpers"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/tovalidate"
+	validation "github.com/go-ozzo/ozzo-validation"
+	"github.com/jmoiron/sqlx"
+	"github.com/lib/pq"
+)
+
+//we need a type alias to define functions on
+type TOCoordinate v13.CoordinateNullable
+
+//the refType is passed into the handlers where a copy of its type is used to decode the json.
+var refType = TOCoordinate{}
+
+func GetRefType() *TOCoordinate {
+	return &refType
+}
+
+func (coordinate TOCoordinate) GetKeyFieldsInfo() []api.KeyFieldInfo {
+	return []api.KeyFieldInfo{{"id", api.GetIntKey}}
+}
+
+//Implementation of the Identifier, Validator interface functions
+func (coordinate TOCoordinate) GetKeys() (map[string]interface{}, bool) {
+	if coordinate.ID == nil {
+		return map[string]interface{}{"id": 0}, false
+	}
+	return map[string]interface{}{"id": *coordinate.ID}, true
+}
+
+func (coordinate TOCoordinate) GetAuditName() string {
+	if coordinate.Name != nil {
+		return *coordinate.Name
+	}
+	if coordinate.ID != nil {
+		return strconv.Itoa(*coordinate.ID)
+	}
+	return "0"
+}
+
+func (coordinate TOCoordinate) GetType() string {
+	return "coordinate"
+}
+
+func (coordinate *TOCoordinate) SetKeys(keys map[string]interface{}) {
+	i, _ := keys["id"].(int) //this utilizes the non panicking type assertion, if the thrown away ok variable is false i will be the zero of the type, 0 here.
+	coordinate.ID = &i
+}
+
+func isValidCoordinateChar(r rune) bool {
+	if r >= 'a' && r <= 'z' {
+		return true
+	}
+	if r >= 'A' && r <= 'Z' {
+		return true
+	}
+	if r >= '0' && r <= '9' {
+		return true
+	}
+	if r == '.' || r == '-' || r == '_' {
+		return true
+	}
+	return false
+}
+
+// IsValidCoordinateName returns true if the name contains only characters valid for a Coordinate name
+func IsValidCoordinateName(str string) bool {
+	i := strings.IndexFunc(str, func(r rune) bool { return !isValidCoordinateChar(r) })
+	return i == -1
+}
+
+// Validate fulfills the api.Validator interface
+func (coordinate TOCoordinate) Validate(db *sqlx.DB) []error {
+	validName := validation.NewStringRule(IsValidCoordinateName, "invalid characters found - Use alphanumeric . or - or _ .")
+	latitudeErr := "Must be a floating point number within the range +-90"
+	longitudeErr := "Must be a floating point number within the range +-180"
+	errs := validation.Errors{
+		"name":      validation.Validate(coordinate.Name, validation.Required, validName),
+		"latitude":  validation.Validate(coordinate.Latitude, validation.Min(-90.0).Error(latitudeErr), validation.Max(90.0).Error(latitudeErr)),
+		"longitude": validation.Validate(coordinate.Longitude, validation.Min(-180.0).Error(longitudeErr), validation.Max(180.0).Error(longitudeErr)),
+	}
+	return tovalidate.ToErrors(errs)
+}
+
+//The TOCoordinate implementation of the Creator interface
+//all implementations of Creator should use transactions and return the proper errorType
+//ParsePQUniqueConstraintError is used to determine if a coordinate with conflicting values exists
+//if so, it will return an errorType of DataConflict and the type should be appended to the
+//generic error message returned
+//The insert sql returns the id and lastUpdated values of the newly inserted coordinate and have
+//to be added to the struct
+func (coordinate *TOCoordinate) Create(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+	rollbackTransaction := true
+	tx, err := db.Beginx()
+	defer func() {
+		if tx == nil || !rollbackTransaction {
+			return
+		}
+		err := tx.Rollback()
+		if err != nil {
+			log.Errorln(errors.New("rolling back transaction: " + err.Error()))
+		}
+	}()
+
+	if err != nil {
+		log.Error.Printf("could not begin transaction: %v", err)
+		return tc.DBError, tc.SystemError
+	}
+	resultRows, err := tx.NamedQuery(insertQuery(), coordinate)
+	if err != nil {
+		if pqErr, ok := err.(*pq.Error); ok {
+			err, eType := dbhelpers.ParsePQUniqueConstraintError(pqErr)
+			if eType == tc.DataConflictError {
+				return errors.New("a coordinate with " + err.Error()), eType
+			}
+			return err, eType
+		} else {
+			log.Errorf("received non pq error: %++v from create execution", err)
+			return tc.DBError, tc.SystemError
+		}
+	}
+	defer resultRows.Close()
+
+	var id int
+	var lastUpdated tc.TimeNoMod
+	rowsAffected := 0
+	for resultRows.Next() {
+		rowsAffected++
+		if err := resultRows.Scan(&id, &lastUpdated); err != nil {
+			log.Error.Printf("could not scan id from insert: %s\n", err)
+			return tc.DBError, tc.SystemError
+		}
+	}
+	if rowsAffected == 0 {
+		err = errors.New("no coordinate was inserted, no id was returned")
+		log.Errorln(err)
+		return tc.DBError, tc.SystemError
+	} else if rowsAffected > 1 {
+		err = errors.New("too many ids returned from coordinate insert")
+		log.Errorln(err)
+		return tc.DBError, tc.SystemError
+	}
+	coordinate.SetKeys(map[string]interface{}{"id": id})
+	coordinate.LastUpdated = &lastUpdated
+	err = tx.Commit()
+	if err != nil {
+		log.Errorln("Could not commit transaction: ", err)
+		return tc.DBError, tc.SystemError
+	}
+	rollbackTransaction = false
+	return nil, tc.NoError
+}
+
+func (coordinate *TOCoordinate) Read(db *sqlx.DB, parameters map[string]string, user auth.CurrentUser) ([]interface{}, []error, tc.ApiErrorType) {
+	var rows *sqlx.Rows
+
+	// Query Parameters to Database Query column mappings
+	// see the fields mapped in the SQL query
+	queryParamsToQueryCols := map[string]dbhelpers.WhereColumnInfo{
+		"id":   dbhelpers.WhereColumnInfo{"id", api.IsInt},
+		"name": dbhelpers.WhereColumnInfo{"name", nil},
+	}
+	where, orderBy, queryValues, errs := dbhelpers.BuildWhereAndOrderBy(parameters, queryParamsToQueryCols)
+	if len(errs) > 0 {
+		return nil, errs, tc.DataConflictError
+	}
+
+	query := selectQuery() + where + orderBy
+	log.Debugln("Query is ", query)
+
+	rows, err := db.NamedQuery(query, queryValues)
+	if err != nil {
+		log.Errorf("Error querying Coordinate: %v", err)
+		return nil, []error{tc.DBError}, tc.SystemError
+	}
+	defer rows.Close()
+
+	Coordinates := []interface{}{}
+	for rows.Next() {
+		var s TOCoordinate
+		if err = rows.StructScan(&s); err != nil {
+			log.Errorf("error parsing Coordinate rows: %v", err)
+			return nil, []error{tc.DBError}, tc.SystemError
+		}
+		Coordinates = append(Coordinates, s)
+	}
+
+	return Coordinates, []error{}, tc.NoError
+}
+
+//The TOCoordinate implementation of the Updater interface
+//all implementations of Updater should use transactions and return the proper errorType
+//ParsePQUniqueConstraintError is used to determine if a coordinate with conflicting values exists
+//if so, it will return an errorType of DataConflict and the type should be appended to the
+//generic error message returned
+func (coordinate *TOCoordinate) Update(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+	rollbackTransaction := true
+	tx, err := db.Beginx()
+	defer func() {
+		if tx == nil || !rollbackTransaction {
+			return
+		}
+		err := tx.Rollback()
+		if err != nil {
+			log.Errorln(errors.New("rolling back transaction: " + err.Error()))
+		}
+	}()
+
+	if err != nil {
+		log.Error.Printf("could not begin transaction: %v", err)
+		return tc.DBError, tc.SystemError
+	}
+	log.Debugf("about to run exec query: %s with coordinate: %++v", updateQuery(), coordinate)
+	resultRows, err := tx.NamedQuery(updateQuery(), coordinate)
+	if err != nil {
+		if pqErr, ok := err.(*pq.Error); ok {
+			err, eType := dbhelpers.ParsePQUniqueConstraintError(pqErr)
+			if eType == tc.DataConflictError {
+				return errors.New("a coordinate with " + err.Error()), eType
+			}
+			return err, eType
+		} else {
+			log.Errorf("received error: %++v from update execution", err)
+			return tc.DBError, tc.SystemError
+		}
+	}
+	defer resultRows.Close()
+
+	var lastUpdated tc.TimeNoMod
+	rowsAffected := 0
+	for resultRows.Next() {
+		rowsAffected++
+		if err := resultRows.Scan(&lastUpdated); err != nil {
+			log.Error.Printf("could not scan lastUpdated from insert: %s\n", err)
+			return tc.DBError, tc.SystemError
+		}
+	}
+	log.Debugf("lastUpdated: %++v", lastUpdated)
+	coordinate.LastUpdated = &lastUpdated
+	if rowsAffected != 1 {
+		if rowsAffected < 1 {
+			return errors.New("no coordinate found with this id"), tc.DataMissingError
+		} else {
+			return fmt.Errorf("this update affected too many rows: %d", rowsAffected), tc.SystemError
+		}
+	}
+	err = tx.Commit()
+	if err != nil {
+		log.Errorln("Could not commit transaction: ", err)
+		return tc.DBError, tc.SystemError
+	}
+	rollbackTransaction = false
+	return nil, tc.NoError
+}
+
+//The Coordinate implementation of the Deleter interface
+//all implementations of Deleter should use transactions and return the proper errorType
+func (coordinate *TOCoordinate) Delete(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+	rollbackTransaction := true
+	tx, err := db.Beginx()
+	defer func() {
+		if tx == nil || !rollbackTransaction {
+			return
+		}
+		err := tx.Rollback()
+		if err != nil {
+			log.Errorln(errors.New("rolling back transaction: " + err.Error()))
+		}
+	}()
+
+	if err != nil {
+		log.Error.Printf("could not begin transaction: %v", err)
+		return tc.DBError, tc.SystemError
+	}
+	log.Debugf("about to run exec query: %s with coordinate: %++v", deleteQuery(), coordinate)
+	result, err := tx.NamedExec(deleteQuery(), coordinate)
+	if err != nil {
+		log.Errorf("received error: %++v from delete execution", err)
+		return tc.DBError, tc.SystemError
+	}
+	rowsAffected, err := result.RowsAffected()
+	if err != nil {
+		return tc.DBError, tc.SystemError
+	}
+	if rowsAffected != 1 {
+		if rowsAffected < 1 {
+			return errors.New("no coordinate with that id found"), tc.DataMissingError
+		} else {
+			return fmt.Errorf("this delete affected too many rows: %d", rowsAffected), tc.SystemError
+		}
+	}
+	err = tx.Commit()
+	if err != nil {
+		log.Errorln("Could not commit transaction: ", err)
+		return tc.DBError, tc.SystemError
+	}
+	rollbackTransaction = false
+	return nil, tc.NoError
+}
+
+func selectQuery() string {
+	query := `SELECT
+id,
+latitude,
+longitude,
+last_updated,
+name
+
+FROM coordinate c`
+	return query
+}
+
+func updateQuery() string {
+	query := `UPDATE
+coordinate SET
+latitude=:latitude,
+longitude=:longitude,
+name=:name
+WHERE id=:id RETURNING last_updated`
+	return query
+}
+
+func insertQuery() string {
+	query := `INSERT INTO coordinate (
+latitude,
+longitude,
+name) VALUES (
+:latitude,
+:longitude,
+:name) RETURNING id,last_updated`
+	return query
+}
+
+func deleteQuery() string {
+	query := `DELETE FROM coordinate
+WHERE id=:id`
+	return query
+}
diff --git a/traffic_ops/traffic_ops_golang/coordinate/coordinates_test.go b/traffic_ops/traffic_ops_golang/coordinate/coordinates_test.go
new file mode 100644
index 000000000..2fe851ffc
--- /dev/null
+++ b/traffic_ops/traffic_ops_golang/coordinate/coordinates_test.go
@@ -0,0 +1,176 @@
+package coordinate
+
+/*
+ * 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.
+ */
+
+import (
+	"errors"
+	"reflect"
+	"strings"
+	"testing"
+	"time"
+
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc"
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc/v13"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/api"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/auth"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/test"
+	"github.com/jmoiron/sqlx"
+
+	sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1"
+)
+
+func getTestCoordinates() []v13.Coordinate {
+	coords := []v13.Coordinate{}
+	testCoord1 := v13.Coordinate{
+		ID:          1,
+		Name:        "coordinate1",
+		Latitude:    38.7,
+		Longitude:   90.7,
+		LastUpdated: tc.TimeNoMod{Time: time.Now()},
+	}
+	coords = append(coords, testCoord1)
+
+	testCoord2 := v13.Coordinate{
+		ID:          2,
+		Name:        "coordinate2",
+		Latitude:    38.7,
+		Longitude:   90.7,
+		LastUpdated: tc.TimeNoMod{Time: time.Now()},
+	}
+	coords = append(coords, testCoord2)
+
+	return coords
+}
+
+func TestReadCoordinates(t *testing.T) {
+	mockDB, mock, err := sqlmock.New()
+	if err != nil {
+		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
+	}
+	defer mockDB.Close()
+
+	db := sqlx.NewDb(mockDB, "sqlmock")
+	defer db.Close()
+
+	refType := GetRefType()
+
+	testCoords := getTestCoordinates()
+	cols := test.ColsFromStructByTag("db", v13.Coordinate{})
+	rows := sqlmock.NewRows(cols)
+
+	for _, ts := range testCoords {
+		rows = rows.AddRow(
+			ts.ID,
+			ts.Name,
+			ts.Latitude,
+			ts.Longitude,
+			ts.LastUpdated,
+		)
+	}
+	mock.ExpectQuery("SELECT").WillReturnRows(rows)
+	v := map[string]string{"id": "1"}
+
+	coordinates, errs, _ := refType.Read(db, v, auth.CurrentUser{})
+	if len(errs) > 0 {
+		t.Errorf("coordinate.Read expected: no errors, actual: %v", errs)
+	}
+
+	if len(coordinates) != 2 {
+		t.Errorf("coordinate.Read expected: len(coordinates) == 2, actual: %v", len(coordinates))
+	}
+}
+
+func TestFuncs(t *testing.T) {
+	if strings.Index(selectQuery(), "SELECT") != 0 {
+		t.Errorf("expected selectQuery to start with SELECT")
+	}
+	if strings.Index(insertQuery(), "INSERT") != 0 {
+		t.Errorf("expected insertQuery to start with INSERT")
+	}
+	if strings.Index(updateQuery(), "UPDATE") != 0 {
+		t.Errorf("expected updateQuery to start with UPDATE")
+	}
+	if strings.Index(deleteQuery(), "DELETE") != 0 {
+		t.Errorf("expected deleteQuery to start with DELETE")
+	}
+}
+
+func TestInterfaces(t *testing.T) {
+	var i interface{}
+	i = &TOCoordinate{}
+
+	if _, ok := i.(api.Creator); !ok {
+		t.Errorf("coordinate must be creator")
+	}
+	if _, ok := i.(api.Reader); !ok {
+		t.Errorf("coordinate must be reader")
+	}
+	if _, ok := i.(api.Updater); !ok {
+		t.Errorf("coordinate must be updater")
+	}
+	if _, ok := i.(api.Deleter); !ok {
+		t.Errorf("coordinate must be deleter")
+	}
+	if _, ok := i.(api.Identifier); !ok {
+		t.Errorf("coordinate must be Identifier")
+	}
+}
+
+func TestValidate(t *testing.T) {
+	// invalid name, latitude, and longitude
+	id := 1
+	nm := "not!a!valid!name"
+	la := -190.0
+	lo := -190.0
+	lu := tc.TimeNoMod{Time: time.Now()}
+	c := TOCoordinate{ID: &id,
+		Name:        &nm,
+		Latitude:    &la,
+		Longitude:   &lo,
+		LastUpdated: &lu,
+	}
+	errs := test.SortErrors(c.Validate(nil))
+
+	expectedErrs := []error{
+		errors.New(`'latitude' Must be a floating point number within the range +-90`),
+		errors.New(`'longitude' Must be a floating point number within the range +-180`),
+		errors.New(`'name' invalid characters found - Use alphanumeric . or - or _ .`),
+	}
+
+	if !reflect.DeepEqual(expectedErrs, errs) {
+		t.Errorf("expected %s, got %s", expectedErrs, errs)
+	}
+
+	//  valid name, latitude, longitude
+	nm = "This.is.2.a-Valid---Coordinate."
+	la = 90.0
+	lo = 90.0
+	c = TOCoordinate{ID: &id,
+		Name:        &nm,
+		Latitude:    &la,
+		Longitude:   &lo,
+		LastUpdated: &lu,
+	}
+	expectedErrs = []error{}
+	errs = c.Validate(nil)
+	if !reflect.DeepEqual(expectedErrs, errs) {
+		t.Errorf("expected %s, got %s", expectedErrs, errs)
+	}
+}
diff --git a/traffic_ops/traffic_ops_golang/crconfig/config.go b/traffic_ops/traffic_ops_golang/crconfig/config.go
index ffe3126a4..29398fead 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/config.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/config.go
@@ -22,35 +22,57 @@ package crconfig
 import (
 	"database/sql"
 	"errors"
+	"strconv"
 	"strings"
 )
 
-func makeCRConfigConfig(cdn string, db *sql.DB, dnssecEnabled bool) (map[string]interface{}, error) {
+func makeCRConfigConfig(cdn string, db *sql.DB, dnssecEnabled bool, domain string) (map[string]interface{}, error) {
 	configParams, err := getConfigParams(cdn, db)
 	if err != nil {
 		return nil, errors.New("Error getting router params: " + err.Error())
 	}
 	soa := map[string]string{}
 	ttl := map[string]string{}
+	maxmindDefaultOverrides := []CRConfigConfigMaxmindDefaultOverride{}
+
 	const soaPrefix = "tld.soa."
-	ttlPrefix := "tld.ttls."
+	const ttlPrefix = "tld.ttls."
+	const maxmindDefaultOverrideParameterName = "maxmind.default.override"
+	const logRequestHeadersParameterName = "LogRequestHeaders"
 	crConfigConfig := map[string]interface{}{}
-	for k, v := range configParams {
+	for _, param := range configParams {
+		k := param.Name
+		v := param.Value
 		if strings.HasPrefix(k, soaPrefix) {
 			soa[k[len(soaPrefix):]] = v
 		} else if strings.HasPrefix(k, ttlPrefix) {
 			ttl[k[len(ttlPrefix):]] = v
+		} else if k == logRequestHeadersParameterName {
+			hdrs := []string{}
+			for _, hdr := range strings.Split(param.Value, `__RETURN__`) {
+				hdrs = append(hdrs, strings.TrimSpace(hdr))
+			}
+			crConfigConfig["requestHeaders"] = hdrs
+		} else if k == maxmindDefaultOverrideParameterName {
+			overrideObj, err := createMaxmindDefaultOverrideObj(v)
+			if err != nil {
+				return nil, errors.New("Error parsing " + maxmindDefaultOverrideParameterName + " parameter: " + err.Error())
+			}
+			maxmindDefaultOverrides = append(maxmindDefaultOverrides, overrideObj)
 		} else {
 			crConfigConfig[k] = v
 		}
 	}
+	crConfigConfig["domain_name"] = domain
 	if len(soa) > 0 {
 		crConfigConfig["soa"] = soa
 	}
 	if len(ttl) > 0 {
 		crConfigConfig["ttls"] = ttl
 	}
-
+	if len(maxmindDefaultOverrides) > 0 {
+		crConfigConfig["maxmindDefaultOverride"] = maxmindDefaultOverrides
+	}
 	dnssecStr := "false"
 	if dnssecEnabled {
 		dnssecStr = "true"
@@ -60,7 +82,12 @@ func makeCRConfigConfig(cdn string, db *sql.DB, dnssecEnabled bool) (map[string]
 	return crConfigConfig, nil
 }
 
-func getConfigParams(cdn string, db *sql.DB) (map[string]string, error) {
+type CRConfigConfigParameter struct {
+	Name  string
+	Value string
+}
+
+func getConfigParams(cdn string, db *sql.DB) ([]CRConfigConfigParameter, error) {
 	// TODO change to []struct{string,string} ? Speed might matter.
 	q := `
 select name, value from parameter where id in (
@@ -78,17 +105,51 @@ and config_file = 'CRConfig.json'
 	}
 	defer rows.Close()
 
-	params := map[string]string{}
+	params := []CRConfigConfigParameter{}
 	for rows.Next() {
 		name := ""
 		val := ""
 		if err := rows.Scan(&name, &val); err != nil {
 			return nil, errors.New("Error scanning router param: " + err.Error())
 		}
-		params[name] = val
+		params = append(params, CRConfigConfigParameter{Name: name, Value: val})
 	}
 	if err := rows.Err(); err != nil {
 		return nil, errors.New("Error iterating router param rows: " + err.Error())
 	}
 	return params, nil
 }
+
+type CRConfigConfigMaxmindDefaultOverride struct {
+	CountryCode string  `json:"countryCode"`
+	Lat         float64 `json:"lat"`
+	Lon         float64 `json:"long"`
+}
+
+func createMaxmindDefaultOverrideObj(maxmindDefaultOverrideParamVal string) (CRConfigConfigMaxmindDefaultOverride, error) {
+	countryCodeCoords := strings.Split(maxmindDefaultOverrideParamVal, ";")
+	if len(countryCodeCoords) < 2 {
+		return CRConfigConfigMaxmindDefaultOverride{}, errors.New("malformed maxmind.default.override parameter: '" + maxmindDefaultOverrideParamVal + "'")
+	}
+	countryCode := countryCodeCoords[0]
+	coords := countryCodeCoords[1]
+	latLon := strings.Split(coords, ",")
+	if len(latLon) < 2 {
+		return CRConfigConfigMaxmindDefaultOverride{}, errors.New("malformed maxmind.default.override parameter coordinates '" + maxmindDefaultOverrideParamVal + "'")
+	}
+	latStr := latLon[0]
+	lonStr := latLon[1]
+	lat, err := strconv.ParseFloat(latStr, 64)
+	if err != nil {
+		return CRConfigConfigMaxmindDefaultOverride{}, errors.New("malformed maxmind.default.override parameter coordinates, latitude not a number: '" + maxmindDefaultOverrideParamVal + "'")
+	}
+	lon, err := strconv.ParseFloat(lonStr, 64)
+	if err != nil {
+		return CRConfigConfigMaxmindDefaultOverride{}, errors.New("malformed maxmind.default.override parameter coordinates, longitude not an number: '" + maxmindDefaultOverrideParamVal + "'")
+	}
+	return CRConfigConfigMaxmindDefaultOverride{
+		CountryCode: countryCode,
+		Lat:         lat,
+		Lon:         lon,
+	}, nil
+}
diff --git a/traffic_ops/traffic_ops_golang/crconfig/config_test.go b/traffic_ops/traffic_ops_golang/crconfig/config_test.go
index 86f209e8a..d8e135d41 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/config_test.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/config_test.go
@@ -27,16 +27,19 @@ import (
 	"gopkg.in/DATA-DOG/go-sqlmock.v1"
 )
 
-func ExpectedGetConfigParams() map[string]string {
-	return map[string]string{
-		"tld.ttls.foo" + *randStr(): *randStr(),
-		"tld.soa.bar" + *randStr():  *randStr(),
+func ExpectedGetConfigParams(domain string) []CRConfigConfigParameter{
+	return []CRConfigConfigParameter{
+		{"tld.ttls.foo" + *randStr(), *randStr()},
+		{"tld.soa.bar" + *randStr(),  *randStr()},
+		{"domain_name", domain},
 	}
 }
 
-func MockGetConfigParams(mock sqlmock.Sqlmock, expected map[string]string, cdn string) {
+func MockGetConfigParams(mock sqlmock.Sqlmock, expected []CRConfigConfigParameter, cdn string) {
 	rows := sqlmock.NewRows([]string{"name", "value"})
-	for n, v := range expected {
+	for _, param := range expected {
+		n := param.Name
+		v := param.Value
 		rows = rows.AddRow(n, v)
 	}
 	mock.ExpectQuery("select").WithArgs(cdn).WillReturnRows(rows)
@@ -50,8 +53,9 @@ func TestGetConfigParams(t *testing.T) {
 	defer db.Close()
 
 	cdn := "mycdn"
+	domain := "mycdn.invalid"
 
-	expected := ExpectedGetConfigParams()
+	expected := ExpectedGetConfigParams(domain)
 	MockGetConfigParams(mock, expected, cdn)
 
 	actual, err := getConfigParams(cdn, db)
@@ -67,11 +71,13 @@ func TestGetConfigParams(t *testing.T) {
 const soaPrefix = "tld.soa."
 const ttlPrefix = "tld.ttls."
 
-func ExpectedMakeCRConfigConfig(expectedGetConfigParams map[string]string, expectedDNSSECEnabled bool) map[string]interface{} {
+func ExpectedMakeCRConfigConfig(expectedGetConfigParams []CRConfigConfigParameter, expectedDNSSECEnabled bool) map[string]interface{} {
 	m := map[string]interface{}{}
 	soa := map[string]string{}
 	ttl := map[string]string{}
-	for n, v := range expectedGetConfigParams {
+	for _, param := range expectedGetConfigParams {
+		n := param.Name
+		v := param.Value
 		if strings.HasPrefix(n, soaPrefix) {
 			soa[n[len(soaPrefix):]] = v
 		} else if strings.HasPrefix(n, ttlPrefix) {
@@ -98,14 +104,15 @@ func TestMakeCRConfigConfig(t *testing.T) {
 	defer db.Close()
 
 	cdn := "mycdn"
+	domain := "mycdn.invalid"
 	dnssecEnabled := true
 
-	expectedGetConfigParams := ExpectedGetConfigParams()
+	expectedGetConfigParams := ExpectedGetConfigParams(domain)
 	MockGetConfigParams(mock, expectedGetConfigParams, cdn)
 
 	expected := ExpectedMakeCRConfigConfig(expectedGetConfigParams, dnssecEnabled)
 
-	actual, err := makeCRConfigConfig(cdn, db, dnssecEnabled)
+	actual, err := makeCRConfigConfig(cdn, db, dnssecEnabled, domain)
 
 	if err != nil {
 		t.Fatalf("makeCRConfigConfig err expected: nil, actual: %v", err)
diff --git a/traffic_ops/traffic_ops_golang/crconfig/crconfig.go b/traffic_ops/traffic_ops_golang/crconfig/crconfig.go
index 44c5ea9cb..bb85a2f1b 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/crconfig.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/crconfig.go
@@ -35,7 +35,7 @@ func Make(db *sql.DB, cdn, user, toHost, reqPath, toVersion string) (*tc.CRConfi
 		return nil, errors.New("Error getting CDN info: " + err.Error())
 	}
 
-	if crc.Config, err = makeCRConfigConfig(cdn, db, dnssecEnabled); err != nil {
+	if crc.Config, err = makeCRConfigConfig(cdn, db, dnssecEnabled, cdnDomain); err != nil {
 		return nil, errors.New("Error getting Config: " + err.Error())
 	}
 
@@ -45,7 +45,7 @@ func Make(db *sql.DB, cdn, user, toHost, reqPath, toVersion string) (*tc.CRConfi
 	if crc.EdgeLocations, crc.RouterLocations, err = makeLocations(cdn, db); err != nil {
 		return nil, errors.New("Error getting Edge Locations: " + err.Error())
 	}
-	if crc.DeliveryServices, err = makeDSes(cdn, db); err != nil {
+	if crc.DeliveryServices, err = makeDSes(cdn, cdnDomain, db); err != nil {
 		return nil, errors.New("Error getting Delivery Services: " + err.Error())
 	}
 
diff --git a/traffic_ops/traffic_ops_golang/crconfig/deliveryservice.go b/traffic_ops/traffic_ops_golang/crconfig/deliveryservice.go
index 0bc15ddc6..55cf884e8 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/deliveryservice.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/deliveryservice.go
@@ -41,7 +41,7 @@ const DefaultTLDTTLNS = 3600 * time.Second
 const GeoProviderMaxmindStr = "maxmindGeolocationService"
 const GeoProviderNeustarStr = "neustarGeolocationService"
 
-func makeDSes(cdn string, db *sql.DB) (map[string]tc.CRConfigDeliveryService, error) {
+func makeDSes(cdn string, domain string, db *sql.DB) (map[string]tc.CRConfigDeliveryService, error) {
 	dses := map[string]tc.CRConfigDeliveryService{}
 
 	admin := CDNSOAAdmin
@@ -70,7 +70,7 @@ func makeDSes(cdn string, db *sql.DB) (map[string]tc.CRConfigDeliveryService, er
 	geoProviderDefault := geoProvider0
 
 	q := `
-select d.xml_id, d.miss_lat, d.miss_long, d.protocol, d.ccr_dns_ttl as ttl, d.routing_name, d.geo_provider, t.name as type, d.geo_limit, d.geo_limit_countries, d.geolimit_redirect_url, d.initial_dispersion, d.regional_geo_blocking, d.tr_response_headers, d.max_dns_answers, p.name as profile, d.dns_bypass_ip, d.dns_bypass_ip6, d.dns_bypass_ttl, d.dns_bypass_cname, d.http_bypass_fqdn, d.ipv6_routing_enabled, d.deep_caching_type, d.tr_request_headers, d.tr_response_headers
+select d.xml_id, d.miss_lat, d.miss_long, d.protocol, d.ccr_dns_ttl as ttl, d.routing_name, d.geo_provider, t.name as type, d.geo_limit, d.geo_limit_countries, d.geolimit_redirect_url, d.initial_dispersion, d.regional_geo_blocking, d.tr_response_headers, d.max_dns_answers, p.name as profile, d.dns_bypass_ip, d.dns_bypass_ip6, d.dns_bypass_ttl, d.dns_bypass_cname, d.http_bypass_fqdn, d.ipv6_routing_enabled, d.deep_caching_type, d.tr_request_headers, d.tr_response_headers, d.anonymous_blocking_enabled
 from deliveryservice as d
 inner join type as t on t.id = d.type
 left outer join profile as p on p.id = d.profile
@@ -93,7 +93,7 @@ and d.active = true
 		return nil, errors.New("getting deliveryservice server parameters: " + err.Error())
 	}
 
-	dsmatchsets, dsdomains, err := getDSRegexesDomains(cdn, db, dsParams)
+	dsmatchsets, dsdomains, err := getDSRegexesDomains(cdn, domain, db)
 	if err != nil {
 		return nil, errors.New("getting regex matchsets: " + err.Error())
 	}
@@ -105,7 +105,6 @@ and d.active = true
 
 	for rows.Next() {
 		ds := tc.CRConfigDeliveryService{
-			MissLocation:    &tc.CRConfigLatitudeLongitudeShort{},
 			Protocol:        &tc.CRConfigDeliveryServiceProtocol{},
 			ResponseHeaders: map[string]string{},
 			Soa:             cdnSOA,
@@ -136,15 +135,17 @@ and d.active = true
 		deepCachingType := sql.NullString{}
 		trRequestHeaders := sql.NullString{}
 		trResponseHeaders := sql.NullString{}
-		if err := rows.Scan(&xmlID, &missLat, &missLon, &protocol, &ds.TTL, &ds.RoutingName, &geoProvider, &ttype, &geoLimit, &geoLimitCountries, &geoLimitRedirectURL, &dispersion, &geoBlocking, &trRespHdrsStr, &maxDNSAnswers, &profile, &dnsBypassIP, &dnsBypassIP6, &dnsBypassTTL, &dnsBypassCName, &httpBypassFQDN, &ip6RoutingEnabled, &deepCachingType, &trRequestHeaders, &trResponseHeaders); err != nil {
+		anonymousBlocking := false
+		if err := rows.Scan(&xmlID, &missLat, &missLon, &protocol, &ds.TTL, &ds.RoutingName, &geoProvider, &ttype, &geoLimit, &geoLimitCountries, &geoLimitRedirectURL, &dispersion, &geoBlocking, &trRespHdrsStr, &maxDNSAnswers, &profile, &dnsBypassIP, &dnsBypassIP6, &dnsBypassTTL, &dnsBypassCName, &httpBypassFQDN, &ip6RoutingEnabled, &deepCachingType, &trRequestHeaders, &trResponseHeaders, &anonymousBlocking); err != nil {
 			return nil, errors.New("scanning deliveryservice: " + err.Error())
 		}
-
-		if missLat.Valid {
-			ds.MissLocation.Lat = missLat.Float64
-		}
-		if missLon.Valid {
-			ds.MissLocation.Lon = missLon.Float64
+		// TODO prevent (lat XOR lon) in the DB and UI
+		if missLat.Valid && missLon.Valid {
+			ds.MissLocation = &tc.CRConfigLatitudeLongitudeShort{Lat: missLat.Float64, Lon: missLon.Float64}
+		} else if missLat.Valid {
+			log.Warnln("delivery service " + xmlID + " has miss latitude but not longitude: omitting miss lat-lon from CRConfig")
+		} else if missLon.Valid {
+			log.Warnln("delivery service " + xmlID + " has miss longitude but not latitude: omitting miss lat-lon from CRConfig")
 		}
 		if ttl.Valid {
 			ttl := int(ttl.Int64)
@@ -293,6 +294,12 @@ and d.active = true
 				geoBlockingStr = "true"
 			}
 			ds.RegionalGeoBlocking = &geoBlockingStr
+
+			anonymousBlockingStr := "false"
+			if anonymousBlocking {
+				anonymousBlockingStr = "true"
+			}
+			ds.AnonymousBlockingEnabled = &anonymousBlockingStr
 			if dispersion.Valid {
 				ds.Dispersion = &tc.CRConfigDispersion{Limit: int(dispersion.Int64), Shuffled: true}
 			}
@@ -373,12 +380,10 @@ func getProtocolStr(dsType string) string {
 	return "HTTP"
 }
 
-func getDSRegexesDomains(cdn string, db *sql.DB, dsParams map[string]string) (map[string][]*tc.MatchSet, map[string][]string, error) {
+func getDSRegexesDomains(cdn string, domain string, db *sql.DB) (map[string][]*tc.MatchSet, map[string][]string, error) {
 	dsmatchsets := map[string][]*tc.MatchSet{}
 	domains := map[string][]string{}
-
 	patternToHostReplacer := strings.NewReplacer(`\`, ``, `.*`, ``, `.`, ``)
-
 	q := `
 select r.pattern, t.name as type, dt.name as dstype, COALESCE(dr.set_number, 0), d.xml_id as dsname
 from regex as r
@@ -432,11 +437,6 @@ order by dr.set_number asc
 		matchset.Protocol = protocolStr
 		matchset.MatchList = append(matchset.MatchList, tc.MatchList{MatchType: matchType, Regex: pattern})
 
-		domain := ""
-		if val, ok := dsParams["domain_name"]; ok {
-			domain = val
-		}
-
 		if ttype == "HOST_REGEXP" && setnum == 0 {
 			domains[dsname] = append(domains[dsname], patternToHostReplacer.Replace(pattern)+"."+domain)
 		}
@@ -449,7 +449,6 @@ order by dr.set_number asc
 // If any profiles have conflicting parameters, an error is returned.
 func getDSParams(serverParams map[string]map[string]string) (map[string]string, error) {
 	dsParamNames := map[string]struct{}{
-		"domain_name":       struct{}{},
 		"tld.soa.admin":     struct{}{},
 		"tld.soa.expire":    struct{}{},
 		"tld.soa.minimum":   struct{}{},
diff --git a/traffic_ops/traffic_ops_golang/crconfig/deliveryservice_test.go b/traffic_ops/traffic_ops_golang/crconfig/deliveryservice_test.go
index c7d705774..eede04592 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/deliveryservice_test.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/deliveryservice_test.go
@@ -20,12 +20,12 @@ package crconfig
  */
 
 import (
-	"strconv"
-	"strings"
+	"encoding/json"
 	"math/rand"
 	"reflect"
+	"strconv"
+	"strings"
 	"testing"
-	"encoding/json"
 
 	"github.com/apache/incubator-trafficcontrol/lib/go-tc"
 
@@ -46,7 +46,7 @@ func randMatchlistArr() []tc.MatchList {
 	arr := []tc.MatchList{}
 	for i := 0; i < num; i++ {
 		arr = append(arr, tc.MatchList{
-			Regex: *randStr(),
+			Regex:     *randStr(),
 			MatchType: *randStr(),
 		})
 	}
@@ -59,7 +59,7 @@ func randMatchsetArr() []*tc.MatchSet {
 	arr := []*tc.MatchSet{}
 	for i := 0; i < num; i++ {
 		arr = append(arr, &tc.MatchSet{
-			Protocol: httpStr,
+			Protocol:  httpStr,
 			MatchList: randMatchlistArr(),
 		})
 	}
@@ -81,45 +81,46 @@ func randDS() tc.CRConfigDeliveryService {
 	ttlSOA := "86400"
 	geoProviderStr := GeoProviderMaxmindStr
 	return tc.CRConfigDeliveryService{
+		AnonymousBlockingEnabled: &falseStrPtr,
 		CoverageZoneOnly: false,
-		Dispersion:           &tc.CRConfigDispersion{
-			Limit: 42,
+		Dispersion: &tc.CRConfigDispersion{
+			Limit:    42,
 			Shuffled: true,
 		},
 		// Domains: []string{"foo"},
 		GeoLocationProvider: &geoProviderStr,
 		// MatchSets:            randMatchsetArr(),
-		MissLocation:         &tc.CRConfigLatitudeLongitudeShort{
+		MissLocation: &tc.CRConfigLatitudeLongitudeShort{
 			Lat: *randFloat64(),
 			Lon: *randFloat64(),
 		},
-		Protocol:             &tc.CRConfigDeliveryServiceProtocol{
+		Protocol: &tc.CRConfigDeliveryServiceProtocol{
 			// AcceptHTTP: &truePtr,
-			AcceptHTTPS: false,
+			AcceptHTTPS:     false,
 			RedirectOnHTTPS: false,
 		},
 		RegionalGeoBlocking: &falseStrPtr,
-		ResponseHeaders: nil,
-		RequestHeaders: nil,
+		ResponseHeaders:     nil,
+		RequestHeaders:      nil,
 		Soa: &tc.SOA{
-			Admin:     &ttlAdmin,
-			ExpireSeconds:     &ttlExpire,
-			MinimumSeconds:     &ttlMinimum,
+			Admin:          &ttlAdmin,
+			ExpireSeconds:  &ttlExpire,
+			MinimumSeconds: &ttlMinimum,
 			RefreshSeconds: &ttlRefresh,
-			RetrySeconds: &ttlRetry,
+			RetrySeconds:   &ttlRetry,
 		},
 		SSLEnabled: false,
-		TTL: ttl,
-		TTLs: &tc.CRConfigTTL {
-			ASeconds: &ttlStr,
-			AAAASeconds : &ttlStr,
-			NSSeconds: &ttlNS,
-			SOASeconds: &ttlSOA,
+		TTL:        ttl,
+		TTLs: &tc.CRConfigTTL{
+			ASeconds:    &ttlStr,
+			AAAASeconds: &ttlStr,
+			NSSeconds:   &ttlNS,
+			SOASeconds:  &ttlSOA,
 		},
 		// MaxDNSIPsForLocation: randInt(),
 		IP6RoutingEnabled: randBool(),
-		RoutingName: randStr(),
-		BypassDestination:    map[string]*tc.CRConfigBypassDestination {
+		RoutingName:       randStr(),
+		BypassDestination: map[string]*tc.CRConfigBypassDestination{
 			"HTTP": &tc.CRConfigBypassDestination{
 				// IP: randStr(),
 				// IP6: randStr(),
@@ -130,13 +131,13 @@ func randDS() tc.CRConfigDeliveryService {
 			},
 		},
 		DeepCachingType: nil,
-		GeoEnabled: nil,
+		GeoEnabled:      nil,
 		// GeoLimitRedirectURL: randStr(),
-		StaticDNSEntries:     []tc.StaticDNSEntry{
+		StaticDNSEntries: []tc.StaticDNSEntry{
 			tc.StaticDNSEntry{
-				Name: *randStr(),
-				TTL: *randInt(),
-				Type: *randStr(),
+				Name:  *randStr(),
+				TTL:   *randInt(),
+				Type:  *randStr(),
 				Value: *randStr(),
 			},
 		},
@@ -151,12 +152,12 @@ func ExpectedMakeDSes() map[string]tc.CRConfigDeliveryService {
 }
 
 func MockMakeDSes(mock sqlmock.Sqlmock, expected map[string]tc.CRConfigDeliveryService, cdn string) {
-	// select d.xml_id, d.miss_lat, d.miss_long, d.protocol, d.ccr_dns_ttl as ttl, d.routing_name, d.geo_provider, t.name as type, d.geo_limit, d.geo_limit_countries, d.geolimit_redirect_url, d.initial_dispersion, d.regional_geo_blocking, d.tr_response_headers, d.max_dns_answers, p.name as profile, d.dns_bypass_ip, d.dns_bypass_ip6, d.dns_bypass_ttl, d.dns_bypass_cname, d.http_bypass_fqdn, d.ipv6_routing_enabled, d.deep_caching_type, d.tr_request_headers, d.tr_response_headers
+	// select d.xml_id, d.miss_lat, d.miss_long, d.protocol, d.ccr_dns_ttl as ttl, d.routing_name, d.geo_provider, t.name as type, d.geo_limit, d.geo_limit_countries, d.geolimit_redirect_url, d.initial_dispersion, d.regional_geo_blocking, d.tr_response_headers, d.max_dns_answers, p.name as profile, d.dns_bypass_ip, d.dns_bypass_ip6, d.dns_bypass_ttl, d.dns_bypass_cname, d.http_bypass_fqdn, d.ipv6_routing_enabled, d.deep_caching_type, d.tr_request_headers, d.tr_response_headers, d.anonymous_blocking_enabled
 
-	rows := sqlmock.NewRows([]string{"xml_id", "miss_lat", "miss_long", "protocol", "ttl", "routing_name", "geo_provider", "type", "geo_limit", "geo_limit_countries", "geeo_limit_redirect_url", "initial_dispersion", "regional_geo_blocking", "tr_response_headers", "max_dns_answers", "profile", "dns_bypass_ip", "dns_bypass_ip6", "dns_bypass_ttl", "dns_bypass_cname", "http_bypass_fqdn", "ipv6_routing_enabled", "deep_caching_type", "tr_request_headers", "tr_response_headers"})
+	rows := sqlmock.NewRows([]string{"xml_id", "miss_lat", "miss_long", "protocol", "ttl", "routing_name", "geo_provider", "type", "geo_limit", "geo_limit_countries", "geeo_limit_redirect_url", "initial_dispersion", "regional_geo_blocking", "tr_response_headers", "max_dns_answers", "profile", "dns_bypass_ip", "dns_bypass_ip6", "dns_bypass_ttl", "dns_bypass_cname", "http_bypass_fqdn", "ipv6_routing_enabled", "deep_caching_type", "tr_request_headers", "tr_response_headers", "anonymous_blocking_enabled"})
 
 	for dsName, ds := range expected {
-		rows = rows.AddRow(dsName, ds.MissLocation.Lat, ds.MissLocation.Lon, 0, *ds.TTL, *ds.RoutingName, 0, "HTTP", 0, "", "", 42, false, "", nil, "", "", "", 0, "", *ds.BypassDestination["HTTP"].FQDN, *ds.IP6RoutingEnabled, nil, "", "")
+		rows = rows.AddRow(dsName, ds.MissLocation.Lat, ds.MissLocation.Lon, 0, *ds.TTL, *ds.RoutingName, 0, "HTTP", 0, "", "", 42, false, "", nil, "", "", "", 0, "", *ds.BypassDestination["HTTP"].FQDN, *ds.IP6RoutingEnabled, nil, "", "", false)
 	}
 	mock.ExpectQuery("select").WithArgs(cdn).WillReturnRows(rows)
 }
@@ -169,6 +170,7 @@ func TestMakeDSes(t *testing.T) {
 	defer db.Close()
 
 	cdn := "mycdn"
+	domain := "mycdn.invalid"
 
 	expected := ExpectedMakeDSes()
 	MockMakeDSes(mock, expected, cdn)
@@ -186,7 +188,7 @@ func TestMakeDSes(t *testing.T) {
 	expectedStaticDNSEntries := ExpectedGetStaticDNSEntries(expected)
 	MockGetStaticDNSEntries(mock, expectedStaticDNSEntries, cdn)
 
-	actual, err := makeDSes(cdn, db)
+	actual, err := makeDSes(cdn, domain, db)
 	if err != nil {
 		t.Fatalf("makeDSes expected: nil error, actual: %v", err)
 	}
@@ -212,7 +214,7 @@ func TestMakeDSes(t *testing.T) {
 func ExpectedGetServerProfileParams(expectedMakeDSes map[string]tc.CRConfigDeliveryService) map[string]map[string]string {
 	expected := map[string]map[string]string{}
 	for dsName, _ := range expectedMakeDSes {
-		expected[dsName] = map[string]string {
+		expected[dsName] = map[string]string{
 			"param0": "val0",
 			"param1": "val1",
 		}
@@ -278,7 +280,7 @@ func ExpectedGetDSRegexesDomains(expectedDSParams map[string]string) (map[string
 	}
 
 	for dsName, _ := range expectedDSParams {
-		pattern := `.*\.`+dsName+`\..*`
+		pattern := `.*\.` + dsName + `\..*`
 
 		matchsets[dsName][setnum] = &tc.MatchSet{}
 		matchset := matchsets[dsName][setnum]
@@ -310,7 +312,7 @@ func TestGetDSRegexesDomains(t *testing.T) {
 	defer db.Close()
 
 	cdn := "mycdn"
-
+	domain := "mycdn.invalid"
 
 	expectedMakeDSes := ExpectedMakeDSes()
 	expectedServerProfileParams := ExpectedGetServerProfileParams(expectedMakeDSes)
@@ -321,7 +323,7 @@ func TestGetDSRegexesDomains(t *testing.T) {
 	expectedMatchsets, expectedDomains := ExpectedGetDSRegexesDomains(expectedDSParams)
 	MockGetDSRegexesDomains(mock, expectedMatchsets, expectedDomains, cdn)
 
-	actualMatchsets, actualDomains, err := getDSRegexesDomains(cdn, db, expectedDSParams)
+	actualMatchsets, actualDomains, err := getDSRegexesDomains(cdn, domain, db)
 	if err != nil {
 		t.Fatalf("getDSRegexesDomains expected: nil error, actual: %v", err)
 	}
@@ -334,14 +336,14 @@ func TestGetDSRegexesDomains(t *testing.T) {
 	}
 
 	if !reflect.DeepEqual(expectedMatchsets, actualMatchsets) {
-			t.Errorf("getDSRegexesDomains expected: %+v, actual: %+v", expectedMatchsets, actualMatchsets)
+		t.Errorf("getDSRegexesDomains expected: %+v, actual: %+v", expectedMatchsets, actualMatchsets)
 	}
 	if !reflect.DeepEqual(expectedDomains, actualDomains) {
-			t.Errorf("getDSRegexesDomains expected: %+v, actual: %+v", expectedDomains, actualDomains)
+		t.Errorf("getDSRegexesDomains expected: %+v, actual: %+v", expectedDomains, actualDomains)
 	}
 }
 
-func ExpectedGetStaticDNSEntries(expectedMakeDSes map[string]tc.CRConfigDeliveryService) (map[tc.DeliveryServiceName][]tc.StaticDNSEntry) {
+func ExpectedGetStaticDNSEntries(expectedMakeDSes map[string]tc.CRConfigDeliveryService) map[tc.DeliveryServiceName][]tc.StaticDNSEntry {
 	expected := map[tc.DeliveryServiceName][]tc.StaticDNSEntry{}
 	for dsName, ds := range expectedMakeDSes {
 		for _, entry := range ds.StaticDNSEntries {
@@ -355,7 +357,7 @@ func MockGetStaticDNSEntries(mock sqlmock.Sqlmock, expected map[tc.DeliveryServi
 	rows := sqlmock.NewRows([]string{"ds", "name", "ttl", "value", "type"})
 	for dsName, entries := range expected {
 		for _, entry := range entries {
-			rows = rows.AddRow(dsName, entry.Name, entry.TTL, entry.Value, entry.Type + "_RECORD")
+			rows = rows.AddRow(dsName, entry.Name, entry.TTL, entry.Value, entry.Type+"_RECORD")
 		}
 	}
 	mock.ExpectQuery("select").WithArgs(cdn).WillReturnRows(rows)
@@ -383,6 +385,6 @@ func TestGetStaticDNSEntries(t *testing.T) {
 		t.Fatalf("getStaticDNSEntries len expected: %v, actual: %v", len(expected), len(actual))
 	}
 	if !reflect.DeepEqual(expected, actual) {
-			t.Errorf("getDSRegexesDomains expected: %+v, actual: %+v", expected, actual)
+		t.Errorf("getDSRegexesDomains expected: %+v, actual: %+v", expected, actual)
 	}
 }
diff --git a/traffic_ops/traffic_ops_golang/crconfig/handler.go b/traffic_ops/traffic_ops_golang/crconfig/handler.go
index 78b1fd185..0c4453c93 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/handler.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/handler.go
@@ -22,7 +22,6 @@ package crconfig
 import (
 	"encoding/json"
 	"errors"
-	"fmt"
 	"net/http"
 	"net/url"
 	"strconv"
@@ -71,14 +70,17 @@ func Handler(db *sqlx.DB, cfg config.Config) http.HandlerFunc {
 			return
 		}
 
-		respBts, err := json.Marshal(crConfig)
+		resp := struct {
+			Response *tc.CRConfig `json:"response"`
+		}{crConfig}
+		respBts, err := json.Marshal(resp)
 		if err != nil {
 			handleErrs(http.StatusInternalServerError, err)
 			return
 		}
 		log.Infof("CRConfig time to generate: %+v\n", time.Since(start))
 		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, "%s", respBts)
+		w.Write(respBts)
 	}
 }
 
@@ -107,7 +109,35 @@ func SnapshotGetHandler(db *sqlx.DB, cfg config.Config) http.HandlerFunc {
 			return
 		}
 		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, "%s", []byte(snapshot))
+		w.Write([]byte(`{"response":` + snapshot + `}`))
+	}
+}
+
+// SnapshotOldGetHandler gets and serves the CRConfig from the snapshot table, not wrapped in response to match the old non-API CRConfig-Snapshots endpoint
+func SnapshotOldGetHandler(db *sqlx.DB, cfg config.Config) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		handleErrs := tc.GetHandleErrorsFunc(w, r)
+		params, err := api.GetCombinedParams(r)
+		if err != nil {
+			handleErrs(http.StatusInternalServerError, err)
+			return
+		}
+		cdn, ok := params["cdn"]
+		if !ok {
+			handleErrs(http.StatusInternalServerError, errors.New("params missing CDN"))
+			return
+		}
+		snapshot, cdnExists, err := GetSnapshot(db.DB, cdn)
+		if err != nil {
+			handleErrs(http.StatusInternalServerError, errors.New("getting snapshot: "+err.Error()))
+			return
+		}
+		if !cdnExists {
+			handleErrs(http.StatusNotFound, errors.New("CDN not found"))
+			return
+		}
+		w.Header().Set("Content-Type", "application/json")
+		w.Write([]byte(snapshot))
 	}
 }
 
diff --git a/traffic_ops/traffic_ops_golang/crconfig/snapshot_test.go b/traffic_ops/traffic_ops_golang/crconfig/snapshot_test.go
index dc8cd22fb..e5732a1f9 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/snapshot_test.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/snapshot_test.go
@@ -20,10 +20,10 @@ package crconfig
  */
 
 import (
-	"reflect"
+	"database/sql/driver"
 	"encoding/json"
+	"reflect"
 	"testing"
-	"database/sql/driver"
 	"time"
 
 	"github.com/apache/incubator-trafficcontrol/lib/go-tc"
@@ -72,6 +72,7 @@ func TestGetSnapshot(t *testing.T) {
 }
 
 type AnyTime struct{}
+
 // Match satisfies sqlmock.Argument interface
 func (a AnyTime) Match(v driver.Value) bool {
 	_, ok := v.(time.Time)
@@ -79,12 +80,12 @@ func (a AnyTime) Match(v driver.Value) bool {
 }
 
 type Any struct{}
+
 // Match satisfies sqlmock.Argument interface
 func (a Any) Match(v driver.Value) bool {
 	return true
 }
 
-
 func MockSnapshot(mock sqlmock.Sqlmock, expected []byte, cdn string) {
 	mock.ExpectExec("insert").WithArgs(cdn, expected, AnyTime{}).WillReturnResult(sqlmock.NewResult(1, 1))
 }
diff --git a/traffic_ops/traffic_ops_golang/crconfig/stats_test.go b/traffic_ops/traffic_ops_golang/crconfig/stats_test.go
index 166df4e5f..77b9f1f3b 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/stats_test.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/stats_test.go
@@ -21,19 +21,19 @@ package crconfig
 
 import (
 	"reflect"
-	"time"
 	"testing"
+	"time"
 
 	"github.com/apache/incubator-trafficcontrol/lib/go-tc"
 )
 
 func ExpectedMakeStats() tc.CRConfigStats {
 	return tc.CRConfigStats{
-		CDNName:         randStr(),
-		TMHost:          randStr(),
-		TMPath:          randStr(),
-		TMUser:          randStr(),
-		TMVersion:       randStr(),
+		CDNName:   randStr(),
+		TMHost:    randStr(),
+		TMPath:    randStr(),
+		TMUser:    randStr(),
+		TMVersion: randStr(),
 	}
 }
 
@@ -46,7 +46,7 @@ func TestMakeStats(t *testing.T) {
 	if !reflect.DeepEqual(expected, actual) {
 		t.Errorf("makeStats expected: %+v, actual: %+v", expected, actual)
 	}
-	if actual.DateUnixSeconds == nil ||  *actual.DateUnixSeconds < start.Unix() || *actual.DateUnixSeconds > end.Unix() {
+	if actual.DateUnixSeconds == nil || *actual.DateUnixSeconds < start.Unix() || *actual.DateUnixSeconds > end.Unix() {
 		t.Errorf("makeStats DateUniSeconds expected: < %+v > %+v, actual: %+v", start.Unix(), end.Unix(), actual.DateUnixSeconds)
 	}
 }
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservices.go b/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservices.go
index a00075ad9..9df72a9d5 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservices.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservices.go
@@ -99,22 +99,23 @@ func (ds *TODeliveryService) Validate(db *sqlx.DB) []error {
 
 	// Validate that the required fields are sent first to prevent panics below
 	errs := validation.Errors{
-		"active":              validation.Validate(ds.Active, validation.NotNil),
-		"cdnId":               validation.Validate(ds.CDNID, validation.Required),
-		"displayName":         validation.Validate(ds.DisplayName, validation.Required, validation.Length(1, 48)),
-		"deepCachingType":     validation.Validate(neverOrAlways),
-		"dnsBypassIp":         validation.Validate(ds.DNSBypassIP, is.IP),
-		"dnsBypassIp6":        validation.Validate(ds.DNSBypassIP6, is.IPv6),
-		"dscp":                validation.Validate(ds.DSCP, validation.NotNil, validation.Min(0)),
-		"geoLimit":            validation.Validate(ds.GeoLimit, validation.NotNil),
-		"geoProvider":         validation.Validate(ds.GeoProvider, validation.NotNil),
-		"infoUrl":             validation.Validate(ds.InfoURL, is.URL),
-		"logsEnabled":         validation.Validate(ds.LogsEnabled, validation.NotNil),
-		"orgServerFqdn":       validation.Validate(ds.OrgServerFQDN, is.URL),
-		"regionalGeoBlocking": validation.Validate(ds.RegionalGeoBlocking, validation.NotNil),
-		"routingName":         validation.Validate(ds.RoutingName, isHost, noPeriods, validation.Length(1, 48)),
-		"typeId":              validation.Validate(ds.TypeID, validation.Required, validation.Min(1)),
-		"xmlId":               validation.Validate(ds.XMLID, noSpaces, noPeriods, validation.Length(1, 48)),
+		"active":                   validation.Validate(ds.Active, validation.NotNil),
+		"anonymousBlockingEnabled": validation.Validate(ds.AnonymousBlockingEnabled, validation.NotNil),
+		"cdnId":                    validation.Validate(ds.CDNID, validation.Required),
+		"displayName":              validation.Validate(ds.DisplayName, validation.Required, validation.Length(1, 48)),
+		"deepCachingType":          validation.Validate(neverOrAlways),
+		"dnsBypassIp":              validation.Validate(ds.DNSBypassIP, is.IP),
+		"dnsBypassIp6":             validation.Validate(ds.DNSBypassIP6, is.IPv6),
+		"dscp":                     validation.Validate(ds.DSCP, validation.NotNil, validation.Min(0)),
+		"geoLimit":                 validation.Validate(ds.GeoLimit, validation.NotNil),
+		"geoProvider":              validation.Validate(ds.GeoProvider, validation.NotNil),
+		"infoUrl":                  validation.Validate(ds.InfoURL, is.URL),
+		"logsEnabled":              validation.Validate(ds.LogsEnabled, validation.NotNil),
+		"orgServerFqdn":            validation.Validate(ds.OrgServerFQDN, is.URL),
+		"regionalGeoBlocking":      validation.Validate(ds.RegionalGeoBlocking, validation.NotNil),
+		"routingName":              validation.Validate(ds.RoutingName, isHost, noPeriods, validation.Length(1, 48)),
+		"typeId":                   validation.Validate(ds.TypeID, validation.Required, validation.Min(1)),
+		"xmlId":                    validation.Validate(ds.XMLID, noSpaces, noPeriods, validation.Length(1, 48)),
 	}
 
 	if errs != nil {
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/handlers.go b/traffic_ops/traffic_ops_golang/deliveryservice/handlers.go
index 558487317..0344fbb15 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/handlers.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/handlers.go
@@ -108,6 +108,7 @@ func getDeliveryServices(parameters map[string]string, db *sqlx.DB) ([]tc.Delive
 func selectDSesQuery() string {
 	query := `SELECT
  active,
+ anonymous_blocking_enabled,
  ccr_dns_ttl,
  cdn_id,
  cacheurl,
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/handlers_test.go b/traffic_ops/traffic_ops_golang/deliveryservice/handlers_test.go
index 304365ba9..36be42aab 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/handlers_test.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/handlers_test.go
@@ -45,6 +45,7 @@ func TestValidateErrors(t *testing.T) {
 
 	expected := []string{
 		"'active' is required",
+		"'anonymousBlockingEnabled' is required",
 		"'cdnId' cannot be blank",
 		"'displayName' the length must be between 1 and 48",
 		"'dscp' is required",
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go b/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go
new file mode 100644
index 000000000..f2129379d
--- /dev/null
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go
@@ -0,0 +1,340 @@
+package servers
+
+/*
+ * 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.
+ */
+
+import (
+	"errors"
+	"fmt"
+	"strconv"
+
+	"github.com/apache/incubator-trafficcontrol/lib/go-log"
+	"github.com/apache/incubator-trafficcontrol/lib/go-tc"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/api"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/auth"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/dbhelpers"
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/tovalidate"
+	"github.com/go-ozzo/ozzo-validation"
+
+	"github.com/jmoiron/sqlx"
+	"github.com/lib/pq"
+)
+
+// TODeliveryServiceRequest provides a type alias to define functions on
+type TODeliveryServiceServer tc.DeliveryServiceServer
+
+//the refType is passed into the handlers where a copy of its type is used to decode the json.
+var refType = TODeliveryServiceServer(tc.DeliveryServiceServer{})
+
+func GetRefType() *TODeliveryServiceServer {
+	return &refType
+}
+
+func (dss TODeliveryServiceServer) GetKeyFieldsInfo() []api.KeyFieldInfo {
+	return []api.KeyFieldInfo{{"deliveryservice", api.GetIntKey}, {"server", api.GetIntKey}}
+}
+
+//Implementation of the Identifier, Validator interface functions
+func (dss TODeliveryServiceServer) GetKeys() (map[string]interface{}, bool) {
+	if dss.DeliveryService == nil {
+		return map[string]interface{}{"deliveryservice": 0}, false
+	}
+	if dss.Server == nil {
+		return map[string]interface{}{"server": 0}, false
+	}
+	keys := make(map[string]interface{})
+	ds_id := *dss.DeliveryService
+	server_id := *dss.Server
+
+	keys["deliveryservice"] = ds_id
+	keys["server"] = server_id
+	return keys, true
+}
+
+func (dss *TODeliveryServiceServer) GetAuditName() string {
+	if dss.DeliveryService != nil {
+		return strconv.Itoa(*dss.DeliveryService) + "-" + strconv.Itoa(*dss.Server)
+	}
+	return "unknown"
+}
+
+func (dss *TODeliveryServiceServer) GetType() string {
+	return "deliveryserviceServers"
+}
+
+func (dss *TODeliveryServiceServer) SetKeys(keys map[string]interface{}) {
+	ds_id, _ := keys["deliveryservice"].(int) //this utilizes the non panicking type assertion, if the thrown away ok variable is false i will be the zero of the type, 0 here.
+	dss.DeliveryService = &ds_id
+
+	server_id, _ := keys["server"].(int) //this utilizes the non panicking type assertion, if the thrown away ok variable is false i will be the zero of the type, 0 here.
+	dss.Server = &server_id
+}
+
+// Validate fulfills the api.Validator interface
+func (dss *TODeliveryServiceServer) Validate(db *sqlx.DB) []error {
+
+	errs := validation.Errors{
+		"deliveryservice": validation.Validate(dss.DeliveryService, validation.Required),
+		"server":          validation.Validate(dss.Server, validation.Required),
+	}
+
+	return tovalidate.ToErrors(errs)
+}
+
+//The TODeliveryServiceServer implementation of the Creator interface
+//all implementations of Creator should use transactions and return the proper errorType
+//ParsePQUniqueConstraintError is used to determine if a profileparameter with conflicting values exists
+//if so, it will return an errorType of DataConflict and the type should be appended to the
+//generic error message returned
+//The insert sql returns the profile and lastUpdated values of the newly inserted profileparameter and have
+//to be added to the struct
+func (dss *TODeliveryServiceServer) Create(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+	rollbackTransaction := true
+	tx, err := db.Beginx()
+	defer func() {
+		if tx == nil || !rollbackTransaction {
+			return
+		}
+		err := tx.Rollback()
+		if err != nil {
+			log.Errorln(errors.New("rolling back transaction: " + err.Error()))
+		}
+	}()
+
+	if err != nil {
+		log.Error.Printf("could not begin transaction: %v", err)
+		return tc.DBError, tc.SystemError
+	}
+	resultRows, err := tx.NamedQuery(insertQuery(), dss)
+	if err != nil {
+		if pqErr, ok := err.(*pq.Error); ok {
+			err, eType := dbhelpers.ParsePQUniqueConstraintError(pqErr)
+			if eType == tc.DataConflictError {
+				return errors.New("a parameter with " + err.Error()), eType
+			}
+			return err, eType
+		}
+		log.Errorf("received non pq error: %++v from create execution", err)
+		return tc.DBError, tc.SystemError
+	}
+	defer resultRows.Close()
+
+	var ds_id int
+	var server_id int
+	var lastUpdated tc.TimeNoMod
+	rowsAffected := 0
+	for resultRows.Next() {
+		rowsAffected++
+		if err := resultRows.Scan(&ds_id, &server_id, &lastUpdated); err != nil {
+			log.Error.Printf("could not scan dss from insert: %s\n", err)
+			return tc.DBError, tc.SystemError
+		}
+	}
+	if rowsAffected == 0 {
+		err = errors.New("no deliveryServiceServer was inserted, nothing to return")
+		log.Errorln(err)
+		return tc.DBError, tc.SystemError
+	}
+	if rowsAffected > 1 {
+		err = errors.New("too many ids returned from parameter insert")
+		log.Errorln(err)
+		return tc.DBError, tc.SystemError
+	}
+
+	dss.SetKeys(map[string]interface{}{"deliveryservice": ds_id, "server": server_id})
+	dss.LastUpdated = &lastUpdated
+	err = tx.Commit()
+	if err != nil {
+		log.Errorln("Could not commit transaction: ", err)
+		return tc.DBError, tc.SystemError
+	}
+	rollbackTransaction = false
+	return nil, tc.NoError
+}
+
+func insertQuery() string {
+	query := `INSERT INTO deliveryservice_server (
+deliveryservice,
+server) VALUES (
+:ds_id,
+:server_id) RETURNING deliveryservice, server, last_updated`
+	return query
+}
+
+func (dss *TODeliveryServiceServer) Read(db *sqlx.DB, params map[string]string, user auth.CurrentUser) ([]interface{}, []error, tc.ApiErrorType) {
+	idstr, ok := params["id"]
+
+	if !ok {
+		log.Errorf("Deliveryservice Server Id missing")
+		return nil, []error{errors.New("Deliverservice id is required.")}, tc.DataMissingError
+	}
+	id, err := strconv.Atoi(idstr)
+
+	if err != nil {
+		log.Errorf("Deliveryservice Server Id is not an integer")
+		return nil, []error{errors.New("Deliverservice id is not an integer.")}, tc.SystemError
+	}
+
+	query := selectQuery()
+	log.Debugln("Query is ", query)
+
+	rows, err := db.Queryx(query, id)
+	if err != nil {
+		log.Errorf("Error querying DeliveryserviceServers: %v", err)
+		return nil, []error{tc.DBError}, tc.SystemError
+	}
+	defer rows.Close()
+
+	servers := []interface{}{}
+	for rows.Next() {
+		var s tc.DssServer
+		if err = rows.StructScan(&s); err != nil {
+			log.Errorf("error parsing dss rows: %v", err)
+			return nil, []error{tc.DBError}, tc.SystemError
+		}
+		hiddenField := ""
+		if user.PrivLevel < auth.PrivLevelAdmin {
+			s.ILOPassword = &hiddenField
+		}
+		servers = append(servers, s)
+	}
+
+	return servers, []error{}, tc.NoError
+
+}
+
+//The Parameter implementation of the Deleter interface
+//all implementations of Deleter should use transactions and return the proper errorType
+func (dss *TODeliveryServiceServer) Delete(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+	rollbackTransaction := true
+	tx, err := db.Beginx()
+	defer func() {
+		if tx == nil || !rollbackTransaction {
+			return
+		}
+		err := tx.Rollback()
+		if err != nil {
+			log.Errorln(errors.New("rolling back transaction: " + err.Error()))
+		}
+	}()
+
+	if err != nil {
+		log.Error.Printf("could not begin transaction: %v", err)
+		return tc.DBError, tc.SystemError
+	}
+	log.Debugf("about to run exec query: %s with parameter: %++v", deleteQuery(), dss)
+	result, err := tx.NamedExec(deleteQuery(), dss)
+	if err != nil {
+		log.Errorf("received error: %++v from delete execution", err)
+		return tc.DBError, tc.SystemError
+	}
+	rowsAffected, err := result.RowsAffected()
+	if err != nil {
+		return tc.DBError, tc.SystemError
+	}
+	if rowsAffected < 1 {
+		return errors.New("no parameter with that id found"), tc.DataMissingError
+	}
+	if rowsAffected > 1 {
+		return fmt.Errorf("this create affected too many rows: %d", rowsAffected), tc.SystemError
+	}
+
+	err = tx.Commit()
+	if err != nil {
+		log.Errorln("Could not commit transaction: ", err)
+		return tc.DBError, tc.SystemError
+	}
+	rollbackTransaction = false
+	return nil, tc.NoError
+}
+func selectQuery() string {
+
+	const JumboFrameBPS = 9000
+
+	// COALESCE is needed to default values that are nil in the database
+	// because Go does not allow that to marshal into the struct
+	selectStmt := `SELECT
+	cg.name as cachegroup,
+	s.cachegroup as cachegroup_id,
+	s.cdn_id,
+	cdn.name as cdn_name,
+	s.domain_name,
+	s.guid,
+	s.host_name,
+	s.https_port,
+	s.id,
+	s.ilo_ip_address,
+	s.ilo_ip_gateway,
+	s.ilo_ip_netmask,
+	s.ilo_password,
+	s.ilo_username,
+	COALESCE(s.interface_mtu, ` + strconv.Itoa(JumboFrameBPS) + `) as interface_mtu,
+	s.interface_name,
+	s.ip6_address,
+	s.ip6_gateway,
+	s.ip_address,
+	s.ip_gateway,
+	s.ip_netmask,
+	s.last_updated,
+	s.mgmt_ip_address,
+	s.mgmt_ip_gateway,
+	s.mgmt_ip_netmask,
+	s.offline_reason,
+	pl.name as phys_location,
+	s.phys_location as phys_location_id,
+	p.name as profile,
+	p.description as profile_desc,
+	s.profile as profile_id,
+	s.rack,
+	s.router_host_name,
+	s.router_port_name,
+	st.name as status,
+	s.status as status_id,
+	s.tcp_port,
+	t.name as server_type,
+	s.type as server_type_id,
+	s.upd_pending as upd_pending
+	FROM server s
+	JOIN cachegroup cg ON s.cachegroup = cg.id
+	JOIN cdn cdn ON s.cdn_id = cdn.id
+	JOIN phys_location pl ON s.phys_location = pl.id
+	JOIN profile p ON s.profile = p.id
+	JOIN status st ON s.status = st.id
+	JOIN type t ON s.type = t.id
+	WHERE s.id in (select server from deliveryservice_server where deliveryservice = $1)`
+
+	return selectStmt
+}
+
+func updateQuery() string {
+	query := `UPDATE
+	profile_parameter SET
+	profile=:profile_id,
+	parameter=:parameter_id
+	WHERE profile=:profile_id AND 
+      parameter = :parameter_id 
+      RETURNING last_updated`
+	return query
+}
+
+func deleteQuery() string {
+	query := `DELETE FROM profile_parameter
+	WHERE profile=:profile_id and parameter=:parameter_id`
+	return query
+}
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers_test.go b/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers_test.go
new file mode 100644
index 000000000..58d556e35
--- /dev/null
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers_test.go
@@ -0,0 +1,22 @@
+package servers
+
+/*
+ * 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.
+ */
+
+
diff --git a/traffic_ops/traffic_ops_golang/routes.go b/traffic_ops/traffic_ops_golang/routes.go
index 16b8ab988..5763f703d 100644
--- a/traffic_ops/traffic_ops_golang/routes.go
+++ b/traffic_ops/traffic_ops_golang/routes.go
@@ -35,9 +35,10 @@ import (
 	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/auth"
 	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/cachegroup"
 	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/cdn"
-
+	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/coordinate"
 	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/crconfig"
 	dsrequest "github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/deliveryservice/request"
+	dsserver "github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/deliveryservice/servers"
 	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/deliveryservice/request/comment"
 	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/division"
 	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/hwinfo"
@@ -72,118 +73,125 @@ func Routes(d ServerData) ([]Route, []RawRoute, http.Handler, error) {
 	proxyHandler := rootHandler(d)
 
 	routes := []Route{
-
-		// ************************************************** 1.2 Routes *************************************************************************************
-		// 1.2 routes are simply a Go replacement for the equivalent Perl route. They may or may not conform with the API guidelines (https://cwiki.apache.org/confluence/display/TC/API+Guidelines).
+		// 1.1 and 1.2 routes are simply a Go replacement for the equivalent Perl route. They may or may not conform with the API guidelines (https://cwiki.apache.org/confluence/display/TC/API+Guidelines).
+		// 1.3 routes exist only in a Go. There is NO equivalent Perl route. They should conform with the API guidelines (https://cwiki.apache.org/confluence/display/TC/API+Guidelines).
 
 		//ASN: CRUD
-		{1.2, http.MethodGet, `asns/?(\.json)?$`, api.ReadHandler(asn.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `asns/{id}$`, api.ReadHandler(asn.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `asns/{id}$`, api.UpdateHandler(asn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `asns/?$`, api.CreateHandler(asn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `asns/{id}$`, api.DeleteHandler(asn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.2, http.MethodGet, `asns/?(\.json)?$`, api.ReadHandler(asn.GetRefTypeV12(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `asns/?(\.json)?$`, asn.V11ReadAll(d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `asns/{id}$`, api.ReadHandler(asn.GetRefTypeV11(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `asns/{id}$`, api.UpdateHandler(asn.GetRefTypeV11(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `asns/?$`, api.CreateHandler(asn.GetRefTypeV11(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `asns/{id}$`, api.DeleteHandler(asn.GetRefTypeV11(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//CacheGroup: CRUD
-		{1.2, http.MethodGet, `cachegroups/?(\.json)?$`, api.ReadHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `cachegroups/{id}$`, api.ReadHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `cachegroups/{id}$`, api.UpdateHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `cachegroups/?$`, api.CreateHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `cachegroups/{id}$`, api.DeleteHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `cachegroups/?(\.json)?$`, api.ReadHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `cachegroups/{id}$`, api.ReadHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `cachegroups/{id}$`, api.UpdateHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `cachegroups/?$`, api.CreateHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `cachegroups/{id}$`, api.DeleteHandler(cachegroup.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//CDN
-		{1.2, http.MethodGet, `cdns/capacity$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
-		{1.2, http.MethodGet, `cdns/configs$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
-		{1.2, http.MethodGet, `cdns/domains$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
-		{1.2, http.MethodGet, `cdns/health$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
-		{1.2, http.MethodGet, `cdns/routing$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `cdns/capacity$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `cdns/configs$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `cdns/domains$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `cdns/health$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `cdns/routing$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
 
 		//CDN: CRUD
-		{1.2, http.MethodGet, `cdns/?(\.json)?$`, api.ReadHandler(cdn.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `cdns/{id}$`, api.ReadHandler(cdn.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `cdns/{id}$`, api.UpdateHandler(cdn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `cdns/?$`, api.CreateHandler(cdn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `cdns/{id}$`, api.DeleteHandler(cdn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `cdns/?(\.json)?$`, api.ReadHandler(cdn.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `cdns/{id}$`, api.ReadHandler(cdn.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `cdns/{id}$`, api.UpdateHandler(cdn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `cdns/?$`, api.CreateHandler(cdn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `cdns/{id}$`, api.DeleteHandler(cdn.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//CDN: Monitoring: Traffic Monitor
-		{1.2, http.MethodGet, `cdns/{name}/configs/monitoring(\.json)?$`, monitoringHandler(d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `cdns/{name}/configs/monitoring(\.json)?$`, monitoringHandler(d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
 
 		//Division: CRUD
-		{1.2, http.MethodGet, `divisions/?(\.json)?$`, api.ReadHandler(division.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `divisions/{id}$`, api.ReadHandler(division.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `divisions/{id}$`, api.UpdateHandler(division.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `divisions/?$`, api.CreateHandler(division.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `divisions/{id}$`, api.DeleteHandler(division.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `divisions/?(\.json)?$`, api.ReadHandler(division.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `divisions/{id}$`, api.ReadHandler(division.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `divisions/{id}$`, api.UpdateHandler(division.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `divisions/?$`, api.CreateHandler(division.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `divisions/{id}$`, api.DeleteHandler(division.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//HWInfo
-		{1.2, http.MethodGet, `hwinfo-wip/?(\.json)?$`, hwinfo.HWInfoHandler(d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `hwinfo-wip/?(\.json)?$`, hwinfo.HWInfoHandler(d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
 
 		//Parameter: CRUD
-		{1.2, http.MethodGet, `parameters/?(\.json)?$`, api.ReadHandler(parameter.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `parameters/{id}$`, api.ReadHandler(parameter.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `parameters/{id}$`, api.UpdateHandler(parameter.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `parameters/?$`, api.CreateHandler(parameter.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `parameters/{id}$`, api.DeleteHandler(parameter.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `parameters/?(\.json)?$`, api.ReadHandler(parameter.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `parameters/{id}$`, api.ReadHandler(parameter.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `parameters/{id}$`, api.UpdateHandler(parameter.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `parameters/?$`, api.CreateHandler(parameter.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `parameters/{id}$`, api.DeleteHandler(parameter.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//Phys_Location: CRUD
-		{1.2, http.MethodGet, `phys_locations/?(\.json)?$`, api.ReadHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `phys_locations/{id}$`, api.ReadHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `phys_locations/{id}$`, api.UpdateHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `phys_locations/?$`, api.CreateHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `phys_locations/{id}$`, api.DeleteHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `phys_locations/?(\.json)?$`, api.ReadHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `phys_locations/{id}$`, api.ReadHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `phys_locations/{id}$`, api.UpdateHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `phys_locations/?$`, api.CreateHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `phys_locations/{id}$`, api.DeleteHandler(physlocation.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//Ping
-		{1.2, http.MethodGet, `ping$`, ping.PingHandler(), 0, NoAuth, nil},
+		{1.1, http.MethodGet, `ping$`, ping.PingHandler(), 0, NoAuth, nil},
 
 		//Profile: CRUD
-		{1.2, http.MethodGet, `profiles/?(\.json)?$`, api.ReadHandler(profile.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `profiles/{id}$`, api.ReadHandler(profile.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `profiles/{id}$`, api.UpdateHandler(profile.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `profiles/?$`, api.CreateHandler(profile.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `profiles/{id}$`, api.DeleteHandler(profile.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `profiles/?(\.json)?$`, api.ReadHandler(profile.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `profiles/{id}$`, api.ReadHandler(profile.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `profiles/{id}$`, api.UpdateHandler(profile.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `profiles/?$`, api.CreateHandler(profile.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `profiles/{id}$`, api.DeleteHandler(profile.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//Region: CRUD
-		{1.2, http.MethodGet, `regions/?(\.json)?$`, api.ReadHandler(region.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `regions/{id}$`, api.ReadHandler(region.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `regions/{id}$`, api.UpdateHandler(region.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `regions/?$`, api.CreateHandler(region.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `regions/{id}$`, api.DeleteHandler(region.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `regions/?(\.json)?$`, api.ReadHandler(region.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `regions/{id}$`, api.ReadHandler(region.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `regions/{id}$`, api.UpdateHandler(region.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `regions/?$`, api.CreateHandler(region.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `regions/{id}$`, api.DeleteHandler(region.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+
+		// get all edge servers associated with a delivery service (from deliveryservice_server table)
+		{1.1, http.MethodGet, `deliveryservices/{id}/servers$`, api.ReadHandler(dsserver.GetRefType(), d.DB),auth.PrivLevelReadOnly, Authenticated, nil},
 
 		//Server
-		{1.2, http.MethodGet, `servers/checks$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
-		{1.2, http.MethodGet, `servers/details$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
-		{1.2, http.MethodGet, `servers/status$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
-		{1.2, http.MethodGet, `servers/totals$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `servers/checks$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `servers/details$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `servers/status$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
+		{1.1, http.MethodGet, `servers/totals$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
 
 		//Server: CRUD
-		{1.2, http.MethodGet, `servers/?(\.json)?$`, api.ReadHandler(server.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `servers/{id}$`, api.ReadHandler(server.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `servers/{id}$`, api.UpdateHandler(server.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `servers/?$`, api.CreateHandler(server.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `servers/{id}$`, api.DeleteHandler(server.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `servers/?(\.json)?$`, api.ReadHandler(server.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `servers/{id}$`, api.ReadHandler(server.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `servers/{id}$`, api.UpdateHandler(server.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `servers/?$`, api.CreateHandler(server.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `servers/{id}$`, api.DeleteHandler(server.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//Status: CRUD
-		{1.2, http.MethodGet, `statuses/?(\.json)?$`, api.ReadHandler(status.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `statuses/{id}$`, api.ReadHandler(status.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `statuses/{id}$`, api.UpdateHandler(status.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `statuses/?$`, api.CreateHandler(status.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `statuses/{id}$`, api.DeleteHandler(status.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `statuses/?(\.json)?$`, api.ReadHandler(status.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `statuses/{id}$`, api.ReadHandler(status.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `statuses/{id}$`, api.UpdateHandler(status.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `statuses/?$`, api.CreateHandler(status.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `statuses/{id}$`, api.DeleteHandler(status.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//System
-		{1.2, http.MethodGet, `system/info/?(\.json)?$`, systeminfo.Handler(d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `system/info/?(\.json)?$`, systeminfo.Handler(d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
 
 		//Type: CRUD
-		{1.2, http.MethodGet, `types/?(\.json)?$`, api.ReadHandler(types.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodGet, `types/{id}$`, api.ReadHandler(types.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
-		{1.2, http.MethodPut, `types/{id}$`, api.UpdateHandler(types.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodPost, `types/?$`, api.CreateHandler(types.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-		{1.2, http.MethodDelete, `types/{id}$`, api.DeleteHandler(types.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
-
-		// ************************************************** 1.3 Routes *************************************************************************************
-		// 1.3 routes exist only in a Go. There is NO equivalent Perl route. They should conform with the API guidelines (https://cwiki.apache.org/confluence/display/TC/API+Guidelines).
+		{1.1, http.MethodGet, `types/?(\.json)?$`, api.ReadHandler(types.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodGet, `types/{id}$`, api.ReadHandler(types.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.1, http.MethodPut, `types/{id}$`, api.UpdateHandler(types.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodPost, `types/?$`, api.CreateHandler(types.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodDelete, `types/{id}$`, api.DeleteHandler(types.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
 
 		//About
 		{1.3, http.MethodGet, `about/?(\.json)?$`, about.Handler(), auth.PrivLevelReadOnly, Authenticated, nil},
 
+		//Coordinates
+		{1.3, http.MethodGet, `coordinates/?(\.json)?$`, api.ReadHandler(coordinate.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.3, http.MethodGet, `coordinates/?$`, api.ReadHandler(coordinate.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+		{1.3, http.MethodPut, `coordinates/?$`, api.UpdateHandler(coordinate.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.3, http.MethodPost, `coordinates/?$`, api.CreateHandler(coordinate.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+		{1.3, http.MethodDelete, `coordinates/?$`, api.DeleteHandler(coordinate.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
+
 		//Delivery service request: CRUD
 		{1.3, http.MethodGet, `deliveryservice_requests/?(\.json)?$`, api.ReadHandler(dsrequest.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
 		{1.3, http.MethodPut, `deliveryservice_requests/?$`, api.UpdateHandler(dsrequest.GetRefType(), d.DB), auth.PrivLevelPortal, Authenticated, nil},
@@ -222,10 +230,10 @@ func Routes(d ServerData) ([]Route, []RawRoute, http.Handler, error) {
 		{1.3, http.MethodPost, `deliveryservices-wip/hostname/{hostName}/sslkeys/add$`, addDeliveryServiceSSLKeysHandler(d.DB, d.Config), auth.PrivLevelAdmin, Authenticated, nil},
 
 		//CRConfig
-		{1.2, http.MethodGet, `cdns/{cdn}/snapshot/?$`, crconfig.SnapshotGetHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
-		{1.2, http.MethodGet, `cdns/{cdn}/snapshot/new/?$`, crconfig.Handler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
-		{1.2, http.MethodPut, `cdns/{id}/snapshot/?$`, crconfig.SnapshotHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
-		{1.2, http.MethodPut, `snapshot/{cdn}/?$`, crconfig.SnapshotHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
+		{1.1, http.MethodGet, `cdns/{cdn}/snapshot/?$`, crconfig.SnapshotGetHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
+		{1.1, http.MethodGet, `cdns/{cdn}/snapshot/new/?$`, crconfig.Handler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
+		{1.1, http.MethodPut, `cdns/{id}/snapshot/?$`, crconfig.SnapshotHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
+		{1.1, http.MethodPut, `snapshot/{cdn}/?$`, crconfig.SnapshotHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
 	}
 
 	// rawRoutes are served at the root path. These should be almost exclusively old Perl pre-API routes, which have yet to be converted in all clients. New routes should be in the versioned API path.
@@ -233,7 +241,7 @@ func Routes(d ServerData) ([]Route, []RawRoute, http.Handler, error) {
 		// DEPRECATED - use PUT /api/1.2/snapshot/{cdn}
 		{http.MethodGet, `tools/write_crconfig/{cdn}/?$`, crconfig.SnapshotOldGUIHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
 		// DEPRECATED - use GET /api/1.2/cdns/{cdn}/snapshot
-		{http.MethodGet, `CRConfig-Snapshots/{cdn}/CRConfig.json?$`, crconfig.SnapshotGetHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
+		{http.MethodGet, `CRConfig-Snapshots/{cdn}/CRConfig.json?$`, crconfig.SnapshotOldGetHandler(d.DB, d.Config), crconfig.PrivLevel, Authenticated, nil},
 	}
 
 	return routes, rawRoutes, proxyHandler, nil
diff --git a/traffic_ops/traffic_ops_golang/types/types.go b/traffic_ops/traffic_ops_golang/types/types.go
index 74c10eb8f..ca5b70f93 100644
--- a/traffic_ops/traffic_ops_golang/types/types.go
+++ b/traffic_ops/traffic_ops_golang/types/types.go
@@ -132,7 +132,8 @@ func selectQuery() string {
 id,
 name,
 description,
-use_in_table
+use_in_table,
+last_updated
 FROM type typ`
 
 	return query
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/.travis.yml b/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/.travis.yml
deleted file mode 100644
index e29f8eef5..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/.travis.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-language: go
-
-go:
-  - 1.1
-  - 1.2
-  - 1.3
-  - 1.4
-  - 1.5
-  - 1.6
-  - tip
-
-notifications:
-  email:
-    - bwatas@gmail.com
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md b/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md
deleted file mode 100644
index 57e723846..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md
+++ /dev/null
@@ -1,26 +0,0 @@
-#### Support
-If you do have a contribution to the package, feel free to create a Pull Request or an Issue.
-
-#### What to contribute
-If you don't know what to do, there are some features and functions that need to be done
-
-- [ ] Refactor code
-- [ ] Edit docs and [README](https://github.com/asaskevich/govalidator/README.md): spellcheck, grammar and typo check
-- [ ] Create actual list of contributors and projects that currently using this package
-- [ ] Resolve [issues and bugs](https://github.com/asaskevich/govalidator/issues)
-- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
-- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
-- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
-- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
-- [ ] Implement fuzzing testing
-- [ ] Implement some struct/map/array utilities
-- [ ] Implement map/array validation
-- [ ] Implement benchmarking
-- [ ] Implement batch of examples
-- [ ] Look at forks for new features and fixes
-
-#### Advice
-Feel free to create what you want, but keep in mind when you implement new features:
-- Code must be clear and readable, names of variables/constants clearly describes what they are doing
-- Public functions must be documented and described in source file and added to README.md to the list of available functions
-- There are must be unit-tests for any new functions and improvements
\ No newline at end of file
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.gitmodules b/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.gitmodules
deleted file mode 100644
index df75a7619..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.gitmodules
+++ /dev/null
@@ -1,6 +0,0 @@
-[submodule "riak_pb"]
-	path = riak_pb
-	url = git://github.com/basho/riak_pb.git
-[submodule "tools"]
-	path = tools
-	url = git://github.com/basho/riak-client-tools.git
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.travis.yml b/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.travis.yml
deleted file mode 100644
index 1cf131490..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.travis.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-sudo: required
-dist: trusty
-language: go
-go:
-  - 1.6.x
-  - 1.7.x
-  - master
-env:
-  global:
-    - RIAK_HOST=localhost
-    - RIAK_PORT=8087
-  matrix:
-    - RIAK_DOWNLOAD_URL=http://s3.amazonaws.com/downloads.basho.com/riak/2.0/2.0.7/ubuntu/trusty/riak_2.0.7-1_amd64.deb
-    - RIAK_DOWNLOAD_URL=http://s3.amazonaws.com/downloads.basho.com/riak/2.2/2.2.0/ubuntu/trusty/riak_2.2.0-1_amd64.deb
-before_script:
-  - jdk_switcher use oraclejdk8
-  - sudo ./tools/travis-ci/riak-install -d "$RIAK_DOWNLOAD_URL"
-  - sudo ./tools/setup-riak -s
-script:
-  - sudo riak-admin security disable
-  - make test
-  - sudo riak-admin security enable
-  - make security-test
-notifications:
-  slack:
-    secure: czHGTocw0ERiYsnE+CsW6FRs0PM1YU7fleorn5QGxi4gAjbvk+PVEr4YgiJutzJWs+AMCRn8MdIHRTLUcCVewmXDKeLUBRf4Nj8pSgEsOqEHK+ftE35Gy5jNBqGCMr90YF5rSaNCkBFnlW+cy45Z2fvVoy/YkKjlQ2u7A0B1fvZVCHCRT7R3rKkaTApMEp/2gKxKL+7tcITTd0Jh1YdMurhEIo/CXspv57fcerCiRI4vdVj9iup/ZcbvdW4wx5557alvvj4uYntLbsj94cY6ox5t/EEehy8HOBn7pDUAwAbfadQ574EhZMHK0EZMnS3KHMHKf7/xP5inMfplNbIqqMMQ4yHH1vj49l2WdmVOJPWPJs5y9XNV5q9LDkJnp+ZgVLSYBLgzSnzCjJny/p5HH5lUAuaEzOPrif6rOD7zO0swWZDim5kQv5MKC5HK/7BJeLbT7hFHFTZ6gmzB4DFBSiSCfIYRdCrxylJnwiRT5yATKZfVQDBbFs9bwgeDNW3wXLtpZy+0Lx/q1fWi2Z0ZyuvQzOYSt0fLUXMoJILWmXSpWVSFpW4f6tl8kmEStPPPs5DnNOLlc8haZiaIfX9vpeYWBMMZBTl0Gs/ddCbzROTvvInJjkR1liJXmpKtzDYSCafy5ZUYPxSyg8s/mQVAhm+7FMZ/KC6f9gxonaw8oM0=
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/.travis.yml b/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/.travis.yml
deleted file mode 100644
index aedd4540b..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: go
-
-go:
-  - 1.6
-  - 1.7
-  - tip
-
-install:
-  - go get golang.org/x/tools/cmd/cover
-  - go get github.com/mattn/goveralls
-  - go list -f '{{range .Imports}}{{.}} {{end}}' ./... | xargs go get -v
-  - go list -f '{{range .TestImports}}{{.}} {{end}}' ./... | xargs go get -v
-
-script:
-  - go test -v -covermode=count -coverprofile=coverage.out
-  - $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/LICENSE b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/LICENSE
deleted file mode 100644
index 0d31edfa7..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
- Copyright (c) 2013, Jason Moiron
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/README.md b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/README.md
deleted file mode 100644
index 5c1bb3cb9..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/README.md
+++ /dev/null
@@ -1,183 +0,0 @@
-# sqlx
-
-[![Build Status](https://drone.io/github.com/jmoiron/sqlx/status.png)](https://drone.io/github.com/jmoiron/sqlx/latest) [![Godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/jmoiron/sqlx) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/jmoiron/sqlx/master/LICENSE)
-
-sqlx is a library which provides a set of extensions on go's standard
-`database/sql` library.  The sqlx versions of `sql.DB`, `sql.TX`, `sql.Stmt`,
-et al. all leave the underlying interfaces untouched, so that their interfaces
-are a superset on the standard ones.  This makes it relatively painless to
-integrate existing codebases using database/sql with sqlx.
-
-Major additional concepts are:
-
-* Marshal rows into structs (with embedded struct support), maps, and slices
-* Named parameter support including prepared statements
-* `Get` and `Select` to go quickly from query to struct/slice
-
-In addition to the [godoc API documentation](http://godoc.org/github.com/jmoiron/sqlx),
-there is also some [standard documentation](http://jmoiron.github.io/sqlx/) that
-explains how to use `database/sql` along with sqlx.
-
-## Recent Changes
-
-* sqlx/types.JsonText has been renamed to JSONText to follow Go naming conventions.
-
-This breaks backwards compatibility, but it's in a way that is trivially fixable
-(`s/JsonText/JSONText/g`).  The `types` package is both experimental and not in
-active development currently.
-
-* Using Go 1.6 and below with `types.JSONText` and `types.GzippedText` can be _potentially unsafe_, **especially** when used with common auto-scan sqlx idioms like `Select` and `Get`. See [golang bug #13905](https://github.com/golang/go/issues/13905).
-
-### Backwards Compatibility
-
-There is no Go1-like promise of absolute stability, but I take the issue seriously
-and will maintain the library in a compatible state unless vital bugs prevent me 
-from doing so.  Since [#59](https://github.com/jmoiron/sqlx/issues/59) and 
-[#60](https://github.com/jmoiron/sqlx/issues/60) necessitated breaking behavior, 
-a wider API cleanup was done at the time of fixing.  It's possible this will happen
-in future;  if it does, a git tag will be provided for users requiring the old
-behavior to continue to use it until such a time as they can migrate.
-
-## install
-
-    go get github.com/jmoiron/sqlx
-
-## issues
-
-Row headers can be ambiguous (`SELECT 1 AS a, 2 AS a`), and the result of
-`Columns()` does not fully qualify column names in queries like:
-
-```sql
-SELECT a.id, a.name, b.id, b.name FROM foos AS a JOIN foos AS b ON a.parent = b.id;
-```
-
-making a struct or map destination ambiguous.  Use `AS` in your queries
-to give columns distinct names, `rows.Scan` to scan them manually, or 
-`SliceScan` to get a slice of results.
-
-## usage
-
-Below is an example which shows some common use cases for sqlx.  Check 
-[sqlx_test.go](https://github.com/jmoiron/sqlx/blob/master/sqlx_test.go) for more
-usage.
-
-
-```go
-package main
-
-import (
-    _ "github.com/lib/pq"
-    "database/sql"
-    "github.com/jmoiron/sqlx"
-    "log"
-)
-
-var schema = `
-CREATE TABLE person (
-    first_name text,
-    last_name text,
-    email text
-);
-
-CREATE TABLE place (
-    country text,
-    city text NULL,
-    telcode integer
-)`
-
-type Person struct {
-    FirstName string `db:"first_name"`
-    LastName  string `db:"last_name"`
-    Email     string
-}
-
-type Place struct {
-    Country string
-    City    sql.NullString
-    TelCode int
-}
-
-func main() {
-    // this Pings the database trying to connect, panics on error
-    // use sqlx.Open() for sql.Open() semantics
-    db, err := sqlx.Connect("postgres", "user=foo dbname=bar sslmode=disable")
-    if err != nil {
-        log.Fatalln(err)
-    }
-
-    // exec the schema or fail; multi-statement Exec behavior varies between
-    // database drivers;  pq will exec them all, sqlite3 won't, ymmv
-    db.MustExec(schema)
-    
-    tx := db.MustBegin()
-    tx.MustExec("INSERT INTO person (first_name, last_name, email) VALUES ($1, $2, $3)", "Jason", "Moiron", "jmoiron@jmoiron.net")
-    tx.MustExec("INSERT INTO person (first_name, last_name, email) VALUES ($1, $2, $3)", "John", "Doe", "johndoeDNE@gmail.net")
-    tx.MustExec("INSERT INTO place (country, city, telcode) VALUES ($1, $2, $3)", "United States", "New York", "1")
-    tx.MustExec("INSERT INTO place (country, telcode) VALUES ($1, $2)", "Hong Kong", "852")
-    tx.MustExec("INSERT INTO place (country, telcode) VALUES ($1, $2)", "Singapore", "65")
-    // Named queries can use structs, so if you have an existing struct (i.e. person := &Person{}) that you have populated, you can pass it in as &person
-    tx.NamedExec("INSERT INTO person (first_name, last_name, email) VALUES (:first_name, :last_name, :email)", &Person{"Jane", "Citizen", "jane.citzen@example.com"})
-    tx.Commit()
-
-    // Query the database, storing results in a []Person (wrapped in []interface{})
-    people := []Person{}
-    db.Select(&people, "SELECT * FROM person ORDER BY first_name ASC")
-    jason, john := people[0], people[1]
-
-    fmt.Printf("%#v\n%#v", jason, john)
-    // Person{FirstName:"Jason", LastName:"Moiron", Email:"jmoiron@jmoiron.net"}
-    // Person{FirstName:"John", LastName:"Doe", Email:"johndoeDNE@gmail.net"}
-
-    // You can also get a single result, a la QueryRow
-    jason = Person{}
-    err = db.Get(&jason, "SELECT * FROM person WHERE first_name=$1", "Jason")
-    fmt.Printf("%#v\n", jason)
-    // Person{FirstName:"Jason", LastName:"Moiron", Email:"jmoiron@jmoiron.net"}
-
-    // if you have null fields and use SELECT *, you must use sql.Null* in your struct
-    places := []Place{}
-    err = db.Select(&places, "SELECT * FROM place ORDER BY telcode ASC")
-    if err != nil {
-        fmt.Println(err)
-        return
-    }
-    usa, singsing, honkers := places[0], places[1], places[2]
-    
-    fmt.Printf("%#v\n%#v\n%#v\n", usa, singsing, honkers)
-    // Place{Country:"United States", City:sql.NullString{String:"New York", Valid:true}, TelCode:1}
-    // Place{Country:"Singapore", City:sql.NullString{String:"", Valid:false}, TelCode:65}
-    // Place{Country:"Hong Kong", City:sql.NullString{String:"", Valid:false}, TelCode:852}
-
-    // Loop through rows using only one struct
-    place := Place{}
-    rows, err := db.Queryx("SELECT * FROM place")
-    for rows.Next() {
-        err := rows.StructScan(&place)
-        if err != nil {
-            log.Fatalln(err)
-        } 
-        fmt.Printf("%#v\n", place)
-    }
-    // Place{Country:"United States", City:sql.NullString{String:"New York", Valid:true}, TelCode:1}
-    // Place{Country:"Hong Kong", City:sql.NullString{String:"", Valid:false}, TelCode:852}
-    // Place{Country:"Singapore", City:sql.NullString{String:"", Valid:false}, TelCode:65}
-
-    // Named queries, using `:name` as the bindvar.  Automatic bindvar support
-    // which takes into account the dbtype based on the driverName on sqlx.Open/Connect
-    _, err = db.NamedExec(`INSERT INTO person (first_name,last_name,email) VALUES (:first,:last,:email)`, 
-        map[string]interface{}{
-            "first": "Bin",
-            "last": "Smuth",
-            "email": "bensmith@allblacks.nz",
-    })
-
-    // Selects Mr. Smith from the database
-    rows, err = db.NamedQuery(`SELECT * FROM person WHERE first_name=:fn`, map[string]interface{}{"fn": "Bin"})
-
-    // Named queries can also use structs.  Their bind names follow the same rules
-    // as the name -> db mapping, so struct fields are lowercased and the `db` tag
-    // is taken into consideration.
-    rows, err = db.NamedQuery(`SELECT * FROM person WHERE first_name=:first_name`, jason)
-}
-```
-
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/bind.go b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/bind.go
deleted file mode 100644
index 10f7bdf84..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/bind.go
+++ /dev/null
@@ -1,207 +0,0 @@
-package sqlx
-
-import (
-	"bytes"
-	"errors"
-	"reflect"
-	"strconv"
-	"strings"
-
-	"github.com/jmoiron/sqlx/reflectx"
-)
-
-// Bindvar types supported by Rebind, BindMap and BindStruct.
-const (
-	UNKNOWN = iota
-	QUESTION
-	DOLLAR
-	NAMED
-)
-
-// BindType returns the bindtype for a given database given a drivername.
-func BindType(driverName string) int {
-	switch driverName {
-	case "postgres", "pgx":
-		return DOLLAR
-	case "mysql":
-		return QUESTION
-	case "sqlite3":
-		return QUESTION
-	case "oci8", "ora", "goracle":
-		return NAMED
-	}
-	return UNKNOWN
-}
-
-// FIXME: this should be able to be tolerant of escaped ?'s in queries without
-// losing much speed, and should be to avoid confusion.
-
-// Rebind a query from the default bindtype (QUESTION) to the target bindtype.
-func Rebind(bindType int, query string) string {
-	switch bindType {
-	case QUESTION, UNKNOWN:
-		return query
-	}
-
-	// Add space enough for 10 params before we have to allocate
-	rqb := make([]byte, 0, len(query)+10)
-
-	var i, j int
-
-	for i = strings.Index(query, "?"); i != -1; i = strings.Index(query, "?") {
-		rqb = append(rqb, query[:i]...)
-
-		switch bindType {
-		case DOLLAR:
-			rqb = append(rqb, '$')
-		case NAMED:
-			rqb = append(rqb, ':', 'a', 'r', 'g')
-		}
-
-		j++
-		rqb = strconv.AppendInt(rqb, int64(j), 10)
-
-		query = query[i+1:]
-	}
-
-	return string(append(rqb, query...))
-}
-
-// Experimental implementation of Rebind which uses a bytes.Buffer.  The code is
-// much simpler and should be more resistant to odd unicode, but it is twice as
-// slow.  Kept here for benchmarking purposes and to possibly replace Rebind if
-// problems arise with its somewhat naive handling of unicode.
-func rebindBuff(bindType int, query string) string {
-	if bindType != DOLLAR {
-		return query
-	}
-
-	b := make([]byte, 0, len(query))
-	rqb := bytes.NewBuffer(b)
-	j := 1
-	for _, r := range query {
-		if r == '?' {
-			rqb.WriteRune('$')
-			rqb.WriteString(strconv.Itoa(j))
-			j++
-		} else {
-			rqb.WriteRune(r)
-		}
-	}
-
-	return rqb.String()
-}
-
-// In expands slice values in args, returning the modified query string
-// and a new arg list that can be executed by a database. The `query` should
-// use the `?` bindVar.  The return value uses the `?` bindVar.
-func In(query string, args ...interface{}) (string, []interface{}, error) {
-	// argMeta stores reflect.Value and length for slices and
-	// the value itself for non-slice arguments
-	type argMeta struct {
-		v      reflect.Value
-		i      interface{}
-		length int
-	}
-
-	var flatArgsCount int
-	var anySlices bool
-
-	meta := make([]argMeta, len(args))
-
-	for i, arg := range args {
-		v := reflect.ValueOf(arg)
-		t := reflectx.Deref(v.Type())
-
-		if t.Kind() == reflect.Slice {
-			meta[i].length = v.Len()
-			meta[i].v = v
-
-			anySlices = true
-			flatArgsCount += meta[i].length
-
-			if meta[i].length == 0 {
-				return "", nil, errors.New("empty slice passed to 'in' query")
-			}
-		} else {
-			meta[i].i = arg
-			flatArgsCount++
-		}
-	}
-
-	// don't do any parsing if there aren't any slices;  note that this means
-	// some errors that we might have caught below will not be returned.
-	if !anySlices {
-		return query, args, nil
-	}
-
-	newArgs := make([]interface{}, 0, flatArgsCount)
-	buf := bytes.NewBuffer(make([]byte, 0, len(query)+len(", ?")*flatArgsCount))
-
-	var arg, offset int
-
-	for i := strings.IndexByte(query[offset:], '?'); i != -1; i = strings.IndexByte(query[offset:], '?') {
-		if arg >= len(meta) {
-			// if an argument wasn't passed, lets return an error;  this is
-			// not actually how database/sql Exec/Query works, but since we are
-			// creating an argument list programmatically, we want to be able
-			// to catch these programmer errors earlier.
-			return "", nil, errors.New("number of bindVars exceeds arguments")
-		}
-
-		argMeta := meta[arg]
-		arg++
-
-		// not a slice, continue.
-		// our questionmark will either be written before the next expansion
-		// of a slice or after the loop when writing the rest of the query
-		if argMeta.length == 0 {
-			offset = offset + i + 1
-			newArgs = append(newArgs, argMeta.i)
-			continue
-		}
-
-		// write everything up to and including our ? character
-		buf.WriteString(query[:offset+i+1])
-
-		for si := 1; si < argMeta.length; si++ {
-			buf.WriteString(", ?")
-		}
-
-		newArgs = appendReflectSlice(newArgs, argMeta.v, argMeta.length)
-
-		// slice the query and reset the offset. this avoids some bookkeeping for
-		// the write after the loop
-		query = query[offset+i+1:]
-		offset = 0
-	}
-
-	buf.WriteString(query)
-
-	if arg < len(meta) {
-		return "", nil, errors.New("number of bindVars less than number arguments")
-	}
-
-	return buf.String(), newArgs, nil
-}
-
-func appendReflectSlice(args []interface{}, v reflect.Value, vlen int) []interface{} {
-	switch val := v.Interface().(type) {
-	case []interface{}:
-		args = append(args, val...)
-	case []int:
-		for i := range val {
-			args = append(args, val[i])
-		}
-	case []string:
-		for i := range val {
-			args = append(args, val[i])
-		}
-	default:
-		for si := 0; si < vlen; si++ {
-			args = append(args, v.Index(si).Interface())
-		}
-	}
-
-	return args
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/doc.go b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/doc.go
deleted file mode 100644
index e2b4e60b2..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/doc.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Package sqlx provides general purpose extensions to database/sql.
-//
-// It is intended to seamlessly wrap database/sql and provide convenience
-// methods which are useful in the development of database driven applications.
-// None of the underlying database/sql methods are changed.  Instead all extended
-// behavior is implemented through new methods defined on wrapper types.
-//
-// Additions include scanning into structs, named query support, rebinding
-// queries for different drivers, convenient shorthands for common error handling
-// and more.
-//
-package sqlx
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/named.go b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/named.go
deleted file mode 100644
index dd899d351..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/named.go
+++ /dev/null
@@ -1,344 +0,0 @@
-package sqlx
-
-// Named Query Support
-//
-//  * BindMap - bind query bindvars to map/struct args
-//	* NamedExec, NamedQuery - named query w/ struct or map
-//  * NamedStmt - a pre-compiled named query which is a prepared statement
-//
-// Internal Interfaces:
-//
-//  * compileNamedQuery - rebind a named query, returning a query and list of names
-//  * bindArgs, bindMapArgs, bindAnyArgs - given a list of names, return an arglist
-//
-import (
-	"database/sql"
-	"errors"
-	"fmt"
-	"reflect"
-	"strconv"
-	"unicode"
-
-	"github.com/jmoiron/sqlx/reflectx"
-)
-
-// NamedStmt is a prepared statement that executes named queries.  Prepare it
-// how you would execute a NamedQuery, but pass in a struct or map when executing.
-type NamedStmt struct {
-	Params      []string
-	QueryString string
-	Stmt        *Stmt
-}
-
-// Close closes the named statement.
-func (n *NamedStmt) Close() error {
-	return n.Stmt.Close()
-}
-
-// Exec executes a named statement using the struct passed.
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) Exec(arg interface{}) (sql.Result, error) {
-	args, err := bindAnyArgs(n.Params, arg, n.Stmt.Mapper)
-	if err != nil {
-		return *new(sql.Result), err
-	}
-	return n.Stmt.Exec(args...)
-}
-
-// Query executes a named statement using the struct argument, returning rows.
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) Query(arg interface{}) (*sql.Rows, error) {
-	args, err := bindAnyArgs(n.Params, arg, n.Stmt.Mapper)
-	if err != nil {
-		return nil, err
-	}
-	return n.Stmt.Query(args...)
-}
-
-// QueryRow executes a named statement against the database.  Because sqlx cannot
-// create a *sql.Row with an error condition pre-set for binding errors, sqlx
-// returns a *sqlx.Row instead.
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) QueryRow(arg interface{}) *Row {
-	args, err := bindAnyArgs(n.Params, arg, n.Stmt.Mapper)
-	if err != nil {
-		return &Row{err: err}
-	}
-	return n.Stmt.QueryRowx(args...)
-}
-
-// MustExec execs a NamedStmt, panicing on error
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) MustExec(arg interface{}) sql.Result {
-	res, err := n.Exec(arg)
-	if err != nil {
-		panic(err)
-	}
-	return res
-}
-
-// Queryx using this NamedStmt
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) Queryx(arg interface{}) (*Rows, error) {
-	r, err := n.Query(arg)
-	if err != nil {
-		return nil, err
-	}
-	return &Rows{Rows: r, Mapper: n.Stmt.Mapper, unsafe: isUnsafe(n)}, err
-}
-
-// QueryRowx this NamedStmt.  Because of limitations with QueryRow, this is
-// an alias for QueryRow.
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) QueryRowx(arg interface{}) *Row {
-	return n.QueryRow(arg)
-}
-
-// Select using this NamedStmt
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) Select(dest interface{}, arg interface{}) error {
-	rows, err := n.Queryx(arg)
-	if err != nil {
-		return err
-	}
-	// if something happens here, we want to make sure the rows are Closed
-	defer rows.Close()
-	return scanAll(rows, dest, false)
-}
-
-// Get using this NamedStmt
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) Get(dest interface{}, arg interface{}) error {
-	r := n.QueryRowx(arg)
-	return r.scanAny(dest, false)
-}
-
-// Unsafe creates an unsafe version of the NamedStmt
-func (n *NamedStmt) Unsafe() *NamedStmt {
-	r := &NamedStmt{Params: n.Params, Stmt: n.Stmt, QueryString: n.QueryString}
-	r.Stmt.unsafe = true
-	return r
-}
-
-// A union interface of preparer and binder, required to be able to prepare
-// named statements (as the bindtype must be determined).
-type namedPreparer interface {
-	Preparer
-	binder
-}
-
-func prepareNamed(p namedPreparer, query string) (*NamedStmt, error) {
-	bindType := BindType(p.DriverName())
-	q, args, err := compileNamedQuery([]byte(query), bindType)
-	if err != nil {
-		return nil, err
-	}
-	stmt, err := Preparex(p, q)
-	if err != nil {
-		return nil, err
-	}
-	return &NamedStmt{
-		QueryString: q,
-		Params:      args,
-		Stmt:        stmt,
-	}, nil
-}
-
-func bindAnyArgs(names []string, arg interface{}, m *reflectx.Mapper) ([]interface{}, error) {
-	if maparg, ok := arg.(map[string]interface{}); ok {
-		return bindMapArgs(names, maparg)
-	}
-	return bindArgs(names, arg, m)
-}
-
-// private interface to generate a list of interfaces from a given struct
-// type, given a list of names to pull out of the struct.  Used by public
-// BindStruct interface.
-func bindArgs(names []string, arg interface{}, m *reflectx.Mapper) ([]interface{}, error) {
-	arglist := make([]interface{}, 0, len(names))
-
-	// grab the indirected value of arg
-	v := reflect.ValueOf(arg)
-	for v = reflect.ValueOf(arg); v.Kind() == reflect.Ptr; {
-		v = v.Elem()
-	}
-
-	fields := m.TraversalsByName(v.Type(), names)
-	for i, t := range fields {
-		if len(t) == 0 {
-			return arglist, fmt.Errorf("could not find name %s in %#v", names[i], arg)
-		}
-		val := reflectx.FieldByIndexesReadOnly(v, t)
-		arglist = append(arglist, val.Interface())
-	}
-
-	return arglist, nil
-}
-
-// like bindArgs, but for maps.
-func bindMapArgs(names []string, arg map[string]interface{}) ([]interface{}, error) {
-	arglist := make([]interface{}, 0, len(names))
-
-	for _, name := range names {
-		val, ok := arg[name]
-		if !ok {
-			return arglist, fmt.Errorf("could not find name %s in %#v", name, arg)
-		}
-		arglist = append(arglist, val)
-	}
-	return arglist, nil
-}
-
-// bindStruct binds a named parameter query with fields from a struct argument.
-// The rules for binding field names to parameter names follow the same
-// conventions as for StructScan, including obeying the `db` struct tags.
-func bindStruct(bindType int, query string, arg interface{}, m *reflectx.Mapper) (string, []interface{}, error) {
-	bound, names, err := compileNamedQuery([]byte(query), bindType)
-	if err != nil {
-		return "", []interface{}{}, err
-	}
-
-	arglist, err := bindArgs(names, arg, m)
-	if err != nil {
-		return "", []interface{}{}, err
-	}
-
-	return bound, arglist, nil
-}
-
-// bindMap binds a named parameter query with a map of arguments.
-func bindMap(bindType int, query string, args map[string]interface{}) (string, []interface{}, error) {
-	bound, names, err := compileNamedQuery([]byte(query), bindType)
-	if err != nil {
-		return "", []interface{}{}, err
-	}
-
-	arglist, err := bindMapArgs(names, args)
-	return bound, arglist, err
-}
-
-// -- Compilation of Named Queries
-
-// Allow digits and letters in bind params;  additionally runes are
-// checked against underscores, meaning that bind params can have be
-// alphanumeric with underscores.  Mind the difference between unicode
-// digits and numbers, where '5' is a digit but '五' is not.
-var allowedBindRunes = []*unicode.RangeTable{unicode.Letter, unicode.Digit}
-
-// FIXME: this function isn't safe for unicode named params, as a failing test
-// can testify.  This is not a regression but a failure of the original code
-// as well.  It should be modified to range over runes in a string rather than
-// bytes, even though this is less convenient and slower.  Hopefully the
-// addition of the prepared NamedStmt (which will only do this once) will make
-// up for the slightly slower ad-hoc NamedExec/NamedQuery.
-
-// compile a NamedQuery into an unbound query (using the '?' bindvar) and
-// a list of names.
-func compileNamedQuery(qs []byte, bindType int) (query string, names []string, err error) {
-	names = make([]string, 0, 10)
-	rebound := make([]byte, 0, len(qs))
-
-	inName := false
-	last := len(qs) - 1
-	currentVar := 1
-	name := make([]byte, 0, 10)
-
-	for i, b := range qs {
-		// a ':' while we're in a name is an error
-		if b == ':' {
-			// if this is the second ':' in a '::' escape sequence, append a ':'
-			if inName && i > 0 && qs[i-1] == ':' {
-				rebound = append(rebound, ':')
-				inName = false
-				continue
-			} else if inName {
-				err = errors.New("unexpected `:` while reading named param at " + strconv.Itoa(i))
-				return query, names, err
-			}
-			inName = true
-			name = []byte{}
-			// if we're in a name, and this is an allowed character, continue
-		} else if inName && (unicode.IsOneOf(allowedBindRunes, rune(b)) || b == '_' || b == '.') && i != last {
-			// append the byte to the name if we are in a name and not on the last byte
-			name = append(name, b)
-			// if we're in a name and it's not an allowed character, the name is done
-		} else if inName {
-			inName = false
-			// if this is the final byte of the string and it is part of the name, then
-			// make sure to add it to the name
-			if i == last && unicode.IsOneOf(allowedBindRunes, rune(b)) {
-				name = append(name, b)
-			}
-			// add the string representation to the names list
-			names = append(names, string(name))
-			// add a proper bindvar for the bindType
-			switch bindType {
-			// oracle only supports named type bind vars even for positional
-			case NAMED:
-				rebound = append(rebound, ':')
-				rebound = append(rebound, name...)
-			case QUESTION, UNKNOWN:
-				rebound = append(rebound, '?')
-			case DOLLAR:
-				rebound = append(rebound, '$')
-				for _, b := range strconv.Itoa(currentVar) {
-					rebound = append(rebound, byte(b))
-				}
-				currentVar++
-			}
-			// add this byte to string unless it was not part of the name
-			if i != last {
-				rebound = append(rebound, b)
-			} else if !unicode.IsOneOf(allowedBindRunes, rune(b)) {
-				rebound = append(rebound, b)
-			}
-		} else {
-			// this is a normal byte and should just go onto the rebound query
-			rebound = append(rebound, b)
-		}
-	}
-
-	return string(rebound), names, err
-}
-
-// BindNamed binds a struct or a map to a query with named parameters.
-// DEPRECATED: use sqlx.Named` instead of this, it may be removed in future.
-func BindNamed(bindType int, query string, arg interface{}) (string, []interface{}, error) {
-	return bindNamedMapper(bindType, query, arg, mapper())
-}
-
-// Named takes a query using named parameters and an argument and
-// returns a new query with a list of args that can be executed by
-// a database.  The return value uses the `?` bindvar.
-func Named(query string, arg interface{}) (string, []interface{}, error) {
-	return bindNamedMapper(QUESTION, query, arg, mapper())
-}
-
-func bindNamedMapper(bindType int, query string, arg interface{}, m *reflectx.Mapper) (string, []interface{}, error) {
-	if maparg, ok := arg.(map[string]interface{}); ok {
-		return bindMap(bindType, query, maparg)
-	}
-	return bindStruct(bindType, query, arg, m)
-}
-
-// NamedQuery binds a named query and then runs Query on the result using the
-// provided Ext (sqlx.Tx, sqlx.Db).  It works with both structs and with
-// map[string]interface{} types.
-func NamedQuery(e Ext, query string, arg interface{}) (*Rows, error) {
-	q, args, err := bindNamedMapper(BindType(e.DriverName()), query, arg, mapperFor(e))
-	if err != nil {
-		return nil, err
-	}
-	return e.Queryx(q, args...)
-}
-
-// NamedExec uses BindStruct to get a query executable by the driver and
-// then runs Exec on the result.  Returns an error from the binding
-// or the query excution itself.
-func NamedExec(e Ext, query string, arg interface{}) (sql.Result, error) {
-	q, args, err := bindNamedMapper(BindType(e.DriverName()), query, arg, mapperFor(e))
-	if err != nil {
-		return nil, err
-	}
-	return e.Exec(q, args...)
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/named_context.go b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/named_context.go
deleted file mode 100644
index 9405007e2..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/named_context.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// +build go1.8
-
-package sqlx
-
-import (
-	"context"
-	"database/sql"
-)
-
-// A union interface of contextPreparer and binder, required to be able to
-// prepare named statements with context (as the bindtype must be determined).
-type namedPreparerContext interface {
-	PreparerContext
-	binder
-}
-
-func prepareNamedContext(ctx context.Context, p namedPreparerContext, query string) (*NamedStmt, error) {
-	bindType := BindType(p.DriverName())
-	q, args, err := compileNamedQuery([]byte(query), bindType)
-	if err != nil {
-		return nil, err
-	}
-	stmt, err := PreparexContext(ctx, p, q)
-	if err != nil {
-		return nil, err
-	}
-	return &NamedStmt{
-		QueryString: q,
-		Params:      args,
-		Stmt:        stmt,
-	}, nil
-}
-
-// ExecContext executes a named statement using the struct passed.
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) ExecContext(ctx context.Context, arg interface{}) (sql.Result, error) {
-	args, err := bindAnyArgs(n.Params, arg, n.Stmt.Mapper)
-	if err != nil {
-		return *new(sql.Result), err
-	}
-	return n.Stmt.ExecContext(ctx, args...)
-}
-
-// QueryContext executes a named statement using the struct argument, returning rows.
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) QueryContext(ctx context.Context, arg interface{}) (*sql.Rows, error) {
-	args, err := bindAnyArgs(n.Params, arg, n.Stmt.Mapper)
-	if err != nil {
-		return nil, err
-	}
-	return n.Stmt.QueryContext(ctx, args...)
-}
-
-// QueryRowContext executes a named statement against the database.  Because sqlx cannot
-// create a *sql.Row with an error condition pre-set for binding errors, sqlx
-// returns a *sqlx.Row instead.
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) QueryRowContext(ctx context.Context, arg interface{}) *Row {
-	args, err := bindAnyArgs(n.Params, arg, n.Stmt.Mapper)
-	if err != nil {
-		return &Row{err: err}
-	}
-	return n.Stmt.QueryRowxContext(ctx, args...)
-}
-
-// MustExecContext execs a NamedStmt, panicing on error
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) MustExecContext(ctx context.Context, arg interface{}) sql.Result {
-	res, err := n.ExecContext(ctx, arg)
-	if err != nil {
-		panic(err)
-	}
-	return res
-}
-
-// QueryxContext using this NamedStmt
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) QueryxContext(ctx context.Context, arg interface{}) (*Rows, error) {
-	r, err := n.QueryContext(ctx, arg)
-	if err != nil {
-		return nil, err
-	}
-	return &Rows{Rows: r, Mapper: n.Stmt.Mapper, unsafe: isUnsafe(n)}, err
-}
-
-// QueryRowxContext this NamedStmt.  Because of limitations with QueryRow, this is
-// an alias for QueryRow.
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) QueryRowxContext(ctx context.Context, arg interface{}) *Row {
-	return n.QueryRowContext(ctx, arg)
-}
-
-// SelectContext using this NamedStmt
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) SelectContext(ctx context.Context, dest interface{}, arg interface{}) error {
-	rows, err := n.QueryxContext(ctx, arg)
-	if err != nil {
-		return err
-	}
-	// if something happens here, we want to make sure the rows are Closed
-	defer rows.Close()
-	return scanAll(rows, dest, false)
-}
-
-// GetContext using this NamedStmt
-// Any named placeholder parameters are replaced with fields from arg.
-func (n *NamedStmt) GetContext(ctx context.Context, dest interface{}, arg interface{}) error {
-	r := n.QueryRowxContext(ctx, arg)
-	return r.scanAny(dest, false)
-}
-
-// NamedQueryContext binds a named query and then runs Query on the result using the
-// provided Ext (sqlx.Tx, sqlx.Db).  It works with both structs and with
-// map[string]interface{} types.
-func NamedQueryContext(ctx context.Context, e ExtContext, query string, arg interface{}) (*Rows, error) {
-	q, args, err := bindNamedMapper(BindType(e.DriverName()), query, arg, mapperFor(e))
-	if err != nil {
-		return nil, err
-	}
-	return e.QueryxContext(ctx, q, args...)
-}
-
-// NamedExecContext uses BindStruct to get a query executable by the driver and
-// then runs Exec on the result.  Returns an error from the binding
-// or the query excution itself.
-func NamedExecContext(ctx context.Context, e ExtContext, query string, arg interface{}) (sql.Result, error) {
-	q, args, err := bindNamedMapper(BindType(e.DriverName()), query, arg, mapperFor(e))
-	if err != nil {
-		return nil, err
-	}
-	return e.ExecContext(ctx, q, args...)
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/reflectx/README.md b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/reflectx/README.md
deleted file mode 100644
index f01d3d1f0..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/reflectx/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# reflectx
-
-The sqlx package has special reflect needs.  In particular, it needs to:
-
-* be able to map a name to a field
-* understand embedded structs
-* understand mapping names to fields by a particular tag
-* user specified name -> field mapping functions
-
-These behaviors mimic the behaviors by the standard library marshallers and also the
-behavior of standard Go accessors.
-
-The first two are amply taken care of by `Reflect.Value.FieldByName`, and the third is
-addressed by `Reflect.Value.FieldByNameFunc`, but these don't quite understand struct
-tags in the ways that are vital to most marshallers, and they are slow.
-
-This reflectx package extends reflect to achieve these goals.
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/reflectx/reflect.go b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/reflectx/reflect.go
deleted file mode 100644
index f2802b80b..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/reflectx/reflect.go
+++ /dev/null
@@ -1,422 +0,0 @@
-// Package reflectx implements extensions to the standard reflect lib suitable
-// for implementing marshalling and unmarshalling packages.  The main Mapper type
-// allows for Go-compatible named attribute access, including accessing embedded
-// struct attributes and the ability to use  functions and struct tags to
-// customize field names.
-//
-package reflectx
-
-import (
-	"reflect"
-	"runtime"
-	"strings"
-	"sync"
-)
-
-// A FieldInfo is metadata for a struct field.
-type FieldInfo struct {
-	Index    []int
-	Path     string
-	Field    reflect.StructField
-	Zero     reflect.Value
-	Name     string
-	Options  map[string]string
-	Embedded bool
-	Children []*FieldInfo
-	Parent   *FieldInfo
-}
-
-// A StructMap is an index of field metadata for a struct.
-type StructMap struct {
-	Tree  *FieldInfo
-	Index []*FieldInfo
-	Paths map[string]*FieldInfo
-	Names map[string]*FieldInfo
-}
-
-// GetByPath returns a *FieldInfo for a given string path.
-func (f StructMap) GetByPath(path string) *FieldInfo {
-	return f.Paths[path]
-}
-
-// GetByTraversal returns a *FieldInfo for a given integer path.  It is
-// analogous to reflect.FieldByIndex, but using the cached traversal
-// rather than re-executing the reflect machinery each time.
-func (f StructMap) GetByTraversal(index []int) *FieldInfo {
-	if len(index) == 0 {
-		return nil
-	}
-
-	tree := f.Tree
-	for _, i := range index {
-		if i >= len(tree.Children) || tree.Children[i] == nil {
-			return nil
-		}
-		tree = tree.Children[i]
-	}
-	return tree
-}
-
-// Mapper is a general purpose mapper of names to struct fields.  A Mapper
-// behaves like most marshallers in the standard library, obeying a field tag
-// for name mapping but also providing a basic transform function.
-type Mapper struct {
-	cache      map[reflect.Type]*StructMap
-	tagName    string
-	tagMapFunc func(string) string
-	mapFunc    func(string) string
-	mutex      sync.Mutex
-}
-
-// NewMapper returns a new mapper using the tagName as its struct field tag.
-// If tagName is the empty string, it is ignored.
-func NewMapper(tagName string) *Mapper {
-	return &Mapper{
-		cache:   make(map[reflect.Type]*StructMap),
-		tagName: tagName,
-	}
-}
-
-// NewMapperTagFunc returns a new mapper which contains a mapper for field names
-// AND a mapper for tag values.  This is useful for tags like json which can
-// have values like "name,omitempty".
-func NewMapperTagFunc(tagName string, mapFunc, tagMapFunc func(string) string) *Mapper {
-	return &Mapper{
-		cache:      make(map[reflect.Type]*StructMap),
-		tagName:    tagName,
-		mapFunc:    mapFunc,
-		tagMapFunc: tagMapFunc,
-	}
-}
-
-// NewMapperFunc returns a new mapper which optionally obeys a field tag and
-// a struct field name mapper func given by f.  Tags will take precedence, but
-// for any other field, the mapped name will be f(field.Name)
-func NewMapperFunc(tagName string, f func(string) string) *Mapper {
-	return &Mapper{
-		cache:   make(map[reflect.Type]*StructMap),
-		tagName: tagName,
-		mapFunc: f,
-	}
-}
-
-// TypeMap returns a mapping of field strings to int slices representing
-// the traversal down the struct to reach the field.
-func (m *Mapper) TypeMap(t reflect.Type) *StructMap {
-	m.mutex.Lock()
-	mapping, ok := m.cache[t]
-	if !ok {
-		mapping = getMapping(t, m.tagName, m.mapFunc, m.tagMapFunc)
-		m.cache[t] = mapping
-	}
-	m.mutex.Unlock()
-	return mapping
-}
-
-// FieldMap returns the mapper's mapping of field names to reflect values.  Panics
-// if v's Kind is not Struct, or v is not Indirectable to a struct kind.
-func (m *Mapper) FieldMap(v reflect.Value) map[string]reflect.Value {
-	v = reflect.Indirect(v)
-	mustBe(v, reflect.Struct)
-
-	r := map[string]reflect.Value{}
-	tm := m.TypeMap(v.Type())
-	for tagName, fi := range tm.Names {
-		r[tagName] = FieldByIndexes(v, fi.Index)
-	}
-	return r
-}
-
-// FieldByName returns a field by its mapped name as a reflect.Value.
-// Panics if v's Kind is not Struct or v is not Indirectable to a struct Kind.
-// Returns zero Value if the name is not found.
-func (m *Mapper) FieldByName(v reflect.Value, name string) reflect.Value {
-	v = reflect.Indirect(v)
-	mustBe(v, reflect.Struct)
-
-	tm := m.TypeMap(v.Type())
-	fi, ok := tm.Names[name]
-	if !ok {
-		return v
-	}
-	return FieldByIndexes(v, fi.Index)
-}
-
-// FieldsByName returns a slice of values corresponding to the slice of names
-// for the value.  Panics if v's Kind is not Struct or v is not Indirectable
-// to a struct Kind.  Returns zero Value for each name not found.
-func (m *Mapper) FieldsByName(v reflect.Value, names []string) []reflect.Value {
-	v = reflect.Indirect(v)
-	mustBe(v, reflect.Struct)
-
-	tm := m.TypeMap(v.Type())
-	vals := make([]reflect.Value, 0, len(names))
-	for _, name := range names {
-		fi, ok := tm.Names[name]
-		if !ok {
-			vals = append(vals, *new(reflect.Value))
-		} else {
-			vals = append(vals, FieldByIndexes(v, fi.Index))
-		}
-	}
-	return vals
-}
-
-// TraversalsByName returns a slice of int slices which represent the struct
-// traversals for each mapped name.  Panics if t is not a struct or Indirectable
-// to a struct.  Returns empty int slice for each name not found.
-func (m *Mapper) TraversalsByName(t reflect.Type, names []string) [][]int {
-	t = Deref(t)
-	mustBe(t, reflect.Struct)
-	tm := m.TypeMap(t)
-
-	r := make([][]int, 0, len(names))
-	for _, name := range names {
-		fi, ok := tm.Names[name]
-		if !ok {
-			r = append(r, []int{})
-		} else {
-			r = append(r, fi.Index)
-		}
-	}
-	return r
-}
-
-// FieldByIndexes returns a value for the field given by the struct traversal
-// for the given value.
-func FieldByIndexes(v reflect.Value, indexes []int) reflect.Value {
-	for _, i := range indexes {
-		v = reflect.Indirect(v).Field(i)
-		// if this is a pointer and it's nil, allocate a new value and set it
-		if v.Kind() == reflect.Ptr && v.IsNil() {
-			alloc := reflect.New(Deref(v.Type()))
-			v.Set(alloc)
-		}
-		if v.Kind() == reflect.Map && v.IsNil() {
-			v.Set(reflect.MakeMap(v.Type()))
-		}
-	}
-	return v
-}
-
-// FieldByIndexesReadOnly returns a value for a particular struct traversal,
-// but is not concerned with allocating nil pointers because the value is
-// going to be used for reading and not setting.
-func FieldByIndexesReadOnly(v reflect.Value, indexes []int) reflect.Value {
-	for _, i := range indexes {
-		v = reflect.Indirect(v).Field(i)
-	}
-	return v
-}
-
-// Deref is Indirect for reflect.Types
-func Deref(t reflect.Type) reflect.Type {
-	if t.Kind() == reflect.Ptr {
-		t = t.Elem()
-	}
-	return t
-}
-
-// -- helpers & utilities --
-
-type kinder interface {
-	Kind() reflect.Kind
-}
-
-// mustBe checks a value against a kind, panicing with a reflect.ValueError
-// if the kind isn't that which is required.
-func mustBe(v kinder, expected reflect.Kind) {
-	if k := v.Kind(); k != expected {
-		panic(&reflect.ValueError{Method: methodName(), Kind: k})
-	}
-}
-
-// methodName returns the caller of the function calling methodName
-func methodName() string {
-	pc, _, _, _ := runtime.Caller(2)
-	f := runtime.FuncForPC(pc)
-	if f == nil {
-		return "unknown method"
-	}
-	return f.Name()
-}
-
-type typeQueue struct {
-	t  reflect.Type
-	fi *FieldInfo
-	pp string // Parent path
-}
-
-// A copying append that creates a new slice each time.
-func apnd(is []int, i int) []int {
-	x := make([]int, len(is)+1)
-	for p, n := range is {
-		x[p] = n
-	}
-	x[len(x)-1] = i
-	return x
-}
-
-type mapf func(string) string
-
-// parseName parses the tag and the target name for the given field using
-// the tagName (eg 'json' for `json:"foo"` tags), mapFunc for mapping the
-// field's name to a target name, and tagMapFunc for mapping the tag to
-// a target name.
-func parseName(field reflect.StructField, tagName string, mapFunc, tagMapFunc mapf) (tag, fieldName string) {
-	// first, set the fieldName to the field's name
-	fieldName = field.Name
-	// if a mapFunc is set, use that to override the fieldName
-	if mapFunc != nil {
-		fieldName = mapFunc(fieldName)
-	}
-
-	// if there's no tag to look for, return the field name
-	if tagName == "" {
-		return "", fieldName
-	}
-
-	// if this tag is not set using the normal convention in the tag,
-	// then return the fieldname..  this check is done because according
-	// to the reflect documentation:
-	//    If the tag does not have the conventional format,
-	//    the value returned by Get is unspecified.
-	// which doesn't sound great.
-	if !strings.Contains(string(field.Tag), tagName+":") {
-		return "", fieldName
-	}
-
-	// at this point we're fairly sure that we have a tag, so lets pull it out
-	tag = field.Tag.Get(tagName)
-
-	// if we have a mapper function, call it on the whole tag
-	// XXX: this is a change from the old version, which pulled out the name
-	// before the tagMapFunc could be run, but I think this is the right way
-	if tagMapFunc != nil {
-		tag = tagMapFunc(tag)
-	}
-
-	// finally, split the options from the name
-	parts := strings.Split(tag, ",")
-	fieldName = parts[0]
-
-	return tag, fieldName
-}
-
-// parseOptions parses options out of a tag string, skipping the name
-func parseOptions(tag string) map[string]string {
-	parts := strings.Split(tag, ",")
-	options := make(map[string]string, len(parts))
-	if len(parts) > 1 {
-		for _, opt := range parts[1:] {
-			// short circuit potentially expensive split op
-			if strings.Contains(opt, "=") {
-				kv := strings.Split(opt, "=")
-				options[kv[0]] = kv[1]
-				continue
-			}
-			options[opt] = ""
-		}
-	}
-	return options
-}
-
-// getMapping returns a mapping for the t type, using the tagName, mapFunc and
-// tagMapFunc to determine the canonical names of fields.
-func getMapping(t reflect.Type, tagName string, mapFunc, tagMapFunc mapf) *StructMap {
-	m := []*FieldInfo{}
-
-	root := &FieldInfo{}
-	queue := []typeQueue{}
-	queue = append(queue, typeQueue{Deref(t), root, ""})
-
-QueueLoop:
-	for len(queue) != 0 {
-		// pop the first item off of the queue
-		tq := queue[0]
-		queue = queue[1:]
-
-		// ignore recursive field
-		for p := tq.fi.Parent; p != nil; p = p.Parent {
-			if tq.fi.Field.Type == p.Field.Type {
-				continue QueueLoop
-			}
-		}
-
-		nChildren := 0
-		if tq.t.Kind() == reflect.Struct {
-			nChildren = tq.t.NumField()
-		}
-		tq.fi.Children = make([]*FieldInfo, nChildren)
-
-		// iterate through all of its fields
-		for fieldPos := 0; fieldPos < nChildren; fieldPos++ {
-
-			f := tq.t.Field(fieldPos)
-
-			// parse the tag and the target name using the mapping options for this field
-			tag, name := parseName(f, tagName, mapFunc, tagMapFunc)
-
-			// if the name is "-", disabled via a tag, skip it
-			if name == "-" {
-				continue
-			}
-
-			fi := FieldInfo{
-				Field:   f,
-				Name:    name,
-				Zero:    reflect.New(f.Type).Elem(),
-				Options: parseOptions(tag),
-			}
-
-			// if the path is empty this path is just the name
-			if tq.pp == "" {
-				fi.Path = fi.Name
-			} else {
-				fi.Path = tq.pp + "." + fi.Name
-			}
-
-			// skip unexported fields
-			if len(f.PkgPath) != 0 && !f.Anonymous {
-				continue
-			}
-
-			// bfs search of anonymous embedded structs
-			if f.Anonymous {
-				pp := tq.pp
-				if tag != "" {
-					pp = fi.Path
-				}
-
-				fi.Embedded = true
-				fi.Index = apnd(tq.fi.Index, fieldPos)
-				nChildren := 0
-				ft := Deref(f.Type)
-				if ft.Kind() == reflect.Struct {
-					nChildren = ft.NumField()
-				}
-				fi.Children = make([]*FieldInfo, nChildren)
-				queue = append(queue, typeQueue{Deref(f.Type), &fi, pp})
-			} else if fi.Zero.Kind() == reflect.Struct || (fi.Zero.Kind() == reflect.Ptr && fi.Zero.Type().Elem().Kind() == reflect.Struct) {
-				fi.Index = apnd(tq.fi.Index, fieldPos)
-				fi.Children = make([]*FieldInfo, Deref(f.Type).NumField())
-				queue = append(queue, typeQueue{Deref(f.Type), &fi, fi.Path})
-			}
-
-			fi.Index = apnd(tq.fi.Index, fieldPos)
-			fi.Parent = tq.fi
-			tq.fi.Children[fieldPos] = &fi
-			m = append(m, &fi)
-		}
-	}
-
-	flds := &StructMap{Index: m, Tree: root, Paths: map[string]*FieldInfo{}, Names: map[string]*FieldInfo{}}
-	for _, fi := range flds.Index {
-		flds.Paths[fi.Path] = fi
-		if fi.Name != "" && !fi.Embedded {
-			flds.Names[fi.Path] = fi
-		}
-	}
-
-	return flds
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/sqlx.go b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/sqlx.go
deleted file mode 100644
index 4859d5ac8..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/sqlx.go
+++ /dev/null
@@ -1,1035 +0,0 @@
-package sqlx
-
-import (
-	"database/sql"
-	"database/sql/driver"
-	"errors"
-	"fmt"
-
-	"io/ioutil"
-	"path/filepath"
-	"reflect"
-	"strings"
-	"sync"
-
-	"github.com/jmoiron/sqlx/reflectx"
-)
-
-// Although the NameMapper is convenient, in practice it should not
-// be relied on except for application code.  If you are writing a library
-// that uses sqlx, you should be aware that the name mappings you expect
-// can be overridden by your user's application.
-
-// NameMapper is used to map column names to struct field names.  By default,
-// it uses strings.ToLower to lowercase struct field names.  It can be set
-// to whatever you want, but it is encouraged to be set before sqlx is used
-// as name-to-field mappings are cached after first use on a type.
-var NameMapper = strings.ToLower
-var origMapper = reflect.ValueOf(NameMapper)
-
-// Rather than creating on init, this is created when necessary so that
-// importers have time to customize the NameMapper.
-var mpr *reflectx.Mapper
-
-// mprMu protects mpr.
-var mprMu sync.Mutex
-
-// mapper returns a valid mapper using the configured NameMapper func.
-func mapper() *reflectx.Mapper {
-	mprMu.Lock()
-	defer mprMu.Unlock()
-
-	if mpr == nil {
-		mpr = reflectx.NewMapperFunc("db", NameMapper)
-	} else if origMapper != reflect.ValueOf(NameMapper) {
-		// if NameMapper has changed, create a new mapper
-		mpr = reflectx.NewMapperFunc("db", NameMapper)
-		origMapper = reflect.ValueOf(NameMapper)
-	}
-	return mpr
-}
-
-// isScannable takes the reflect.Type and the actual dest value and returns
-// whether or not it's Scannable.  Something is scannable if:
-//   * it is not a struct
-//   * it implements sql.Scanner
-//   * it has no exported fields
-func isScannable(t reflect.Type) bool {
-	if reflect.PtrTo(t).Implements(_scannerInterface) {
-		return true
-	}
-	if t.Kind() != reflect.Struct {
-		return true
-	}
-
-	// it's not important that we use the right mapper for this particular object,
-	// we're only concerned on how many exported fields this struct has
-	m := mapper()
-	if len(m.TypeMap(t).Index) == 0 {
-		return true
-	}
-	return false
-}
-
-// ColScanner is an interface used by MapScan and SliceScan
-type ColScanner interface {
-	Columns() ([]string, error)
-	Scan(dest ...interface{}) error
-	Err() error
-}
-
-// Queryer is an interface used by Get and Select
-type Queryer interface {
-	Query(query string, args ...interface{}) (*sql.Rows, error)
-	Queryx(query string, args ...interface{}) (*Rows, error)
-	QueryRowx(query string, args ...interface{}) *Row
-}
-
-// Execer is an interface used by MustExec and LoadFile
-type Execer interface {
-	Exec(query string, args ...interface{}) (sql.Result, error)
-}
-
-// Binder is an interface for something which can bind queries (Tx, DB)
-type binder interface {
-	DriverName() string
-	Rebind(string) string
-	BindNamed(string, interface{}) (string, []interface{}, error)
-}
-
-// Ext is a union interface which can bind, query, and exec, used by
-// NamedQuery and NamedExec.
-type Ext interface {
-	binder
-	Queryer
-	Execer
-}
-
-// Preparer is an interface used by Preparex.
-type Preparer interface {
-	Prepare(query string) (*sql.Stmt, error)
-}
-
-// determine if any of our extensions are unsafe
-func isUnsafe(i interface{}) bool {
-	switch v := i.(type) {
-	case Row:
-		return v.unsafe
-	case *Row:
-		return v.unsafe
-	case Rows:
-		return v.unsafe
-	case *Rows:
-		return v.unsafe
-	case NamedStmt:
-		return v.Stmt.unsafe
-	case *NamedStmt:
-		return v.Stmt.unsafe
-	case Stmt:
-		return v.unsafe
-	case *Stmt:
-		return v.unsafe
-	case qStmt:
-		return v.unsafe
-	case *qStmt:
-		return v.unsafe
-	case DB:
-		return v.unsafe
-	case *DB:
-		return v.unsafe
-	case Tx:
-		return v.unsafe
-	case *Tx:
-		return v.unsafe
-	case sql.Rows, *sql.Rows:
-		return false
-	default:
-		return false
-	}
-}
-
-func mapperFor(i interface{}) *reflectx.Mapper {
-	switch i.(type) {
-	case DB:
-		return i.(DB).Mapper
-	case *DB:
-		return i.(*DB).Mapper
-	case Tx:
-		return i.(Tx).Mapper
-	case *Tx:
-		return i.(*Tx).Mapper
-	default:
-		return mapper()
-	}
-}
-
-var _scannerInterface = reflect.TypeOf((*sql.Scanner)(nil)).Elem()
-var _valuerInterface = reflect.TypeOf((*driver.Valuer)(nil)).Elem()
-
-// Row is a reimplementation of sql.Row in order to gain access to the underlying
-// sql.Rows.Columns() data, necessary for StructScan.
-type Row struct {
-	err    error
-	unsafe bool
-	rows   *sql.Rows
-	Mapper *reflectx.Mapper
-}
-
-// Scan is a fixed implementation of sql.Row.Scan, which does not discard the
-// underlying error from the internal rows object if it exists.
-func (r *Row) Scan(dest ...interface{}) error {
-	if r.err != nil {
-		return r.err
-	}
-
-	// TODO(bradfitz): for now we need to defensively clone all
-	// []byte that the driver returned (not permitting
-	// *RawBytes in Rows.Scan), since we're about to close
-	// the Rows in our defer, when we return from this function.
-	// the contract with the driver.Next(...) interface is that it
-	// can return slices into read-only temporary memory that's
-	// only valid until the next Scan/Close.  But the TODO is that
-	// for a lot of drivers, this copy will be unnecessary.  We
-	// should provide an optional interface for drivers to
-	// implement to say, "don't worry, the []bytes that I return
-	// from Next will not be modified again." (for instance, if
-	// they were obtained from the network anyway) But for now we
-	// don't care.
-	defer r.rows.Close()
-	for _, dp := range dest {
-		if _, ok := dp.(*sql.RawBytes); ok {
-			return errors.New("sql: RawBytes isn't allowed on Row.Scan")
-		}
-	}
-
-	if !r.rows.Next() {
-		if err := r.rows.Err(); err != nil {
-			return err
-		}
-		return sql.ErrNoRows
-	}
-	err := r.rows.Scan(dest...)
-	if err != nil {
-		return err
-	}
-	// Make sure the query can be processed to completion with no errors.
-	if err := r.rows.Close(); err != nil {
-		return err
-	}
-	return nil
-}
-
-// Columns returns the underlying sql.Rows.Columns(), or the deferred error usually
-// returned by Row.Scan()
-func (r *Row) Columns() ([]string, error) {
-	if r.err != nil {
-		return []string{}, r.err
-	}
-	return r.rows.Columns()
-}
-
-// Err returns the error encountered while scanning.
-func (r *Row) Err() error {
-	return r.err
-}
-
-// DB is a wrapper around sql.DB which keeps track of the driverName upon Open,
-// used mostly to automatically bind named queries using the right bindvars.
-type DB struct {
-	*sql.DB
-	driverName string
-	unsafe     bool
-	Mapper     *reflectx.Mapper
-}
-
-// NewDb returns a new sqlx DB wrapper for a pre-existing *sql.DB.  The
-// driverName of the original database is required for named query support.
-func NewDb(db *sql.DB, driverName string) *DB {
-	return &DB{DB: db, driverName: driverName, Mapper: mapper()}
-}
-
-// DriverName returns the driverName passed to the Open function for this DB.
-func (db *DB) DriverName() string {
-	return db.driverName
-}
-
-// Open is the same as sql.Open, but returns an *sqlx.DB instead.
-func Open(driverName, dataSourceName string) (*DB, error) {
-	db, err := sql.Open(driverName, dataSourceName)
-	if err != nil {
-		return nil, err
-	}
-	return &DB{DB: db, driverName: driverName, Mapper: mapper()}, err
-}
-
-// MustOpen is the same as sql.Open, but returns an *sqlx.DB instead and panics on error.
-func MustOpen(driverName, dataSourceName string) *DB {
-	db, err := Open(driverName, dataSourceName)
-	if err != nil {
-		panic(err)
-	}
-	return db
-}
-
-// MapperFunc sets a new mapper for this db using the default sqlx struct tag
-// and the provided mapper function.
-func (db *DB) MapperFunc(mf func(string) string) {
-	db.Mapper = reflectx.NewMapperFunc("db", mf)
-}
-
-// Rebind transforms a query from QUESTION to the DB driver's bindvar type.
-func (db *DB) Rebind(query string) string {
-	return Rebind(BindType(db.driverName), query)
-}
-
-// Unsafe returns a version of DB which will silently succeed to scan when
-// columns in the SQL result have no fields in the destination struct.
-// sqlx.Stmt and sqlx.Tx which are created from this DB will inherit its
-// safety behavior.
-func (db *DB) Unsafe() *DB {
-	return &DB{DB: db.DB, driverName: db.driverName, unsafe: true, Mapper: db.Mapper}
-}
-
-// BindNamed binds a query using the DB driver's bindvar type.
-func (db *DB) BindNamed(query string, arg interface{}) (string, []interface{}, error) {
-	return bindNamedMapper(BindType(db.driverName), query, arg, db.Mapper)
-}
-
-// NamedQuery using this DB.
-// Any named placeholder parameters are replaced with fields from arg.
-func (db *DB) NamedQuery(query string, arg interface{}) (*Rows, error) {
-	return NamedQuery(db, query, arg)
-}
-
-// NamedExec using this DB.
-// Any named placeholder parameters are replaced with fields from arg.
-func (db *DB) NamedExec(query string, arg interface{}) (sql.Result, error) {
-	return NamedExec(db, query, arg)
-}
-
-// Select using this DB.
-// Any placeholder parameters are replaced with supplied args.
-func (db *DB) Select(dest interface{}, query string, args ...interface{}) error {
-	return Select(db, dest, query, args...)
-}
-
-// Get using this DB.
-// Any placeholder parameters are replaced with supplied args.
-// An error is returned if the result set is empty.
-func (db *DB) Get(dest interface{}, query string, args ...interface{}) error {
-	return Get(db, dest, query, args...)
-}
-
-// MustBegin starts a transaction, and panics on error.  Returns an *sqlx.Tx instead
-// of an *sql.Tx.
-func (db *DB) MustBegin() *Tx {
-	tx, err := db.Beginx()
-	if err != nil {
-		panic(err)
-	}
-	return tx
-}
-
-// Beginx begins a transaction and returns an *sqlx.Tx instead of an *sql.Tx.
-func (db *DB) Beginx() (*Tx, error) {
-	tx, err := db.DB.Begin()
-	if err != nil {
-		return nil, err
-	}
-	return &Tx{Tx: tx, driverName: db.driverName, unsafe: db.unsafe, Mapper: db.Mapper}, err
-}
-
-// Queryx queries the database and returns an *sqlx.Rows.
-// Any placeholder parameters are replaced with supplied args.
-func (db *DB) Queryx(query string, args ...interface{}) (*Rows, error) {
-	r, err := db.DB.Query(query, args...)
-	if err != nil {
-		return nil, err
-	}
-	return &Rows{Rows: r, unsafe: db.unsafe, Mapper: db.Mapper}, err
-}
-
-// QueryRowx queries the database and returns an *sqlx.Row.
-// Any placeholder parameters are replaced with supplied args.
-func (db *DB) QueryRowx(query string, args ...interface{}) *Row {
-	rows, err := db.DB.Query(query, args...)
-	return &Row{rows: rows, err: err, unsafe: db.unsafe, Mapper: db.Mapper}
-}
-
-// MustExec (panic) runs MustExec using this database.
-// Any placeholder parameters are replaced with supplied args.
-func (db *DB) MustExec(query string, args ...interface{}) sql.Result {
-	return MustExec(db, query, args...)
-}
-
-// Preparex returns an sqlx.Stmt instead of a sql.Stmt
-func (db *DB) Preparex(query string) (*Stmt, error) {
-	return Preparex(db, query)
-}
-
-// PrepareNamed returns an sqlx.NamedStmt
-func (db *DB) PrepareNamed(query string) (*NamedStmt, error) {
-	return prepareNamed(db, query)
-}
-
-// Tx is an sqlx wrapper around sql.Tx with extra functionality
-type Tx struct {
-	*sql.Tx
-	driverName string
-	unsafe     bool
-	Mapper     *reflectx.Mapper
-}
-
-// DriverName returns the driverName used by the DB which began this transaction.
-func (tx *Tx) DriverName() string {
-	return tx.driverName
-}
-
-// Rebind a query within a transaction's bindvar type.
-func (tx *Tx) Rebind(query string) string {
-	return Rebind(BindType(tx.driverName), query)
-}
-
-// Unsafe returns a version of Tx which will silently succeed to scan when
-// columns in the SQL result have no fields in the destination struct.
-func (tx *Tx) Unsafe() *Tx {
-	return &Tx{Tx: tx.Tx, driverName: tx.driverName, unsafe: true, Mapper: tx.Mapper}
-}
-
-// BindNamed binds a query within a transaction's bindvar type.
-func (tx *Tx) BindNamed(query string, arg interface{}) (string, []interface{}, error) {
-	return bindNamedMapper(BindType(tx.driverName), query, arg, tx.Mapper)
-}
-
-// NamedQuery within a transaction.
-// Any named placeholder parameters are replaced with fields from arg.
-func (tx *Tx) NamedQuery(query string, arg interface{}) (*Rows, error) {
-	return NamedQuery(tx, query, arg)
-}
-
-// NamedExec a named query within a transaction.
-// Any named placeholder parameters are replaced with fields from arg.
-func (tx *Tx) NamedExec(query string, arg interface{}) (sql.Result, error) {
-	return NamedExec(tx, query, arg)
-}
-
-// Select within a transaction.
-// Any placeholder parameters are replaced with supplied args.
-func (tx *Tx) Select(dest interface{}, query string, args ...interface{}) error {
-	return Select(tx, dest, query, args...)
-}
-
-// Queryx within a transaction.
-// Any placeholder parameters are replaced with supplied args.
-func (tx *Tx) Queryx(query string, args ...interface{}) (*Rows, error) {
-	r, err := tx.Tx.Query(query, args...)
-	if err != nil {
-		return nil, err
-	}
-	return &Rows{Rows: r, unsafe: tx.unsafe, Mapper: tx.Mapper}, err
-}
-
-// QueryRowx within a transaction.
-// Any placeholder parameters are replaced with supplied args.
-func (tx *Tx) QueryRowx(query string, args ...interface{}) *Row {
-	rows, err := tx.Tx.Query(query, args...)
-	return &Row{rows: rows, err: err, unsafe: tx.unsafe, Mapper: tx.Mapper}
-}
-
-// Get within a transaction.
-// Any placeholder parameters are replaced with supplied args.
-// An error is returned if the result set is empty.
-func (tx *Tx) Get(dest interface{}, query string, args ...interface{}) error {
-	return Get(tx, dest, query, args...)
-}
-
-// MustExec runs MustExec within a transaction.
-// Any placeholder parameters are replaced with supplied args.
-func (tx *Tx) MustExec(query string, args ...interface{}) sql.Result {
-	return MustExec(tx, query, args...)
-}
-
-// Preparex  a statement within a transaction.
-func (tx *Tx) Preparex(query string) (*Stmt, error) {
-	return Preparex(tx, query)
-}
-
-// Stmtx returns a version of the prepared statement which runs within a transaction.  Provided
-// stmt can be either *sql.Stmt or *sqlx.Stmt.
-func (tx *Tx) Stmtx(stmt interface{}) *Stmt {
-	var s *sql.Stmt
-	switch v := stmt.(type) {
-	case Stmt:
-		s = v.Stmt
-	case *Stmt:
-		s = v.Stmt
-	case sql.Stmt:
-		s = &v
-	case *sql.Stmt:
-		s = v
-	default:
-		panic(fmt.Sprintf("non-statement type %v passed to Stmtx", reflect.ValueOf(stmt).Type()))
-	}
-	return &Stmt{Stmt: tx.Stmt(s), Mapper: tx.Mapper}
-}
-
-// NamedStmt returns a version of the prepared statement which runs within a transaction.
-func (tx *Tx) NamedStmt(stmt *NamedStmt) *NamedStmt {
-	return &NamedStmt{
-		QueryString: stmt.QueryString,
-		Params:      stmt.Params,
-		Stmt:        tx.Stmtx(stmt.Stmt),
-	}
-}
-
-// PrepareNamed returns an sqlx.NamedStmt
-func (tx *Tx) PrepareNamed(query string) (*NamedStmt, error) {
-	return prepareNamed(tx, query)
-}
-
-// Stmt is an sqlx wrapper around sql.Stmt with extra functionality
-type Stmt struct {
-	*sql.Stmt
-	unsafe bool
-	Mapper *reflectx.Mapper
-}
-
-// Unsafe returns a version of Stmt which will silently succeed to scan when
-// columns in the SQL result have no fields in the destination struct.
-func (s *Stmt) Unsafe() *Stmt {
-	return &Stmt{Stmt: s.Stmt, unsafe: true, Mapper: s.Mapper}
-}
-
-// Select using the prepared statement.
-// Any placeholder parameters are replaced with supplied args.
-func (s *Stmt) Select(dest interface{}, args ...interface{}) error {
-	return Select(&qStmt{s}, dest, "", args...)
-}
-
-// Get using the prepared statement.
-// Any placeholder parameters are replaced with supplied args.
-// An error is returned if the result set is empty.
-func (s *Stmt) Get(dest interface{}, args ...interface{}) error {
-	return Get(&qStmt{s}, dest, "", args...)
-}
-
-// MustExec (panic) using this statement.  Note that the query portion of the error
-// output will be blank, as Stmt does not expose its query.
-// Any placeholder parameters are replaced with supplied args.
-func (s *Stmt) MustExec(args ...interface{}) sql.Result {
-	return MustExec(&qStmt{s}, "", args...)
-}
-
-// QueryRowx using this statement.
-// Any placeholder parameters are replaced with supplied args.
-func (s *Stmt) QueryRowx(args ...interface{}) *Row {
-	qs := &qStmt{s}
-	return qs.QueryRowx("", args...)
-}
-
-// Queryx using this statement.
-// Any placeholder parameters are replaced with supplied args.
-func (s *Stmt) Queryx(args ...interface{}) (*Rows, error) {
-	qs := &qStmt{s}
-	return qs.Queryx("", args...)
-}
-
-// qStmt is an unexposed wrapper which lets you use a Stmt as a Queryer & Execer by
-// implementing those interfaces and ignoring the `query` argument.
-type qStmt struct{ *Stmt }
-
-func (q *qStmt) Query(query string, args ...interface{}) (*sql.Rows, error) {
-	return q.Stmt.Query(args...)
-}
-
-func (q *qStmt) Queryx(query string, args ...interface{}) (*Rows, error) {
-	r, err := q.Stmt.Query(args...)
-	if err != nil {
-		return nil, err
-	}
-	return &Rows{Rows: r, unsafe: q.Stmt.unsafe, Mapper: q.Stmt.Mapper}, err
-}
-
-func (q *qStmt) QueryRowx(query string, args ...interface{}) *Row {
-	rows, err := q.Stmt.Query(args...)
-	return &Row{rows: rows, err: err, unsafe: q.Stmt.unsafe, Mapper: q.Stmt.Mapper}
-}
-
-func (q *qStmt) Exec(query string, args ...interface{}) (sql.Result, error) {
-	return q.Stmt.Exec(args...)
-}
-
-// Rows is a wrapper around sql.Rows which caches costly reflect operations
-// during a looped StructScan
-type Rows struct {
-	*sql.Rows
-	unsafe bool
-	Mapper *reflectx.Mapper
-	// these fields cache memory use for a rows during iteration w/ structScan
-	started bool
-	fields  [][]int
-	values  []interface{}
-}
-
-// SliceScan using this Rows.
-func (r *Rows) SliceScan() ([]interface{}, error) {
-	return SliceScan(r)
-}
-
-// MapScan using this Rows.
-func (r *Rows) MapScan(dest map[string]interface{}) error {
-	return MapScan(r, dest)
-}
-
-// StructScan is like sql.Rows.Scan, but scans a single Row into a single Struct.
-// Use this and iterate over Rows manually when the memory load of Select() might be
-// prohibitive.  *Rows.StructScan caches the reflect work of matching up column
-// positions to fields to avoid that overhead per scan, which means it is not safe
-// to run StructScan on the same Rows instance with different struct types.
-func (r *Rows) StructScan(dest interface{}) error {
-	v := reflect.ValueOf(dest)
-
-	if v.Kind() != reflect.Ptr {
-		return errors.New("must pass a pointer, not a value, to StructScan destination")
-	}
-
-	v = reflect.Indirect(v)
-
-	if !r.started {
-		columns, err := r.Columns()
-		if err != nil {
-			return err
-		}
-		m := r.Mapper
-
-		r.fields = m.TraversalsByName(v.Type(), columns)
-		// if we are not unsafe and are missing fields, return an error
-		if f, err := missingFields(r.fields); err != nil && !r.unsafe {
-			return fmt.Errorf("missing destination name %s in %T", columns[f], dest)
-		}
-		r.values = make([]interface{}, len(columns))
-		r.started = true
-	}
-
-	err := fieldsByTraversal(v, r.fields, r.values, true)
-	if err != nil {
-		return err
-	}
-	// scan into the struct field pointers and append to our results
-	err = r.Scan(r.values...)
-	if err != nil {
-		return err
-	}
-	return r.Err()
-}
-
-// Connect to a database and verify with a ping.
-func Connect(driverName, dataSourceName string) (*DB, error) {
-	db, err := Open(driverName, dataSourceName)
-	if err != nil {
-		return db, err
-	}
-	err = db.Ping()
-	return db, err
-}
-
-// MustConnect connects to a database and panics on error.
-func MustConnect(driverName, dataSourceName string) *DB {
-	db, err := Connect(driverName, dataSourceName)
-	if err != nil {
-		panic(err)
-	}
-	return db
-}
-
-// Preparex prepares a statement.
-func Preparex(p Preparer, query string) (*Stmt, error) {
-	s, err := p.Prepare(query)
-	if err != nil {
-		return nil, err
-	}
-	return &Stmt{Stmt: s, unsafe: isUnsafe(p), Mapper: mapperFor(p)}, err
-}
-
-// Select executes a query using the provided Queryer, and StructScans each row
-// into dest, which must be a slice.  If the slice elements are scannable, then
-// the result set must have only one column.  Otherwise, StructScan is used.
-// The *sql.Rows are closed automatically.
-// Any placeholder parameters are replaced with supplied args.
-func Select(q Queryer, dest interface{}, query string, args ...interface{}) error {
-	rows, err := q.Queryx(query, args...)
-	if err != nil {
-		return err
-	}
-	// if something happens here, we want to make sure the rows are Closed
-	defer rows.Close()
-	return scanAll(rows, dest, false)
-}
-
-// Get does a QueryRow using the provided Queryer, and scans the resulting row
-// to dest.  If dest is scannable, the result must only have one column.  Otherwise,
-// StructScan is used.  Get will return sql.ErrNoRows like row.Scan would.
-// Any placeholder parameters are replaced with supplied args.
-// An error is returned if the result set is empty.
-func Get(q Queryer, dest interface{}, query string, args ...interface{}) error {
-	r := q.QueryRowx(query, args...)
-	return r.scanAny(dest, false)
-}
-
-// LoadFile exec's every statement in a file (as a single call to Exec).
-// LoadFile may return a nil *sql.Result if errors are encountered locating or
-// reading the file at path.  LoadFile reads the entire file into memory, so it
-// is not suitable for loading large data dumps, but can be useful for initializing
-// schemas or loading indexes.
-//
-// FIXME: this does not really work with multi-statement files for mattn/go-sqlite3
-// or the go-mysql-driver/mysql drivers;  pq seems to be an exception here.  Detecting
-// this by requiring something with DriverName() and then attempting to split the
-// queries will be difficult to get right, and its current driver-specific behavior
-// is deemed at least not complex in its incorrectness.
-func LoadFile(e Execer, path string) (*sql.Result, error) {
-	realpath, err := filepath.Abs(path)
-	if err != nil {
-		return nil, err
-	}
-	contents, err := ioutil.ReadFile(realpath)
-	if err != nil {
-		return nil, err
-	}
-	res, err := e.Exec(string(contents))
-	return &res, err
-}
-
-// MustExec execs the query using e and panics if there was an error.
-// Any placeholder parameters are replaced with supplied args.
-func MustExec(e Execer, query string, args ...interface{}) sql.Result {
-	res, err := e.Exec(query, args...)
-	if err != nil {
-		panic(err)
-	}
-	return res
-}
-
-// SliceScan using this Rows.
-func (r *Row) SliceScan() ([]interface{}, error) {
-	return SliceScan(r)
-}
-
-// MapScan using this Rows.
-func (r *Row) MapScan(dest map[string]interface{}) error {
-	return MapScan(r, dest)
-}
-
-func (r *Row) scanAny(dest interface{}, structOnly bool) error {
-	if r.err != nil {
-		return r.err
-	}
-	if r.rows == nil {
-		r.err = sql.ErrNoRows
-		return r.err
-	}
-	defer r.rows.Close()
-
-	v := reflect.ValueOf(dest)
-	if v.Kind() != reflect.Ptr {
-		return errors.New("must pass a pointer, not a value, to StructScan destination")
-	}
-	if v.IsNil() {
-		return errors.New("nil pointer passed to StructScan destination")
-	}
-
-	base := reflectx.Deref(v.Type())
-	scannable := isScannable(base)
-
-	if structOnly && scannable {
-		return structOnlyError(base)
-	}
-
-	columns, err := r.Columns()
-	if err != nil {
-		return err
-	}
-
-	if scannable && len(columns) > 1 {
-		return fmt.Errorf("scannable dest type %s with >1 columns (%d) in result", base.Kind(), len(columns))
-	}
-
-	if scannable {
-		return r.Scan(dest)
-	}
-
-	m := r.Mapper
-
-	fields := m.TraversalsByName(v.Type(), columns)
-	// if we are not unsafe and are missing fields, return an error
-	if f, err := missingFields(fields); err != nil && !r.unsafe {
-		return fmt.Errorf("missing destination name %s in %T", columns[f], dest)
-	}
-	values := make([]interface{}, len(columns))
-
-	err = fieldsByTraversal(v, fields, values, true)
-	if err != nil {
-		return err
-	}
-	// scan into the struct field pointers and append to our results
-	return r.Scan(values...)
-}
-
-// StructScan a single Row into dest.
-func (r *Row) StructScan(dest interface{}) error {
-	return r.scanAny(dest, true)
-}
-
-// SliceScan a row, returning a []interface{} with values similar to MapScan.
-// This function is primarily intended for use where the number of columns
-// is not known.  Because you can pass an []interface{} directly to Scan,
-// it's recommended that you do that as it will not have to allocate new
-// slices per row.
-func SliceScan(r ColScanner) ([]interface{}, error) {
-	// ignore r.started, since we needn't use reflect for anything.
-	columns, err := r.Columns()
-	if err != nil {
-		return []interface{}{}, err
-	}
-
-	values := make([]interface{}, len(columns))
-	for i := range values {
-		values[i] = new(interface{})
-	}
-
-	err = r.Scan(values...)
-
-	if err != nil {
-		return values, err
-	}
-
-	for i := range columns {
-		values[i] = *(values[i].(*interface{}))
-	}
-
-	return values, r.Err()
-}
-
-// MapScan scans a single Row into the dest map[string]interface{}.
-// Use this to get results for SQL that might not be under your control
-// (for instance, if you're building an interface for an SQL server that
-// executes SQL from input).  Please do not use this as a primary interface!
-// This will modify the map sent to it in place, so reuse the same map with
-// care.  Columns which occur more than once in the result will overwrite
-// each other!
-func MapScan(r ColScanner, dest map[string]interface{}) error {
-	// ignore r.started, since we needn't use reflect for anything.
-	columns, err := r.Columns()
-	if err != nil {
-		return err
-	}
-
-	values := make([]interface{}, len(columns))
-	for i := range values {
-		values[i] = new(interface{})
-	}
-
-	err = r.Scan(values...)
-	if err != nil {
-		return err
-	}
-
-	for i, column := range columns {
-		dest[column] = *(values[i].(*interface{}))
-	}
-
-	return r.Err()
-}
-
-type rowsi interface {
-	Close() error
-	Columns() ([]string, error)
-	Err() error
-	Next() bool
-	Scan(...interface{}) error
-}
-
-// structOnlyError returns an error appropriate for type when a non-scannable
-// struct is expected but something else is given
-func structOnlyError(t reflect.Type) error {
-	isStruct := t.Kind() == reflect.Struct
-	isScanner := reflect.PtrTo(t).Implements(_scannerInterface)
-	if !isStruct {
-		return fmt.Errorf("expected %s but got %s", reflect.Struct, t.Kind())
-	}
-	if isScanner {
-		return fmt.Errorf("structscan expects a struct dest but the provided struct type %s implements scanner", t.Name())
-	}
-	return fmt.Errorf("expected a struct, but struct %s has no exported fields", t.Name())
-}
-
-// scanAll scans all rows into a destination, which must be a slice of any
-// type.  If the destination slice type is a Struct, then StructScan will be
-// used on each row.  If the destination is some other kind of base type, then
-// each row must only have one column which can scan into that type.  This
-// allows you to do something like:
-//
-//    rows, _ := db.Query("select id from people;")
-//    var ids []int
-//    scanAll(rows, &ids, false)
-//
-// and ids will be a list of the id results.  I realize that this is a desirable
-// interface to expose to users, but for now it will only be exposed via changes
-// to `Get` and `Select`.  The reason that this has been implemented like this is
-// this is the only way to not duplicate reflect work in the new API while
-// maintaining backwards compatibility.
-func scanAll(rows rowsi, dest interface{}, structOnly bool) error {
-	var v, vp reflect.Value
-
-	value := reflect.ValueOf(dest)
-
-	// json.Unmarshal returns errors for these
-	if value.Kind() != reflect.Ptr {
-		return errors.New("must pass a pointer, not a value, to StructScan destination")
-	}
-	if value.IsNil() {
-		return errors.New("nil pointer passed to StructScan destination")
-	}
-	direct := reflect.Indirect(value)
-
-	slice, err := baseType(value.Type(), reflect.Slice)
-	if err != nil {
-		return err
-	}
-
-	isPtr := slice.Elem().Kind() == reflect.Ptr
-	base := reflectx.Deref(slice.Elem())
-	scannable := isScannable(base)
-
-	if structOnly && scannable {
-		return structOnlyError(base)
-	}
-
-	columns, err := rows.Columns()
-	if err != nil {
-		return err
-	}
-
-	// if it's a base type make sure it only has 1 column;  if not return an error
-	if scannable && len(columns) > 1 {
-		return fmt.Errorf("non-struct dest type %s with >1 columns (%d)", base.Kind(), len(columns))
-	}
-
-	if !scannable {
-		var values []interface{}
-		var m *reflectx.Mapper
-
-		switch rows.(type) {
-		case *Rows:
-			m = rows.(*Rows).Mapper
-		default:
-			m = mapper()
-		}
-
-		fields := m.TraversalsByName(base, columns)
-		// if we are not unsafe and are missing fields, return an error
-		if f, err := missingFields(fields); err != nil && !isUnsafe(rows) {
-			return fmt.Errorf("missing destination name %s in %T", columns[f], dest)
-		}
-		values = make([]interface{}, len(columns))
-
-		for rows.Next() {
-			// create a new struct type (which returns PtrTo) and indirect it
-			vp = reflect.New(base)
-			v = reflect.Indirect(vp)
-
-			err = fieldsByTraversal(v, fields, values, true)
-			if err != nil {
-				return err
-			}
-
-			// scan into the struct field pointers and append to our results
-			err = rows.Scan(values...)
-			if err != nil {
-				return err
-			}
-
-			if isPtr {
-				direct.Set(reflect.Append(direct, vp))
-			} else {
-				direct.Set(reflect.Append(direct, v))
-			}
-		}
-	} else {
-		for rows.Next() {
-			vp = reflect.New(base)
-			err = rows.Scan(vp.Interface())
-			if err != nil {
-				return err
-			}
-			// append
-			if isPtr {
-				direct.Set(reflect.Append(direct, vp))
-			} else {
-				direct.Set(reflect.Append(direct, reflect.Indirect(vp)))
-			}
-		}
-	}
-
-	return rows.Err()
-}
-
-// FIXME: StructScan was the very first bit of API in sqlx, and now unfortunately
-// it doesn't really feel like it's named properly.  There is an incongruency
-// between this and the way that StructScan (which might better be ScanStruct
-// anyway) works on a rows object.
-
-// StructScan all rows from an sql.Rows or an sqlx.Rows into the dest slice.
-// StructScan will scan in the entire rows result, so if you do not want to
-// allocate structs for the entire result, use Queryx and see sqlx.Rows.StructScan.
-// If rows is sqlx.Rows, it will use its mapper, otherwise it will use the default.
-func StructScan(rows rowsi, dest interface{}) error {
-	return scanAll(rows, dest, true)
-
-}
-
-// reflect helpers
-
-func baseType(t reflect.Type, expected reflect.Kind) (reflect.Type, error) {
-	t = reflectx.Deref(t)
-	if t.Kind() != expected {
-		return nil, fmt.Errorf("expected %s but got %s", expected, t.Kind())
-	}
-	return t, nil
-}
-
-// fieldsByName fills a values interface with fields from the passed value based
-// on the traversals in int.  If ptrs is true, return addresses instead of values.
-// We write this instead of using FieldsByName to save allocations and map lookups
-// when iterating over many rows.  Empty traversals will get an interface pointer.
-// Because of the necessity of requesting ptrs or values, it's considered a bit too
-// specialized for inclusion in reflectx itself.
-func fieldsByTraversal(v reflect.Value, traversals [][]int, values []interface{}, ptrs bool) error {
-	v = reflect.Indirect(v)
-	if v.Kind() != reflect.Struct {
-		return errors.New("argument not a struct")
-	}
-
-	for i, traversal := range traversals {
-		if len(traversal) == 0 {
-			values[i] = new(interface{})
-			continue
-		}
-		f := reflectx.FieldByIndexes(v, traversal)
-		if ptrs {
-			values[i] = f.Addr().Interface()
-		} else {
-			values[i] = f.Interface()
-		}
-	}
-	return nil
-}
-
-func missingFields(transversals [][]int) (field int, err error) {
-	for i, t := range transversals {
-		if len(t) == 0 {
-			return i, errors.New("missing field")
-		}
-	}
-	return 0, nil
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/sqlx_context.go b/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/sqlx_context.go
deleted file mode 100644
index 0b1714514..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/jmoiron/sqlx/sqlx_context.go
+++ /dev/null
@@ -1,335 +0,0 @@
-// +build go1.8
-
-package sqlx
-
-import (
-	"context"
-	"database/sql"
-	"fmt"
-	"io/ioutil"
-	"path/filepath"
-	"reflect"
-)
-
-// ConnectContext to a database and verify with a ping.
-func ConnectContext(ctx context.Context, driverName, dataSourceName string) (*DB, error) {
-	db, err := Open(driverName, dataSourceName)
-	if err != nil {
-		return db, err
-	}
-	err = db.PingContext(ctx)
-	return db, err
-}
-
-// QueryerContext is an interface used by GetContext and SelectContext
-type QueryerContext interface {
-	QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
-	QueryxContext(ctx context.Context, query string, args ...interface{}) (*Rows, error)
-	QueryRowxContext(ctx context.Context, query string, args ...interface{}) *Row
-}
-
-// PreparerContext is an interface used by PreparexContext.
-type PreparerContext interface {
-	PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
-}
-
-// ExecerContext is an interface used by MustExecContext and LoadFileContext
-type ExecerContext interface {
-	ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
-}
-
-// ExtContext is a union interface which can bind, query, and exec, with Context
-// used by NamedQueryContext and NamedExecContext.
-type ExtContext interface {
-	binder
-	QueryerContext
-	ExecerContext
-}
-
-// SelectContext executes a query using the provided Queryer, and StructScans
-// each row into dest, which must be a slice.  If the slice elements are
-// scannable, then the result set must have only one column.  Otherwise,
-// StructScan is used. The *sql.Rows are closed automatically.
-// Any placeholder parameters are replaced with supplied args.
-func SelectContext(ctx context.Context, q QueryerContext, dest interface{}, query string, args ...interface{}) error {
-	rows, err := q.QueryxContext(ctx, query, args...)
-	if err != nil {
-		return err
-	}
-	// if something happens here, we want to make sure the rows are Closed
-	defer rows.Close()
-	return scanAll(rows, dest, false)
-}
-
-// PreparexContext prepares a statement.
-//
-// The provided context is used for the preparation of the statement, not for
-// the execution of the statement.
-func PreparexContext(ctx context.Context, p PreparerContext, query string) (*Stmt, error) {
-	s, err := p.PrepareContext(ctx, query)
-	if err != nil {
-		return nil, err
-	}
-	return &Stmt{Stmt: s, unsafe: isUnsafe(p), Mapper: mapperFor(p)}, err
-}
-
-// GetContext does a QueryRow using the provided Queryer, and scans the
-// resulting row to dest.  If dest is scannable, the result must only have one
-// column. Otherwise, StructScan is used.  Get will return sql.ErrNoRows like
-// row.Scan would. Any placeholder parameters are replaced with supplied args.
-// An error is returned if the result set is empty.
-func GetContext(ctx context.Context, q QueryerContext, dest interface{}, query string, args ...interface{}) error {
-	r := q.QueryRowxContext(ctx, query, args...)
-	return r.scanAny(dest, false)
-}
-
-// LoadFileContext exec's every statement in a file (as a single call to Exec).
-// LoadFileContext may return a nil *sql.Result if errors are encountered
-// locating or reading the file at path.  LoadFile reads the entire file into
-// memory, so it is not suitable for loading large data dumps, but can be useful
-// for initializing schemas or loading indexes.
-//
-// FIXME: this does not really work with multi-statement files for mattn/go-sqlite3
-// or the go-mysql-driver/mysql drivers;  pq seems to be an exception here.  Detecting
-// this by requiring something with DriverName() and then attempting to split the
-// queries will be difficult to get right, and its current driver-specific behavior
-// is deemed at least not complex in its incorrectness.
-func LoadFileContext(ctx context.Context, e ExecerContext, path string) (*sql.Result, error) {
-	realpath, err := filepath.Abs(path)
-	if err != nil {
-		return nil, err
-	}
-	contents, err := ioutil.ReadFile(realpath)
-	if err != nil {
-		return nil, err
-	}
-	res, err := e.ExecContext(ctx, string(contents))
-	return &res, err
-}
-
-// MustExecContext execs the query using e and panics if there was an error.
-// Any placeholder parameters are replaced with supplied args.
-func MustExecContext(ctx context.Context, e ExecerContext, query string, args ...interface{}) sql.Result {
-	res, err := e.ExecContext(ctx, query, args...)
-	if err != nil {
-		panic(err)
-	}
-	return res
-}
-
-// PrepareNamedContext returns an sqlx.NamedStmt
-func (db *DB) PrepareNamedContext(ctx context.Context, query string) (*NamedStmt, error) {
-	return prepareNamedContext(ctx, db, query)
-}
-
-// NamedQueryContext using this DB.
-// Any named placeholder parameters are replaced with fields from arg.
-func (db *DB) NamedQueryContext(ctx context.Context, query string, arg interface{}) (*Rows, error) {
-	return NamedQueryContext(ctx, db, query, arg)
-}
-
-// NamedExecContext using this DB.
-// Any named placeholder parameters are replaced with fields from arg.
-func (db *DB) NamedExecContext(ctx context.Context, query string, arg interface{}) (sql.Result, error) {
-	return NamedExecContext(ctx, db, query, arg)
-}
-
-// SelectContext using this DB.
-// Any placeholder parameters are replaced with supplied args.
-func (db *DB) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
-	return SelectContext(ctx, db, dest, query, args...)
-}
-
-// GetContext using this DB.
-// Any placeholder parameters are replaced with supplied args.
-// An error is returned if the result set is empty.
-func (db *DB) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
-	return GetContext(ctx, db, dest, query, args...)
-}
-
-// PreparexContext returns an sqlx.Stmt instead of a sql.Stmt.
-//
-// The provided context is used for the preparation of the statement, not for
-// the execution of the statement.
-func (db *DB) PreparexContext(ctx context.Context, query string) (*Stmt, error) {
-	return PreparexContext(ctx, db, query)
-}
-
-// QueryxContext queries the database and returns an *sqlx.Rows.
-// Any placeholder parameters are replaced with supplied args.
-func (db *DB) QueryxContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) {
-	r, err := db.DB.QueryContext(ctx, query, args...)
-	if err != nil {
-		return nil, err
-	}
-	return &Rows{Rows: r, unsafe: db.unsafe, Mapper: db.Mapper}, err
-}
-
-// QueryRowxContext queries the database and returns an *sqlx.Row.
-// Any placeholder parameters are replaced with supplied args.
-func (db *DB) QueryRowxContext(ctx context.Context, query string, args ...interface{}) *Row {
-	rows, err := db.DB.QueryContext(ctx, query, args...)
-	return &Row{rows: rows, err: err, unsafe: db.unsafe, Mapper: db.Mapper}
-}
-
-// MustBeginTx starts a transaction, and panics on error.  Returns an *sqlx.Tx instead
-// of an *sql.Tx.
-//
-// The provided context is used until the transaction is committed or rolled
-// back. If the context is canceled, the sql package will roll back the
-// transaction. Tx.Commit will return an error if the context provided to
-// MustBeginContext is canceled.
-func (db *DB) MustBeginTx(ctx context.Context, opts *sql.TxOptions) *Tx {
-	tx, err := db.BeginTxx(ctx, opts)
-	if err != nil {
-		panic(err)
-	}
-	return tx
-}
-
-// MustExecContext (panic) runs MustExec using this database.
-// Any placeholder parameters are replaced with supplied args.
-func (db *DB) MustExecContext(ctx context.Context, query string, args ...interface{}) sql.Result {
-	return MustExecContext(ctx, db, query, args...)
-}
-
-// BeginTxx begins a transaction and returns an *sqlx.Tx instead of an
-// *sql.Tx.
-//
-// The provided context is used until the transaction is committed or rolled
-// back. If the context is canceled, the sql package will roll back the
-// transaction. Tx.Commit will return an error if the context provided to
-// BeginxContext is canceled.
-func (db *DB) BeginTxx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) {
-	tx, err := db.DB.BeginTx(ctx, opts)
-	if err != nil {
-		return nil, err
-	}
-	return &Tx{Tx: tx, driverName: db.driverName, unsafe: db.unsafe, Mapper: db.Mapper}, err
-}
-
-// StmtxContext returns a version of the prepared statement which runs within a
-// transaction. Provided stmt can be either *sql.Stmt or *sqlx.Stmt.
-func (tx *Tx) StmtxContext(ctx context.Context, stmt interface{}) *Stmt {
-	var s *sql.Stmt
-	switch v := stmt.(type) {
-	case Stmt:
-		s = v.Stmt
-	case *Stmt:
-		s = v.Stmt
-	case sql.Stmt:
-		s = &v
-	case *sql.Stmt:
-		s = v
-	default:
-		panic(fmt.Sprintf("non-statement type %v passed to Stmtx", reflect.ValueOf(stmt).Type()))
-	}
-	return &Stmt{Stmt: tx.StmtContext(ctx, s), Mapper: tx.Mapper}
-}
-
-// NamedStmtContext returns a version of the prepared statement which runs
-// within a transaction.
-func (tx *Tx) NamedStmtContext(ctx context.Context, stmt *NamedStmt) *NamedStmt {
-	return &NamedStmt{
-		QueryString: stmt.QueryString,
-		Params:      stmt.Params,
-		Stmt:        tx.StmtxContext(ctx, stmt.Stmt),
-	}
-}
-
-// MustExecContext runs MustExecContext within a transaction.
-// Any placeholder parameters are replaced with supplied args.
-func (tx *Tx) MustExecContext(ctx context.Context, query string, args ...interface{}) sql.Result {
-	return MustExecContext(ctx, tx, query, args...)
-}
-
-// QueryxContext within a transaction and context.
-// Any placeholder parameters are replaced with supplied args.
-func (tx *Tx) QueryxContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) {
-	r, err := tx.Tx.QueryContext(ctx, query, args...)
-	if err != nil {
-		return nil, err
-	}
-	return &Rows{Rows: r, unsafe: tx.unsafe, Mapper: tx.Mapper}, err
-}
-
-// SelectContext within a transaction and context.
-// Any placeholder parameters are replaced with supplied args.
-func (tx *Tx) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
-	return SelectContext(ctx, tx, dest, query, args...)
-}
-
-// GetContext within a transaction and context.
-// Any placeholder parameters are replaced with supplied args.
-// An error is returned if the result set is empty.
-func (tx *Tx) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
-	return GetContext(ctx, tx, dest, query, args...)
-}
-
-// QueryRowxContext within a transaction and context.
-// Any placeholder parameters are replaced with supplied args.
-func (tx *Tx) QueryRowxContext(ctx context.Context, query string, args ...interface{}) *Row {
-	rows, err := tx.Tx.QueryContext(ctx, query, args...)
-	return &Row{rows: rows, err: err, unsafe: tx.unsafe, Mapper: tx.Mapper}
-}
-
-// NamedExecContext using this Tx.
-// Any named placeholder parameters are replaced with fields from arg.
-func (tx *Tx) NamedExecContext(ctx context.Context, query string, arg interface{}) (sql.Result, error) {
-	return NamedExecContext(ctx, tx, query, arg)
-}
-
-// SelectContext using the prepared statement.
-// Any placeholder parameters are replaced with supplied args.
-func (s *Stmt) SelectContext(ctx context.Context, dest interface{}, args ...interface{}) error {
-	return SelectContext(ctx, &qStmt{s}, dest, "", args...)
-}
-
-// GetContext using the prepared statement.
-// Any placeholder parameters are replaced with supplied args.
-// An error is returned if the result set is empty.
-func (s *Stmt) GetContext(ctx context.Context, dest interface{}, args ...interface{}) error {
-	return GetContext(ctx, &qStmt{s}, dest, "", args...)
-}
-
-// MustExecContext (panic) using this statement.  Note that the query portion of
-// the error output will be blank, as Stmt does not expose its query.
-// Any placeholder parameters are replaced with supplied args.
-func (s *Stmt) MustExecContext(ctx context.Context, args ...interface{}) sql.Result {
-	return MustExecContext(ctx, &qStmt{s}, "", args...)
-}
-
-// QueryRowxContext using this statement.
-// Any placeholder parameters are replaced with supplied args.
-func (s *Stmt) QueryRowxContext(ctx context.Context, args ...interface{}) *Row {
-	qs := &qStmt{s}
-	return qs.QueryRowxContext(ctx, "", args...)
-}
-
-// QueryxContext using this statement.
-// Any placeholder parameters are replaced with supplied args.
-func (s *Stmt) QueryxContext(ctx context.Context, args ...interface{}) (*Rows, error) {
-	qs := &qStmt{s}
-	return qs.QueryxContext(ctx, "", args...)
-}
-
-func (q *qStmt) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
-	return q.Stmt.QueryContext(ctx, args...)
-}
-
-func (q *qStmt) QueryxContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) {
-	r, err := q.Stmt.QueryContext(ctx, args...)
-	if err != nil {
-		return nil, err
-	}
-	return &Rows{Rows: r, unsafe: q.Stmt.unsafe, Mapper: q.Stmt.Mapper}, err
-}
-
-func (q *qStmt) QueryRowxContext(ctx context.Context, query string, args ...interface{}) *Row {
-	rows, err := q.Stmt.QueryContext(ctx, args...)
-	return &Row{rows: rows, err: err, unsafe: q.Stmt.unsafe, Mapper: q.Stmt.Mapper}
-}
-
-func (q *qStmt) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {
-	return q.Stmt.ExecContext(ctx, args...)
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lestrrat/go-jwx/.travis.yml b/traffic_ops/traffic_ops_golang/vendor/github.com/lestrrat/go-jwx/.travis.yml
deleted file mode 100644
index 4f50fe0d8..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lestrrat/go-jwx/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: go
-sudo: false
-go:
-    - 1.7.x
-    - tip
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/.travis.sh b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/.travis.sh
deleted file mode 100755
index ebf447030..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/.travis.sh
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/bash
-
-set -eu
-
-client_configure() {
-	sudo chmod 600 $PQSSLCERTTEST_PATH/postgresql.key
-}
-
-pgdg_repository() {
-	local sourcelist='sources.list.d/postgresql.list'
-
-	curl -sS 'https://www.postgresql.org/media/keys/ACCC4CF8.asc' | sudo apt-key add -
-	echo deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main $PGVERSION | sudo tee "/etc/apt/$sourcelist"
-	sudo apt-get -o Dir::Etc::sourcelist="$sourcelist" -o Dir::Etc::sourceparts='-' -o APT::Get::List-Cleanup='0' update
-}
-
-postgresql_configure() {
-	sudo tee /etc/postgresql/$PGVERSION/main/pg_hba.conf > /dev/null <<-config
-		local     all         all                               trust
-		hostnossl all         pqgossltest 127.0.0.1/32          reject
-		hostnossl all         pqgosslcert 127.0.0.1/32          reject
-		hostssl   all         pqgossltest 127.0.0.1/32          trust
-		hostssl   all         pqgosslcert 127.0.0.1/32          cert
-		host      all         all         127.0.0.1/32          trust
-		hostnossl all         pqgossltest ::1/128               reject
-		hostnossl all         pqgosslcert ::1/128               reject
-		hostssl   all         pqgossltest ::1/128               trust
-		hostssl   all         pqgosslcert ::1/128               cert
-		host      all         all         ::1/128               trust
-	config
-
-	xargs sudo install -o postgres -g postgres -m 600 -t /var/lib/postgresql/$PGVERSION/main/ <<-certificates
-		certs/root.crt
-		certs/server.crt
-		certs/server.key
-	certificates
-
-	sort -VCu <<-versions ||
-		$PGVERSION
-		9.2
-	versions
-	sudo tee -a /etc/postgresql/$PGVERSION/main/postgresql.conf > /dev/null <<-config
-		ssl_ca_file   = 'root.crt'
-		ssl_cert_file = 'server.crt'
-		ssl_key_file  = 'server.key'
-	config
-
-	echo 127.0.0.1 postgres | sudo tee -a /etc/hosts > /dev/null
-
-	sudo service postgresql restart
-}
-
-postgresql_install() {
-	xargs sudo apt-get -y -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confnew' install <<-packages
-		postgresql-$PGVERSION
-		postgresql-server-dev-$PGVERSION
-		postgresql-contrib-$PGVERSION
-	packages
-}
-
-postgresql_uninstall() {
-	sudo service postgresql stop
-	xargs sudo apt-get -y --purge remove <<-packages
-		libpq-dev
-		libpq5
-		postgresql
-		postgresql-client-common
-		postgresql-common
-	packages
-	sudo rm -rf /var/lib/postgresql
-}
-
-$1
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/.travis.yml b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/.travis.yml
deleted file mode 100644
index 1a4656c53..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/.travis.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-language: go
-
-go:
-  - 1.5.x
-  - 1.6.x
-  - 1.7.x
-  - 1.8.x
-  - master
-
-sudo: true
-
-env:
-  global:
-    - PGUSER=postgres
-    - PQGOSSLTESTS=1
-    - PQSSLCERTTEST_PATH=$PWD/certs
-    - PGHOST=127.0.0.1
-  matrix:
-    - PGVERSION=9.6
-    - PGVERSION=9.5
-    - PGVERSION=9.4
-    - PGVERSION=9.3
-    - PGVERSION=9.2
-    - PGVERSION=9.1
-    - PGVERSION=9.0
-
-before_install:
-  - ./.travis.sh postgresql_uninstall
-  - ./.travis.sh pgdg_repository
-  - ./.travis.sh postgresql_install
-  - ./.travis.sh postgresql_configure
-  - ./.travis.sh client_configure
-  - go get golang.org/x/tools/cmd/goimports
-
-before_script:
-  - createdb pqgotest
-  - createuser -DRS pqgossltest
-  - createuser -DRS pqgosslcert
-
-script:
-  - >
-    goimports -d -e $(find -name '*.go') | awk '{ print } END { exit NR == 0 ? 0 : 1 }'
-  - go vet ./...
-  - PQTEST_BINARY_PARAMETERS=no  go test -race -v ./...
-  - PQTEST_BINARY_PARAMETERS=yes go test -race -v ./...
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/CONTRIBUTING.md b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/CONTRIBUTING.md
deleted file mode 100644
index 84c937f15..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/CONTRIBUTING.md
+++ /dev/null
@@ -1,29 +0,0 @@
-## Contributing to pq
-
-`pq` has a backlog of pull requests, but contributions are still very
-much welcome. You can help with patch review, submitting bug reports,
-or adding new functionality. There is no formal style guide, but
-please conform to the style of existing code and general Go formatting
-conventions when submitting patches.
-
-### Patch review
-
-Help review existing open pull requests by commenting on the code or
-proposed functionality.
-
-### Bug reports
-
-We appreciate any bug reports, but especially ones with self-contained
-(doesn't depend on code outside of pq), minimal (can't be simplified
-further) test cases. It's especially helpful if you can submit a pull
-request with just the failing test case (you'll probably want to
-pattern it after the tests in
-[conn_test.go](https://github.com/lib/pq/blob/master/conn_test.go).
-
-### New functionality
-
-There are a number of pending patches for new functionality, so
-additional feature patches will take a while to merge. Still, patches
-are generally reviewed based on usefulness and complexity in addition
-to time-in-queue, so if you have a knockout idea, take a shot. Feel
-free to open an issue discussion your proposed patch beforehand.
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/LICENSE.md b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/LICENSE.md
deleted file mode 100644
index 5773904a3..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/LICENSE.md
+++ /dev/null
@@ -1,8 +0,0 @@
-Copyright (c) 2011-2013, 'pq' Contributors
-Portions Copyright (C) 2011 Blake Mizerany
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/buf.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/buf.go
deleted file mode 100644
index 666b0012a..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/buf.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package pq
-
-import (
-	"bytes"
-	"encoding/binary"
-
-	"github.com/lib/pq/oid"
-)
-
-type readBuf []byte
-
-func (b *readBuf) int32() (n int) {
-	n = int(int32(binary.BigEndian.Uint32(*b)))
-	*b = (*b)[4:]
-	return
-}
-
-func (b *readBuf) oid() (n oid.Oid) {
-	n = oid.Oid(binary.BigEndian.Uint32(*b))
-	*b = (*b)[4:]
-	return
-}
-
-// N.B: this is actually an unsigned 16-bit integer, unlike int32
-func (b *readBuf) int16() (n int) {
-	n = int(binary.BigEndian.Uint16(*b))
-	*b = (*b)[2:]
-	return
-}
-
-func (b *readBuf) string() string {
-	i := bytes.IndexByte(*b, 0)
-	if i < 0 {
-		errorf("invalid message format; expected string terminator")
-	}
-	s := (*b)[:i]
-	*b = (*b)[i+1:]
-	return string(s)
-}
-
-func (b *readBuf) next(n int) (v []byte) {
-	v = (*b)[:n]
-	*b = (*b)[n:]
-	return
-}
-
-func (b *readBuf) byte() byte {
-	return b.next(1)[0]
-}
-
-type writeBuf struct {
-	buf []byte
-	pos int
-}
-
-func (b *writeBuf) int32(n int) {
-	x := make([]byte, 4)
-	binary.BigEndian.PutUint32(x, uint32(n))
-	b.buf = append(b.buf, x...)
-}
-
-func (b *writeBuf) int16(n int) {
-	x := make([]byte, 2)
-	binary.BigEndian.PutUint16(x, uint16(n))
-	b.buf = append(b.buf, x...)
-}
-
-func (b *writeBuf) string(s string) {
-	b.buf = append(b.buf, (s + "\000")...)
-}
-
-func (b *writeBuf) byte(c byte) {
-	b.buf = append(b.buf, c)
-}
-
-func (b *writeBuf) bytes(v []byte) {
-	b.buf = append(b.buf, v...)
-}
-
-func (b *writeBuf) wrap() []byte {
-	p := b.buf[b.pos:]
-	binary.BigEndian.PutUint32(p, uint32(len(p)))
-	return b.buf
-}
-
-func (b *writeBuf) next(c byte) {
-	p := b.buf[b.pos:]
-	binary.BigEndian.PutUint32(p, uint32(len(p)))
-	b.pos = len(b.buf) + 1
-	b.buf = append(b.buf, c, 0, 0, 0, 0)
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/conn_go18.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/conn_go18.go
deleted file mode 100644
index ab97a104d..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/conn_go18.go
+++ /dev/null
@@ -1,128 +0,0 @@
-// +build go1.8
-
-package pq
-
-import (
-	"context"
-	"database/sql"
-	"database/sql/driver"
-	"fmt"
-	"io"
-	"io/ioutil"
-)
-
-// Implement the "QueryerContext" interface
-func (cn *conn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) {
-	list := make([]driver.Value, len(args))
-	for i, nv := range args {
-		list[i] = nv.Value
-	}
-	finish := cn.watchCancel(ctx)
-	r, err := cn.query(query, list)
-	if err != nil {
-		if finish != nil {
-			finish()
-		}
-		return nil, err
-	}
-	r.finish = finish
-	return r, nil
-}
-
-// Implement the "ExecerContext" interface
-func (cn *conn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) {
-	list := make([]driver.Value, len(args))
-	for i, nv := range args {
-		list[i] = nv.Value
-	}
-
-	if finish := cn.watchCancel(ctx); finish != nil {
-		defer finish()
-	}
-
-	return cn.Exec(query, list)
-}
-
-// Implement the "ConnBeginTx" interface
-func (cn *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) {
-	var mode string
-
-	switch sql.IsolationLevel(opts.Isolation) {
-	case sql.LevelDefault:
-		// Don't touch mode: use the server's default
-	case sql.LevelReadUncommitted:
-		mode = " ISOLATION LEVEL READ UNCOMMITTED"
-	case sql.LevelReadCommitted:
-		mode = " ISOLATION LEVEL READ COMMITTED"
-	case sql.LevelRepeatableRead:
-		mode = " ISOLATION LEVEL REPEATABLE READ"
-	case sql.LevelSerializable:
-		mode = " ISOLATION LEVEL SERIALIZABLE"
-	default:
-		return nil, fmt.Errorf("pq: isolation level not supported: %d", opts.Isolation)
-	}
-
-	if opts.ReadOnly {
-		mode += " READ ONLY"
-	} else {
-		mode += " READ WRITE"
-	}
-
-	tx, err := cn.begin(mode)
-	if err != nil {
-		return nil, err
-	}
-	cn.txnFinish = cn.watchCancel(ctx)
-	return tx, nil
-}
-
-func (cn *conn) watchCancel(ctx context.Context) func() {
-	if done := ctx.Done(); done != nil {
-		finished := make(chan struct{})
-		go func() {
-			select {
-			case <-done:
-				_ = cn.cancel()
-				finished <- struct{}{}
-			case <-finished:
-			}
-		}()
-		return func() {
-			select {
-			case <-finished:
-			case finished <- struct{}{}:
-			}
-		}
-	}
-	return nil
-}
-
-func (cn *conn) cancel() error {
-	c, err := dial(cn.dialer, cn.opts)
-	if err != nil {
-		return err
-	}
-	defer c.Close()
-
-	{
-		can := conn{
-			c: c,
-		}
-		can.ssl(cn.opts)
-
-		w := can.writeBuf(0)
-		w.int32(80877102) // cancel request code
-		w.int32(cn.processID)
-		w.int32(cn.secretKey)
-
-		if err := can.sendStartupPacket(w); err != nil {
-			return err
-		}
-	}
-
-	// Read until EOF to ensure that the server received the cancel.
-	{
-		_, err := io.Copy(ioutil.Discard, c)
-		return err
-	}
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/copy.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/copy.go
deleted file mode 100644
index 345c2398f..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/copy.go
+++ /dev/null
@@ -1,282 +0,0 @@
-package pq
-
-import (
-	"database/sql/driver"
-	"encoding/binary"
-	"errors"
-	"fmt"
-	"sync"
-)
-
-var (
-	errCopyInClosed               = errors.New("pq: copyin statement has already been closed")
-	errBinaryCopyNotSupported     = errors.New("pq: only text format supported for COPY")
-	errCopyToNotSupported         = errors.New("pq: COPY TO is not supported")
-	errCopyNotSupportedOutsideTxn = errors.New("pq: COPY is only allowed inside a transaction")
-	errCopyInProgress             = errors.New("pq: COPY in progress")
-)
-
-// CopyIn creates a COPY FROM statement which can be prepared with
-// Tx.Prepare().  The target table should be visible in search_path.
-func CopyIn(table string, columns ...string) string {
-	stmt := "COPY " + QuoteIdentifier(table) + " ("
-	for i, col := range columns {
-		if i != 0 {
-			stmt += ", "
-		}
-		stmt += QuoteIdentifier(col)
-	}
-	stmt += ") FROM STDIN"
-	return stmt
-}
-
-// CopyInSchema creates a COPY FROM statement which can be prepared with
-// Tx.Prepare().
-func CopyInSchema(schema, table string, columns ...string) string {
-	stmt := "COPY " + QuoteIdentifier(schema) + "." + QuoteIdentifier(table) + " ("
-	for i, col := range columns {
-		if i != 0 {
-			stmt += ", "
-		}
-		stmt += QuoteIdentifier(col)
-	}
-	stmt += ") FROM STDIN"
-	return stmt
-}
-
-type copyin struct {
-	cn      *conn
-	buffer  []byte
-	rowData chan []byte
-	done    chan bool
-
-	closed bool
-
-	sync.Mutex // guards err
-	err        error
-}
-
-const ciBufferSize = 64 * 1024
-
-// flush buffer before the buffer is filled up and needs reallocation
-const ciBufferFlushSize = 63 * 1024
-
-func (cn *conn) prepareCopyIn(q string) (_ driver.Stmt, err error) {
-	if !cn.isInTransaction() {
-		return nil, errCopyNotSupportedOutsideTxn
-	}
-
-	ci := &copyin{
-		cn:      cn,
-		buffer:  make([]byte, 0, ciBufferSize),
-		rowData: make(chan []byte),
-		done:    make(chan bool, 1),
-	}
-	// add CopyData identifier + 4 bytes for message length
-	ci.buffer = append(ci.buffer, 'd', 0, 0, 0, 0)
-
-	b := cn.writeBuf('Q')
-	b.string(q)
-	cn.send(b)
-
-awaitCopyInResponse:
-	for {
-		t, r := cn.recv1()
-		switch t {
-		case 'G':
-			if r.byte() != 0 {
-				err = errBinaryCopyNotSupported
-				break awaitCopyInResponse
-			}
-			go ci.resploop()
-			return ci, nil
-		case 'H':
-			err = errCopyToNotSupported
-			break awaitCopyInResponse
-		case 'E':
-			err = parseError(r)
-		case 'Z':
-			if err == nil {
-				ci.setBad()
-				errorf("unexpected ReadyForQuery in response to COPY")
-			}
-			cn.processReadyForQuery(r)
-			return nil, err
-		default:
-			ci.setBad()
-			errorf("unknown response for copy query: %q", t)
-		}
-	}
-
-	// something went wrong, abort COPY before we return
-	b = cn.writeBuf('f')
-	b.string(err.Error())
-	cn.send(b)
-
-	for {
-		t, r := cn.recv1()
-		switch t {
-		case 'c', 'C', 'E':
-		case 'Z':
-			// correctly aborted, we're done
-			cn.processReadyForQuery(r)
-			return nil, err
-		default:
-			ci.setBad()
-			errorf("unknown response for CopyFail: %q", t)
-		}
-	}
-}
-
-func (ci *copyin) flush(buf []byte) {
-	// set message length (without message identifier)
-	binary.BigEndian.PutUint32(buf[1:], uint32(len(buf)-1))
-
-	_, err := ci.cn.c.Write(buf)
-	if err != nil {
-		panic(err)
-	}
-}
-
-func (ci *copyin) resploop() {
-	for {
-		var r readBuf
-		t, err := ci.cn.recvMessage(&r)
-		if err != nil {
-			ci.setBad()
-			ci.setError(err)
-			ci.done <- true
-			return
-		}
-		switch t {
-		case 'C':
-			// complete
-		case 'N':
-			// NoticeResponse
-		case 'Z':
-			ci.cn.processReadyForQuery(&r)
-			ci.done <- true
-			return
-		case 'E':
-			err := parseError(&r)
-			ci.setError(err)
-		default:
-			ci.setBad()
-			ci.setError(fmt.Errorf("unknown response during CopyIn: %q", t))
-			ci.done <- true
-			return
-		}
-	}
-}
-
-func (ci *copyin) setBad() {
-	ci.Lock()
-	ci.cn.bad = true
-	ci.Unlock()
-}
-
-func (ci *copyin) isBad() bool {
-	ci.Lock()
-	b := ci.cn.bad
-	ci.Unlock()
-	return b
-}
-
-func (ci *copyin) isErrorSet() bool {
-	ci.Lock()
-	isSet := (ci.err != nil)
-	ci.Unlock()
-	return isSet
-}
-
-// setError() sets ci.err if one has not been set already.  Caller must not be
-// holding ci.Mutex.
-func (ci *copyin) setError(err error) {
-	ci.Lock()
-	if ci.err == nil {
-		ci.err = err
-	}
-	ci.Unlock()
-}
-
-func (ci *copyin) NumInput() int {
-	return -1
-}
-
-func (ci *copyin) Query(v []driver.Value) (r driver.Rows, err error) {
-	return nil, ErrNotSupported
-}
-
-// Exec inserts values into the COPY stream. The insert is asynchronous
-// and Exec can return errors from previous Exec calls to the same
-// COPY stmt.
-//
-// You need to call Exec(nil) to sync the COPY stream and to get any
-// errors from pending data, since Stmt.Close() doesn't return errors
-// to the user.
-func (ci *copyin) Exec(v []driver.Value) (r driver.Result, err error) {
-	if ci.closed {
-		return nil, errCopyInClosed
-	}
-
-	if ci.isBad() {
-		return nil, driver.ErrBadConn
-	}
-	defer ci.cn.errRecover(&err)
-
-	if ci.isErrorSet() {
-		return nil, ci.err
-	}
-
-	if len(v) == 0 {
-		return nil, ci.Close()
-	}
-
-	numValues := len(v)
-	for i, value := range v {
-		ci.buffer = appendEncodedText(&ci.cn.parameterStatus, ci.buffer, value)
-		if i < numValues-1 {
-			ci.buffer = append(ci.buffer, '\t')
-		}
-	}
-
-	ci.buffer = append(ci.buffer, '\n')
-
-	if len(ci.buffer) > ciBufferFlushSize {
-		ci.flush(ci.buffer)
-		// reset buffer, keep bytes for message identifier and length
-		ci.buffer = ci.buffer[:5]
-	}
-
-	return driver.RowsAffected(0), nil
-}
-
-func (ci *copyin) Close() (err error) {
-	if ci.closed { // Don't do anything, we're already closed
-		return nil
-	}
-	ci.closed = true
-
-	if ci.isBad() {
-		return driver.ErrBadConn
-	}
-	defer ci.cn.errRecover(&err)
-
-	if len(ci.buffer) > 0 {
-		ci.flush(ci.buffer)
-	}
-	// Avoid touching the scratch buffer as resploop could be using it.
-	err = ci.cn.sendSimpleMessage('c')
-	if err != nil {
-		return err
-	}
-
-	<-ci.done
-	ci.cn.inCopy = false
-
-	if ci.isErrorSet() {
-		err = ci.err
-		return err
-	}
-	return nil
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/error.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/error.go
deleted file mode 100644
index b4bb44cee..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/error.go
+++ /dev/null
@@ -1,508 +0,0 @@
-package pq
-
-import (
-	"database/sql/driver"
-	"fmt"
-	"io"
-	"net"
-	"runtime"
-)
-
-// Error severities
-const (
-	Efatal   = "FATAL"
-	Epanic   = "PANIC"
-	Ewarning = "WARNING"
-	Enotice  = "NOTICE"
-	Edebug   = "DEBUG"
-	Einfo    = "INFO"
-	Elog     = "LOG"
-)
-
-// Error represents an error communicating with the server.
-//
-// See http://www.postgresql.org/docs/current/static/protocol-error-fields.html for details of the fields
-type Error struct {
-	Severity         string
-	Code             ErrorCode
-	Message          string
-	Detail           string
-	Hint             string
-	Position         string
-	InternalPosition string
-	InternalQuery    string
-	Where            string
-	Schema           string
-	Table            string
-	Column           string
-	DataTypeName     string
-	Constraint       string
-	File             string
-	Line             string
-	Routine          string
-}
-
-// ErrorCode is a five-character error code.
-type ErrorCode string
-
-// Name returns a more human friendly rendering of the error code, namely the
-// "condition name".
-//
-// See http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html for
-// details.
-func (ec ErrorCode) Name() string {
-	return errorCodeNames[ec]
-}
-
-// ErrorClass is only the class part of an error code.
-type ErrorClass string
-
-// Name returns the condition name of an error class.  It is equivalent to the
-// condition name of the "standard" error code (i.e. the one having the last
-// three characters "000").
-func (ec ErrorClass) Name() string {
-	return errorCodeNames[ErrorCode(ec+"000")]
-}
-
-// Class returns the error class, e.g. "28".
-//
-// See http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html for
-// details.
-func (ec ErrorCode) Class() ErrorClass {
-	return ErrorClass(ec[0:2])
-}
-
-// errorCodeNames is a mapping between the five-character error codes and the
-// human readable "condition names". It is derived from the list at
-// http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html
-var errorCodeNames = map[ErrorCode]string{
-	// Class 00 - Successful Completion
-	"00000": "successful_completion",
-	// Class 01 - Warning
-	"01000": "warning",
-	"0100C": "dynamic_result_sets_returned",
-	"01008": "implicit_zero_bit_padding",
-	"01003": "null_value_eliminated_in_set_function",
-	"01007": "privilege_not_granted",
-	"01006": "privilege_not_revoked",
-	"01004": "string_data_right_truncation",
-	"01P01": "deprecated_feature",
-	// Class 02 - No Data (this is also a warning class per the SQL standard)
-	"02000": "no_data",
-	"02001": "no_additional_dynamic_result_sets_returned",
-	// Class 03 - SQL Statement Not Yet Complete
-	"03000": "sql_statement_not_yet_complete",
-	// Class 08 - Connection Exception
-	"08000": "connection_exception",
-	"08003": "connection_does_not_exist",
-	"08006": "connection_failure",
-	"08001": "sqlclient_unable_to_establish_sqlconnection",
-	"08004": "sqlserver_rejected_establishment_of_sqlconnection",
-	"08007": "transaction_resolution_unknown",
-	"08P01": "protocol_violation",
-	// Class 09 - Triggered Action Exception
-	"09000": "triggered_action_exception",
-	// Class 0A - Feature Not Supported
-	"0A000": "feature_not_supported",
-	// Class 0B - Invalid Transaction Initiation
-	"0B000": "invalid_transaction_initiation",
-	// Class 0F - Locator Exception
-	"0F000": "locator_exception",
-	"0F001": "invalid_locator_specification",
-	// Class 0L - Invalid Grantor
-	"0L000": "invalid_grantor",
-	"0LP01": "invalid_grant_operation",
-	// Class 0P - Invalid Role Specification
-	"0P000": "invalid_role_specification",
-	// Class 0Z - Diagnostics Exception
-	"0Z000": "diagnostics_exception",
-	"0Z002": "stacked_diagnostics_accessed_without_active_handler",
-	// Class 20 - Case Not Found
-	"20000": "case_not_found",
-	// Class 21 - Cardinality Violation
-	"21000": "cardinality_violation",
-	// Class 22 - Data Exception
-	"22000": "data_exception",
-	"2202E": "array_subscript_error",
-	"22021": "character_not_in_repertoire",
-	"22008": "datetime_field_overflow",
-	"22012": "division_by_zero",
-	"22005": "error_in_assignment",
-	"2200B": "escape_character_conflict",
-	"22022": "indicator_overflow",
-	"22015": "interval_field_overflow",
-	"2201E": "invalid_argument_for_logarithm",
-	"22014": "invalid_argument_for_ntile_function",
-	"22016": "invalid_argument_for_nth_value_function",
-	"2201F": "invalid_argument_for_power_function",
-	"2201G": "invalid_argument_for_width_bucket_function",
-	"22018": "invalid_character_value_for_cast",
-	"22007": "invalid_datetime_format",
-	"22019": "invalid_escape_character",
-	"2200D": "invalid_escape_octet",
-	"22025": "invalid_escape_sequence",
-	"22P06": "nonstandard_use_of_escape_character",
-	"22010": "invalid_indicator_parameter_value",
-	"22023": "invalid_parameter_value",
-	"2201B": "invalid_regular_expression",
-	"2201W": "invalid_row_count_in_limit_clause",
-	"2201X": "invalid_row_count_in_result_offset_clause",
-	"22009": "invalid_time_zone_displacement_value",
-	"2200C": "invalid_use_of_escape_character",
-	"2200G": "most_specific_type_mismatch",
-	"22004": "null_value_not_allowed",
-	"22002": "null_value_no_indicator_parameter",
-	"22003": "numeric_value_out_of_range",
-	"22026": "string_data_length_mismatch",
-	"22001": "string_data_right_truncation",
-	"22011": "substring_error",
-	"22027": "trim_error",
-	"22024": "unterminated_c_string",
-	"2200F": "zero_length_character_string",
-	"22P01": "floating_point_exception",
-	"22P02": "invalid_text_representation",
-	"22P03": "invalid_binary_representation",
-	"22P04": "bad_copy_file_format",
-	"22P05": "untranslatable_character",
-	"2200L": "not_an_xml_document",
-	"2200M": "invalid_xml_document",
-	"2200N": "invalid_xml_content",
-	"2200S": "invalid_xml_comment",
-	"2200T": "invalid_xml_processing_instruction",
-	// Class 23 - Integrity Constraint Violation
-	"23000": "integrity_constraint_violation",
-	"23001": "restrict_violation",
-	"23502": "not_null_violation",
-	"23503": "foreign_key_violation",
-	"23505": "unique_violation",
-	"23514": "check_violation",
-	"23P01": "exclusion_violation",
-	// Class 24 - Invalid Cursor State
-	"24000": "invalid_cursor_state",
-	// Class 25 - Invalid Transaction State
-	"25000": "invalid_transaction_state",
-	"25001": "active_sql_transaction",
-	"25002": "branch_transaction_already_active",
-	"25008": "held_cursor_requires_same_isolation_level",
-	"25003": "inappropriate_access_mode_for_branch_transaction",
-	"25004": "inappropriate_isolation_level_for_branch_transaction",
-	"25005": "no_active_sql_transaction_for_branch_transaction",
-	"25006": "read_only_sql_transaction",
-	"25007": "schema_and_data_statement_mixing_not_supported",
-	"25P01": "no_active_sql_transaction",
-	"25P02": "in_failed_sql_transaction",
-	// Class 26 - Invalid SQL Statement Name
-	"26000": "invalid_sql_statement_name",
-	// Class 27 - Triggered Data Change Violation
-	"27000": "triggered_data_change_violation",
-	// Class 28 - Invalid Authorization Specification
-	"28000": "invalid_authorization_specification",
-	"28P01": "invalid_password",
-	// Class 2B - Dependent Privilege Descriptors Still Exist
-	"2B000": "dependent_privilege_descriptors_still_exist",
-	"2BP01": "dependent_objects_still_exist",
-	// Class 2D - Invalid Transaction Termination
-	"2D000": "invalid_transaction_termination",
-	// Class 2F - SQL Routine Exception
-	"2F000": "sql_routine_exception",
-	"2F005": "function_executed_no_return_statement",
-	"2F002": "modifying_sql_data_not_permitted",
-	"2F003": "prohibited_sql_statement_attempted",
-	"2F004": "reading_sql_data_not_permitted",
-	// Class 34 - Invalid Cursor Name
-	"34000": "invalid_cursor_name",
-	// Class 38 - External Routine Exception
-	"38000": "external_routine_exception",
-	"38001": "containing_sql_not_permitted",
-	"38002": "modifying_sql_data_not_permitted",
-	"38003": "prohibited_sql_statement_attempted",
-	"38004": "reading_sql_data_not_permitted",
-	// Class 39 - External Routine Invocation Exception
-	"39000": "external_routine_invocation_exception",
-	"39001": "invalid_sqlstate_returned",
-	"39004": "null_value_not_allowed",
-	"39P01": "trigger_protocol_violated",
-	"39P02": "srf_protocol_violated",
-	// Class 3B - Savepoint Exception
-	"3B000": "savepoint_exception",
-	"3B001": "invalid_savepoint_specification",
-	// Class 3D - Invalid Catalog Name
-	"3D000": "invalid_catalog_name",
-	// Class 3F - Invalid Schema Name
-	"3F000": "invalid_schema_name",
-	// Class 40 - Transaction Rollback
-	"40000": "transaction_rollback",
-	"40002": "transaction_integrity_constraint_violation",
-	"40001": "serialization_failure",
-	"40003": "statement_completion_unknown",
-	"40P01": "deadlock_detected",
-	// Class 42 - Syntax Error or Access Rule Violation
-	"42000": "syntax_error_or_access_rule_violation",
-	"42601": "syntax_error",
-	"42501": "insufficient_privilege",
-	"42846": "cannot_coerce",
-	"42803": "grouping_error",
-	"42P20": "windowing_error",
-	"42P19": "invalid_recursion",
-	"42830": "invalid_foreign_key",
-	"42602": "invalid_name",
-	"42622": "name_too_long",
-	"42939": "reserved_name",
-	"42804": "datatype_mismatch",
-	"42P18": "indeterminate_datatype",
-	"42P21": "collation_mismatch",
-	"42P22": "indeterminate_collation",
-	"42809": "wrong_object_type",
-	"42703": "undefined_column",
-	"42883": "undefined_function",
-	"42P01": "undefined_table",
-	"42P02": "undefined_parameter",
-	"42704": "undefined_object",
-	"42701": "duplicate_column",
-	"42P03": "duplicate_cursor",
-	"42P04": "duplicate_database",
-	"42723": "duplicate_function",
-	"42P05": "duplicate_prepared_statement",
-	"42P06": "duplicate_schema",
-	"42P07": "duplicate_table",
-	"42712": "duplicate_alias",
-	"42710": "duplicate_object",
-	"42702": "ambiguous_column",
-	"42725": "ambiguous_function",
-	"42P08": "ambiguous_parameter",
-	"42P09": "ambiguous_alias",
-	"42P10": "invalid_column_reference",
-	"42611": "invalid_column_definition",
-	"42P11": "invalid_cursor_definition",
-	"42P12": "invalid_database_definition",
-	"42P13": "invalid_function_definition",
-	"42P14": "invalid_prepared_statement_definition",
-	"42P15": "invalid_schema_definition",
-	"42P16": "invalid_table_definition",
-	"42P17": "invalid_object_definition",
-	// Class 44 - WITH CHECK OPTION Violation
-	"44000": "with_check_option_violation",
-	// Class 53 - Insufficient Resources
-	"53000": "insufficient_resources",
-	"53100": "disk_full",
-	"53200": "out_of_memory",
-	"53300": "too_many_connections",
-	"53400": "configuration_limit_exceeded",
-	// Class 54 - Program Limit Exceeded
-	"54000": "program_limit_exceeded",
-	"54001": "statement_too_complex",
-	"54011": "too_many_columns",
-	"54023": "too_many_arguments",
-	// Class 55 - Object Not In Prerequisite State
-	"55000": "object_not_in_prerequisite_state",
-	"55006": "object_in_use",
-	"55P02": "cant_change_runtime_param",
-	"55P03": "lock_not_available",
-	// Class 57 - Operator Intervention
-	"57000": "operator_intervention",
-	"57014": "query_canceled",
-	"57P01": "admin_shutdown",
-	"57P02": "crash_shutdown",
-	"57P03": "cannot_connect_now",
-	"57P04": "database_dropped",
-	// Class 58 - System Error (errors external to PostgreSQL itself)
-	"58000": "system_error",
-	"58030": "io_error",
-	"58P01": "undefined_file",
-	"58P02": "duplicate_file",
-	// Class F0 - Configuration File Error
-	"F0000": "config_file_error",
-	"F0001": "lock_file_exists",
-	// Class HV - Foreign Data Wrapper Error (SQL/MED)
-	"HV000": "fdw_error",
-	"HV005": "fdw_column_name_not_found",
-	"HV002": "fdw_dynamic_parameter_value_needed",
-	"HV010": "fdw_function_sequence_error",
-	"HV021": "fdw_inconsistent_descriptor_information",
-	"HV024": "fdw_invalid_attribute_value",
-	"HV007": "fdw_invalid_column_name",
-	"HV008": "fdw_invalid_column_number",
-	"HV004": "fdw_invalid_data_type",
-	"HV006": "fdw_invalid_data_type_descriptors",
-	"HV091": "fdw_invalid_descriptor_field_identifier",
-	"HV00B": "fdw_invalid_handle",
-	"HV00C": "fdw_invalid_option_index",
-	"HV00D": "fdw_invalid_option_name",
-	"HV090": "fdw_invalid_string_length_or_buffer_length",
-	"HV00A": "fdw_invalid_string_format",
-	"HV009": "fdw_invalid_use_of_null_pointer",
-	"HV014": "fdw_too_many_handles",
-	"HV001": "fdw_out_of_memory",
-	"HV00P": "fdw_no_schemas",
-	"HV00J": "fdw_option_name_not_found",
-	"HV00K": "fdw_reply_handle",
-	"HV00Q": "fdw_schema_not_found",
-	"HV00R": "fdw_table_not_found",
-	"HV00L": "fdw_unable_to_create_execution",
-	"HV00M": "fdw_unable_to_create_reply",
-	"HV00N": "fdw_unable_to_establish_connection",
-	// Class P0 - PL/pgSQL Error
-	"P0000": "plpgsql_error",
-	"P0001": "raise_exception",
-	"P0002": "no_data_found",
-	"P0003": "too_many_rows",
-	// Class XX - Internal Error
-	"XX000": "internal_error",
-	"XX001": "data_corrupted",
-	"XX002": "index_corrupted",
-}
-
-func parseError(r *readBuf) *Error {
-	err := new(Error)
-	for t := r.byte(); t != 0; t = r.byte() {
-		msg := r.string()
-		switch t {
-		case 'S':
-			err.Severity = msg
-		case 'C':
-			err.Code = ErrorCode(msg)
-		case 'M':
-			err.Message = msg
-		case 'D':
-			err.Detail = msg
-		case 'H':
-			err.Hint = msg
-		case 'P':
-			err.Position = msg
-		case 'p':
-			err.InternalPosition = msg
-		case 'q':
-			err.InternalQuery = msg
-		case 'W':
-			err.Where = msg
-		case 's':
-			err.Schema = msg
-		case 't':
-			err.Table = msg
-		case 'c':
-			err.Column = msg
-		case 'd':
-			err.DataTypeName = msg
-		case 'n':
-			err.Constraint = msg
-		case 'F':
-			err.File = msg
-		case 'L':
-			err.Line = msg
-		case 'R':
-			err.Routine = msg
-		}
-	}
-	return err
-}
-
-// Fatal returns true if the Error Severity is fatal.
-func (err *Error) Fatal() bool {
-	return err.Severity == Efatal
-}
-
-// Get implements the legacy PGError interface. New code should use the fields
-// of the Error struct directly.
-func (err *Error) Get(k byte) (v string) {
-	switch k {
-	case 'S':
-		return err.Severity
-	case 'C':
-		return string(err.Code)
-	case 'M':
-		return err.Message
-	case 'D':
-		return err.Detail
-	case 'H':
-		return err.Hint
-	case 'P':
-		return err.Position
-	case 'p':
-		return err.InternalPosition
-	case 'q':
-		return err.InternalQuery
-	case 'W':
-		return err.Where
-	case 's':
-		return err.Schema
-	case 't':
-		return err.Table
-	case 'c':
-		return err.Column
-	case 'd':
-		return err.DataTypeName
-	case 'n':
-		return err.Constraint
-	case 'F':
-		return err.File
-	case 'L':
-		return err.Line
-	case 'R':
-		return err.Routine
-	}
-	return ""
-}
-
-func (err Error) Error() string {
-	return "pq: " + err.Message
-}
-
-// PGError is an interface used by previous versions of pq. It is provided
-// only to support legacy code. New code should use the Error type.
-type PGError interface {
-	Error() string
-	Fatal() bool
-	Get(k byte) (v string)
-}
-
-func errorf(s string, args ...interface{}) {
-	panic(fmt.Errorf("pq: %s", fmt.Sprintf(s, args...)))
-}
-
-func errRecoverNoErrBadConn(err *error) {
-	e := recover()
-	if e == nil {
-		// Do nothing
-		return
-	}
-	var ok bool
-	*err, ok = e.(error)
-	if !ok {
-		*err = fmt.Errorf("pq: unexpected error: %#v", e)
-	}
-}
-
-func (c *conn) errRecover(err *error) {
-	e := recover()
-	switch v := e.(type) {
-	case nil:
-		// Do nothing
-	case runtime.Error:
-		c.bad = true
-		panic(v)
-	case *Error:
-		if v.Fatal() {
-			*err = driver.ErrBadConn
-		} else {
-			*err = v
-		}
-	case *net.OpError:
-		*err = driver.ErrBadConn
-	case error:
-		if v == io.EOF || v.(error).Error() == "remote error: handshake failure" {
-			*err = driver.ErrBadConn
-		} else {
-			*err = v
-		}
-
-	default:
-		c.bad = true
-		panic(fmt.Sprintf("unknown error: %#v", e))
-	}
-
-	// Any time we return ErrBadConn, we need to remember it since *Tx doesn't
-	// mark the connection bad in database/sql.
-	if *err == driver.ErrBadConn {
-		c.bad = true
-	}
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/oid/doc.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/oid/doc.go
deleted file mode 100644
index caaede248..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/oid/doc.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// Package oid contains OID constants
-// as defined by the Postgres server.
-package oid
-
-// Oid is a Postgres Object ID.
-type Oid uint32
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl.go
deleted file mode 100644
index 7deb30436..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl.go
+++ /dev/null
@@ -1,158 +0,0 @@
-package pq
-
-import (
-	"crypto/tls"
-	"crypto/x509"
-	"io/ioutil"
-	"net"
-	"os"
-	"os/user"
-	"path/filepath"
-)
-
-// ssl generates a function to upgrade a net.Conn based on the "sslmode" and
-// related settings. The function is nil when no upgrade should take place.
-func ssl(o values) func(net.Conn) net.Conn {
-	verifyCaOnly := false
-	tlsConf := tls.Config{}
-	switch mode := o["sslmode"]; mode {
-	// "require" is the default.
-	case "", "require":
-		// We must skip TLS's own verification since it requires full
-		// verification since Go 1.3.
-		tlsConf.InsecureSkipVerify = true
-
-		// From http://www.postgresql.org/docs/current/static/libpq-ssl.html:
-		//
-		// Note: For backwards compatibility with earlier versions of
-		// PostgreSQL, if a root CA file exists, the behavior of
-		// sslmode=require will be the same as that of verify-ca, meaning the
-		// server certificate is validated against the CA. Relying on this
-		// behavior is discouraged, and applications that need certificate
-		// validation should always use verify-ca or verify-full.
-		if sslrootcert, ok := o["sslrootcert"]; ok {
-			if _, err := os.Stat(sslrootcert); err == nil {
-				verifyCaOnly = true
-			} else {
-				delete(o, "sslrootcert")
-			}
-		}
-	case "verify-ca":
-		// We must skip TLS's own verification since it requires full
-		// verification since Go 1.3.
-		tlsConf.InsecureSkipVerify = true
-		verifyCaOnly = true
-	case "verify-full":
-		tlsConf.ServerName = o["host"]
-	case "disable":
-		return nil
-	default:
-		errorf(`unsupported sslmode %q; only "require" (default), "verify-full", "verify-ca", and "disable" supported`, mode)
-	}
-
-	sslClientCertificates(&tlsConf, o)
-	sslCertificateAuthority(&tlsConf, o)
-	sslRenegotiation(&tlsConf)
-
-	return func(conn net.Conn) net.Conn {
-		client := tls.Client(conn, &tlsConf)
-		if verifyCaOnly {
-			sslVerifyCertificateAuthority(client, &tlsConf)
-		}
-		return client
-	}
-}
-
-// sslClientCertificates adds the certificate specified in the "sslcert" and
-// "sslkey" settings, or if they aren't set, from the .postgresql directory
-// in the user's home directory. The configured files must exist and have
-// the correct permissions.
-func sslClientCertificates(tlsConf *tls.Config, o values) {
-	// user.Current() might fail when cross-compiling. We have to ignore the
-	// error and continue without home directory defaults, since we wouldn't
-	// know from where to load them.
-	user, _ := user.Current()
-
-	// In libpq, the client certificate is only loaded if the setting is not blank.
-	//
-	// https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1036-L1037
-	sslcert := o["sslcert"]
-	if len(sslcert) == 0 && user != nil {
-		sslcert = filepath.Join(user.HomeDir, ".postgresql", "postgresql.crt")
-	}
-	// https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1045
-	if len(sslcert) == 0 {
-		return
-	}
-	// https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1050:L1054
-	if _, err := os.Stat(sslcert); os.IsNotExist(err) {
-		return
-	} else if err != nil {
-		panic(err)
-	}
-
-	// In libpq, the ssl key is only loaded if the setting is not blank.
-	//
-	// https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1123-L1222
-	sslkey := o["sslkey"]
-	if len(sslkey) == 0 && user != nil {
-		sslkey = filepath.Join(user.HomeDir, ".postgresql", "postgresql.key")
-	}
-
-	if len(sslkey) > 0 {
-		if err := sslKeyPermissions(sslkey); err != nil {
-			panic(err)
-		}
-	}
-
-	cert, err := tls.LoadX509KeyPair(sslcert, sslkey)
-	if err != nil {
-		panic(err)
-	}
-	tlsConf.Certificates = []tls.Certificate{cert}
-}
-
-// sslCertificateAuthority adds the RootCA specified in the "sslrootcert" setting.
-func sslCertificateAuthority(tlsConf *tls.Config, o values) {
-	// In libpq, the root certificate is only loaded if the setting is not blank.
-	//
-	// https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L950-L951
-	if sslrootcert := o["sslrootcert"]; len(sslrootcert) > 0 {
-		tlsConf.RootCAs = x509.NewCertPool()
-
-		cert, err := ioutil.ReadFile(sslrootcert)
-		if err != nil {
-			panic(err)
-		}
-
-		if !tlsConf.RootCAs.AppendCertsFromPEM(cert) {
-			errorf("couldn't parse pem in sslrootcert")
-		}
-	}
-}
-
-// sslVerifyCertificateAuthority carries out a TLS handshake to the server and
-// verifies the presented certificate against the CA, i.e. the one specified in
-// sslrootcert or the system CA if sslrootcert was not specified.
-func sslVerifyCertificateAuthority(client *tls.Conn, tlsConf *tls.Config) {
-	err := client.Handshake()
-	if err != nil {
-		panic(err)
-	}
-	certs := client.ConnectionState().PeerCertificates
-	opts := x509.VerifyOptions{
-		DNSName:       client.ConnectionState().ServerName,
-		Intermediates: x509.NewCertPool(),
-		Roots:         tlsConf.RootCAs,
-	}
-	for i, cert := range certs {
-		if i == 0 {
-			continue
-		}
-		opts.Intermediates.AddCert(cert)
-	}
-	_, err = certs[0].Verify(opts)
-	if err != nil {
-		panic(err)
-	}
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_go1.7.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_go1.7.go
deleted file mode 100644
index d7ba43b32..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_go1.7.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// +build go1.7
-
-package pq
-
-import "crypto/tls"
-
-// Accept renegotiation requests initiated by the backend.
-//
-// Renegotiation was deprecated then removed from PostgreSQL 9.5, but
-// the default configuration of older versions has it enabled. Redshift
-// also initiates renegotiations and cannot be reconfigured.
-func sslRenegotiation(conf *tls.Config) {
-	conf.Renegotiation = tls.RenegotiateFreelyAsClient
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_permissions.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_permissions.go
deleted file mode 100644
index 3b7c3a2a3..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_permissions.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// +build !windows
-
-package pq
-
-import "os"
-
-// sslKeyPermissions checks the permissions on user-supplied ssl key files.
-// The key file should have very little access.
-//
-// libpq does not check key file permissions on Windows.
-func sslKeyPermissions(sslkey string) error {
-	info, err := os.Stat(sslkey)
-	if err != nil {
-		return err
-	}
-	if info.Mode().Perm()&0077 != 0 {
-		return ErrSSLKeyHasWorldPermissions
-	}
-	return nil
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_renegotiation.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_renegotiation.go
deleted file mode 100644
index 85ed5e437..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_renegotiation.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// +build !go1.7
-
-package pq
-
-import "crypto/tls"
-
-// Renegotiation is not supported by crypto/tls until Go 1.7.
-func sslRenegotiation(*tls.Config) {}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_windows.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_windows.go
deleted file mode 100644
index 5d2c763ce..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/ssl_windows.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// +build windows
-
-package pq
-
-// sslKeyPermissions checks the permissions on user-supplied ssl key files.
-// The key file should have very little access.
-//
-// libpq does not check key file permissions on Windows.
-func sslKeyPermissions(string) error { return nil }
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/url.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/url.go
deleted file mode 100644
index f4d8a7c20..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/url.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package pq
-
-import (
-	"fmt"
-	"net"
-	nurl "net/url"
-	"sort"
-	"strings"
-)
-
-// ParseURL no longer needs to be used by clients of this library since supplying a URL as a
-// connection string to sql.Open() is now supported:
-//
-//	sql.Open("postgres", "postgres://bob:secret@1.2.3.4:5432/mydb?sslmode=verify-full")
-//
-// It remains exported here for backwards-compatibility.
-//
-// ParseURL converts a url to a connection string for driver.Open.
-// Example:
-//
-//	"postgres://bob:secret@1.2.3.4:5432/mydb?sslmode=verify-full"
-//
-// converts to:
-//
-//	"user=bob password=secret host=1.2.3.4 port=5432 dbname=mydb sslmode=verify-full"
-//
-// A minimal example:
-//
-//	"postgres://"
-//
-// This will be blank, causing driver.Open to use all of the defaults
-func ParseURL(url string) (string, error) {
-	u, err := nurl.Parse(url)
-	if err != nil {
-		return "", err
-	}
-
-	if u.Scheme != "postgres" && u.Scheme != "postgresql" {
-		return "", fmt.Errorf("invalid connection protocol: %s", u.Scheme)
-	}
-
-	var kvs []string
-	escaper := strings.NewReplacer(` `, `\ `, `'`, `\'`, `\`, `\\`)
-	accrue := func(k, v string) {
-		if v != "" {
-			kvs = append(kvs, k+"="+escaper.Replace(v))
-		}
-	}
-
-	if u.User != nil {
-		v := u.User.Username()
-		accrue("user", v)
-
-		v, _ = u.User.Password()
-		accrue("password", v)
-	}
-
-	if host, port, err := net.SplitHostPort(u.Host); err != nil {
-		accrue("host", u.Host)
-	} else {
-		accrue("host", host)
-		accrue("port", port)
-	}
-
-	if u.Path != "" {
-		accrue("dbname", u.Path[1:])
-	}
-
-	q := u.Query()
-	for k := range q {
-		accrue(k, q.Get(k))
-	}
-
-	sort.Strings(kvs) // Makes testing easier (not a performance concern)
-	return strings.Join(kvs, " "), nil
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/user_posix.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/user_posix.go
deleted file mode 100644
index bf982524f..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/user_posix.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Package pq is a pure Go Postgres driver for the database/sql package.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris rumprun
-
-package pq
-
-import (
-	"os"
-	"os/user"
-)
-
-func userCurrent() (string, error) {
-	u, err := user.Current()
-	if err == nil {
-		return u.Username, nil
-	}
-
-	name := os.Getenv("USER")
-	if name != "" {
-		return name, nil
-	}
-
-	return "", ErrCouldNotDetectUsername
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/user_windows.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/user_windows.go
deleted file mode 100644
index 2b691267b..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/user_windows.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Package pq is a pure Go Postgres driver for the database/sql package.
-package pq
-
-import (
-	"path/filepath"
-	"syscall"
-)
-
-// Perform Windows user name lookup identically to libpq.
-//
-// The PostgreSQL code makes use of the legacy Win32 function
-// GetUserName, and that function has not been imported into stock Go.
-// GetUserNameEx is available though, the difference being that a
-// wider range of names are available.  To get the output to be the
-// same as GetUserName, only the base (or last) component of the
-// result is returned.
-func userCurrent() (string, error) {
-	pw_name := make([]uint16, 128)
-	pwname_size := uint32(len(pw_name)) - 1
-	err := syscall.GetUserNameEx(syscall.NameSamCompatible, &pw_name[0], &pwname_size)
-	if err != nil {
-		return "", ErrCouldNotDetectUsername
-	}
-	s := syscall.UTF16ToString(pw_name)
-	u := filepath.Base(s)
-	return u, nil
-}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/uuid.go b/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/uuid.go
deleted file mode 100644
index 9a1b9e074..000000000
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/lib/pq/uuid.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package pq
-
-import (
-	"encoding/hex"
-	"fmt"
-)
-
-// decodeUUIDBinary interprets the binary format of a uuid, returning it in text format.
-func decodeUUIDBinary(src []byte) ([]byte, error) {
-	if len(src) != 16 {
-		return nil, fmt.Errorf("pq: unable to decode uuid; bad length: %d", len(src))
-	}
-
-	dst := make([]byte, 36)
-	dst[8], dst[13], dst[18], dst[23] = '-', '-', '-', '-'
-	hex.Encode(dst[0:], src[0:4])
-	hex.Encode(dst[9:], src[4:6])
-	hex.Encode(dst[14:], src[6:8])
-	hex.Encode(dst[19:], src[8:10])
-	hex.Encode(dst[24:], src[10:16])
-
-	return dst, nil
-}
diff --git a/traffic_ops/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md b/traffic_ops/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md
new file mode 100644
index 000000000..f0f7e3a8a
--- /dev/null
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md
@@ -0,0 +1,63 @@
+#### Support
+If you do have a contribution to the package, feel free to create a Pull Request or an Issue.
+
+#### What to contribute
+If you don't know what to do, there are some features and functions that need to be done
+
+- [ ] Refactor code
+- [ ] Edit docs and [README](https://github.com/asaskevich/govalidator/README.md): spellcheck, grammar and typo check
+- [ ] Create actual list of contributors and projects that currently using this package
+- [ ] Resolve [issues and bugs](https://github.com/asaskevich/govalidator/issues)
+- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
+- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
+- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
+- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
+- [ ] Implement fuzzing testing
+- [ ] Implement some struct/map/array utilities
+- [ ] Implement map/array validation
+- [ ] Implement benchmarking
+- [ ] Implement batch of examples
+- [ ] Look at forks for new features and fixes
+
+#### Advice
+Feel free to create what you want, but keep in mind when you implement new features:
+- Code must be clear and readable, names of variables/constants clearly describes what they are doing
+- Public functions must be documented and described in source file and added to README.md to the list of available functions
+- There are must be unit-tests for any new functions and improvements
+
+## Financial contributions
+
+We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/govalidator).
+Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed.
+
+
+## Credits
+
+
+### Contributors
+
+Thank you to all the people who have already contributed to govalidator!
+<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
+
+
+### Backers
+
+Thank you to all our backers! [[Become a backer](https://opencollective.com/govalidator#backer)]
+
+<a href="https://opencollective.com/govalidator#backers" target="_blank"><img src="https://opencollective.com/govalidator/backers.svg?width=890"></a>
+
+
+### Sponsors
+
+Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/govalidator#sponsor))
+
+<a href="https://opencollective.com/govalidator/sponsor/0/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/0/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/1/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/1/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/2/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/2/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/3/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/3/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/4/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/4/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/5/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/5/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/6/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/6/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/7/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/7/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/8/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/8/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/9/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/9/avatar.svg"></a>
\ No newline at end of file
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/LICENSE b/traffic_ops/vendor/github.com/asaskevich/govalidator/LICENSE
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/LICENSE
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/LICENSE
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/README.md b/traffic_ops/vendor/github.com/asaskevich/govalidator/README.md
similarity index 87%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/README.md
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/README.md
index fac77d0e9..efd8e64aa 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/README.md
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/README.md
@@ -1,7 +1,7 @@
 govalidator
 ===========
 [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/asaskevich/govalidator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![GoDoc](https://godoc.org/github.com/asaskevich/govalidator?status.png)](https://godoc.org/github.com/asaskevich/govalidator) [![Coverage Status](https://img.shields.io/coveralls/asaskevich/govalidator.svg)](https://coveralls.io/r/asaskevich/govalidator?branch=master) [![wercker status](https://app.wercker.com/status/1ec990b09ea86c910d5f08b0e02c6043/s "wercker status")](https://app.wercker.com/project/bykey/1ec990b09ea86c910d5f08b0e02c6043)
-[![Build Status](https://travis-ci.org/asaskevich/govalidator.svg?branch=master)](https://travis-ci.org/asaskevich/govalidator) [![Go Report Card](https://goreportcard.com/badge/github.com/asaskevich/govalidator)](https://goreportcard.com/report/github.com/asaskevich/govalidator) [![GoSearch](http://go-search.org/badge?id=github.com%2Fasaskevich%2Fgovalidator)](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator)
+[![Build Status](https://travis-ci.org/asaskevich/govalidator.svg?branch=master)](https://travis-ci.org/asaskevich/govalidator) [![Go Report Card](https://goreportcard.com/badge/github.com/asaskevich/govalidator)](https://goreportcard.com/report/github.com/asaskevich/govalidator) [![GoSearch](http://go-search.org/badge?id=github.com%2Fasaskevich%2Fgovalidator)](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator) [![Backers on Open Collective](https://opencollective.com/govalidator/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/govalidator/sponsors/badge.svg)](#sponsors) 
 
 A package of validators and sanitizers for strings, structs and collections. Based on [validator.js](https://github.com/chriso/validator.js).
 
@@ -446,6 +446,11 @@ Feel free to create what you want, but keep in mind when you implement new featu
 - Public functions must be documented and described in source file and added to README.md to the list of available functions
 - There are must be unit-tests for any new functions and improvements
 
+## Credits
+### Contributors
+
+This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
+
 #### Special thanks to [contributors](https://github.com/asaskevich/govalidator/graphs/contributors)
 * [Daniel Lohse](https://github.com/annismckenzie)
 * [Attila Oláh](https://github.com/attilaolah)
@@ -456,3 +461,30 @@ Feel free to create what you want, but keep in mind when you implement new featu
 * [Nathan Davies](https://github.com/nathj07)
 * [Matt Sanford](https://github.com/mzsanford)
 * [Simon ccl1115](https://github.com/ccl1115)
+
+<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
+
+
+### Backers
+
+Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/govalidator#backer)]
+
+<a href="https://opencollective.com/govalidator#backers" target="_blank"><img src="https://opencollective.com/govalidator/backers.svg?width=890"></a>
+
+
+### Sponsors
+
+Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/govalidator#sponsor)]
+
+<a href="https://opencollective.com/govalidator/sponsor/0/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/0/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/1/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/1/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/2/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/2/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/3/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/3/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/4/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/4/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/5/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/5/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/6/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/6/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/7/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/7/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/8/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/8/avatar.svg"></a>
+<a href="https://opencollective.com/govalidator/sponsor/9/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/9/avatar.svg"></a>
+
+
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/arrays.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/arrays.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/arrays.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/arrays.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/arrays_test.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/arrays_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/arrays_test.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/arrays_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/converter.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/converter.go
similarity index 53%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/converter.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/converter.go
index d69114c4b..cf1e5d569 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/converter.go
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/converter.go
@@ -3,6 +3,7 @@ package govalidator
 import (
 	"encoding/json"
 	"fmt"
+	"reflect"
 	"strconv"
 )
 
@@ -30,13 +31,31 @@ func ToFloat(str string) (float64, error) {
 	return res, err
 }
 
-// ToInt convert the input string to an integer, or 0 if the input is not an integer.
-func ToInt(str string) (int64, error) {
-	res, err := strconv.ParseInt(str, 0, 64)
-	if err != nil {
+// ToInt convert the input string or any int type to an integer type 64, or 0 if the input is not an integer.
+func ToInt(value interface{}) (res int64, err error) {
+	val := reflect.ValueOf(value)
+
+	switch value.(type) {
+	case int, int8, int16, int32, int64:
+		res = val.Int()
+	case uint, uint8, uint16, uint32, uint64:
+		res = int64(val.Uint())
+	case string:
+		if IsInt(val.String()) {
+			res, err = strconv.ParseInt(val.String(), 0, 64)
+			if err != nil {
+				res = 0
+			}
+		} else {
+			err = fmt.Errorf("math: square root of negative number %g", value)
+			res = 0
+		}
+	default:
+		err = fmt.Errorf("math: square root of negative number %g", value)
 		res = 0
 	}
-	return res, err
+
+	return
 }
 
 // ToBoolean convert the input string to a boolean.
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/converter_test.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/converter_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/converter_test.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/converter_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/error.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/error.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/error.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/error.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/error_test.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/error_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/error_test.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/error_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/numerics.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/numerics.go
similarity index 91%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/numerics.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/numerics.go
index d0140d421..7e6c652e1 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/numerics.go
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/numerics.go
@@ -42,11 +42,14 @@ func IsNonPositive(value float64) bool {
 }
 
 // InRange returns true if value lies between left and right border
-func InRangeInt(value, left, right int) bool {
-	if left > right {
-		left, right = right, left
+func InRangeInt(value, left, right interface{}) bool {
+	value64, _ := ToInt(value)
+	left64, _ := ToInt(left)
+	right64, _ := ToInt(right)
+	if left64 > right64 {
+		left64, right64 = right64, left64
 	}
-	return value >= left && value <= right
+	return value64 >= left64 && value64 <= right64
 }
 
 // InRange returns true if value lies between left and right border
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/numerics_test.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/numerics_test.go
similarity index 56%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/numerics_test.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/numerics_test.go
index ca743dfed..8a28415de 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/numerics_test.go
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/numerics_test.go
@@ -181,7 +181,7 @@ func TestIsNatural(t *testing.T) {
 func TestInRangeInt(t *testing.T) {
 	t.Parallel()
 
-	var tests = []struct {
+	var testAsInts = []struct {
 		param    int
 		left     int
 		right    int
@@ -196,10 +196,210 @@ func TestInRangeInt(t *testing.T) {
 		{0, 0, -1, true},
 		{0, 10, 5, false},
 	}
-	for _, test := range tests {
+	for _, test := range testAsInts {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type int", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsInt8s = []struct {
+		param    int8
+		left     int8
+		right    int8
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{-1, 0, 0, false},
+		{0, -1, 1, true},
+		{0, 0, 1, true},
+		{0, -1, 0, true},
+		{0, 0, -1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsInt8s {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type int8", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsInt16s = []struct {
+		param    int16
+		left     int16
+		right    int16
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{-1, 0, 0, false},
+		{0, -1, 1, true},
+		{0, 0, 1, true},
+		{0, -1, 0, true},
+		{0, 0, -1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsInt16s {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type int16", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsInt32s = []struct {
+		param    int32
+		left     int32
+		right    int32
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{-1, 0, 0, false},
+		{0, -1, 1, true},
+		{0, 0, 1, true},
+		{0, -1, 0, true},
+		{0, 0, -1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsInt32s {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type int32", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsInt64s = []struct {
+		param    int64
+		left     int64
+		right    int64
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{-1, 0, 0, false},
+		{0, -1, 1, true},
+		{0, 0, 1, true},
+		{0, -1, 0, true},
+		{0, 0, -1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsInt64s {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type int64", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsUInts = []struct {
+		param    uint
+		left     uint
+		right    uint
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{0, 0, 1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsUInts {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type uint", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsUInt8s = []struct {
+		param    uint8
+		left     uint8
+		right    uint8
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{0, 0, 1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsUInt8s {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type uint", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsUInt16s = []struct {
+		param    uint16
+		left     uint16
+		right    uint16
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{0, 0, 1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsUInt16s {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type uint", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsUInt32s = []struct {
+		param    uint32
+		left     uint32
+		right    uint32
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{0, 0, 1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsUInt32s {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type uint", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsUInt64s = []struct {
+		param    uint64
+		left     uint64
+		right    uint64
+		expected bool
+	}{
+		{0, 0, 0, true},
+		{1, 0, 0, false},
+		{0, 0, 1, true},
+		{0, 10, 5, false},
+	}
+	for _, test := range testAsUInt64s {
+		actual := InRangeInt(test.param, test.left, test.right)
+		if actual != test.expected {
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type uint", test.param, test.left, test.right, test.expected, actual)
+		}
+	}
+
+	var testAsStrings = []struct {
+		param    string
+		left     string
+		right    string
+		expected bool
+	}{
+		{"0", "0", "0", true},
+		{"1", "0", "0", false},
+		{"-1", "0", "0", false},
+		{"0", "-1", "1", true},
+		{"0", "0", "1", true},
+		{"0", "-1", "0", true},
+		{"0", "0", "-1", true},
+		{"0", "10", "5", false},
+	}
+	for _, test := range testAsStrings {
 		actual := InRangeInt(test.param, test.left, test.right)
 		if actual != test.expected {
-			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v", test.param, test.left, test.right, test.expected, actual)
+			t.Errorf("Expected InRangeInt(%v, %v, %v) to be %v, got %v using type string", test.param, test.left, test.right, test.expected, actual)
 		}
 	}
 }
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/patterns.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/patterns.go
similarity index 97%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/patterns.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/patterns.go
index 8dc76bd00..b7375bd03 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/patterns.go
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/patterns.go
@@ -58,6 +58,9 @@ const (
 )
 
 var (
+	userRegexp       = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$")
+	hostRegexp       = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$")
+	userDotRegexp    = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})")
 	rxEmail          = regexp.MustCompile(Email)
 	rxCreditCard     = regexp.MustCompile(CreditCard)
 	rxISBN10         = regexp.MustCompile(ISBN10)
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/types.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/types.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/types.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/types.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/utils.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/utils.go
similarity index 98%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/utils.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/utils.go
index 78ed3fbab..6a8871c1c 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/utils.go
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/utils.go
@@ -108,7 +108,9 @@ func CamelCaseToUnderscore(str string) string {
 	var output []rune
 	var segment []rune
 	for _, r := range str {
-		if !unicode.IsLower(r) && string(r) != "_" {
+
+		// not treat number as separate segment
+		if !unicode.IsLower(r) && string(r) != "_" && !unicode.IsNumber(r) {
 			output = addSegment(output, segment)
 			segment = nil
 		}
diff --git a/traffic_ops/vendor/github.com/asaskevich/govalidator/utils_benchmark_test.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/utils_benchmark_test.go
new file mode 100644
index 000000000..2ac4b6102
--- /dev/null
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/utils_benchmark_test.go
@@ -0,0 +1,17 @@
+package govalidator
+
+import "testing"
+
+func BenchmarkContains(b *testing.B) {
+	b.ResetTimer()
+	for n := 0; n < b.N; n++ {
+		Contains("a0b01c012deffghijklmnopqrstu0123456vwxyz", "0123456789")
+	}
+}
+
+func BenchmarkMatches(b *testing.B) {
+	b.ResetTimer()
+	for n := 0; n < b.N; n++ {
+		Matches("alfkjl12309fdjldfsa209jlksdfjLAKJjs9uJH234", "[\\w\\d]+")
+	}
+}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/utils_test.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/utils_test.go
similarity index 99%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/utils_test.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/utils_test.go
index 5ad8faeb4..97c97a534 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/utils_test.go
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/utils_test.go
@@ -270,6 +270,7 @@ func TestCamelCaseToUnderscore(t *testing.T) {
 		{"ABC", "a_b_c"},
 		{"1B", "1_b"},
 		{"foo_bar", "foo_bar"},
+		{"FooV2Bar", "foo_v2_bar"},
 	}
 	for _, test := range tests {
 		actual := CamelCaseToUnderscore(test.param)
@@ -395,7 +396,7 @@ func TestNormalizeEmail(t *testing.T) {
 		{`some.name.midd.lena.me.+extension@gmail.com`, `somenamemiddlename@gmail.com`},
 		{`some.name.midd.lena.me.+extension@googlemail.com`, `somenamemiddlename@gmail.com`},
 		{`some.name+extension@unknown.com`, `some.name+extension@unknown.com`},
-		{`hans@m端ller.com`, `hans@m端ller.com`},
+		// TODO: {`hans@m端ller.com`, `hans@m端ller.com`},
 		{`hans`, ``},
 	}
 	for _, test := range tests {
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/validator.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/validator.go
similarity index 96%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/validator.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/validator.go
index 4ddc9b046..f49431401 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/validator.go
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/validator.go
@@ -57,6 +57,37 @@ func IsEmail(str string) bool {
 	return rxEmail.MatchString(str)
 }
 
+// IsExistingEmail check if the string is an email of existing domain
+func IsExistingEmail(email string) bool {
+
+	if len(email) < 6 || len(email) > 254 {
+		return false
+	}
+	at := strings.LastIndex(email, "@")
+	if at <= 0 || at > len(email)-3 {
+		return false
+	}
+	user := email[:at]
+	host := email[at+1:]
+	if len(user) > 64 {
+		return false
+	}
+	if userDotRegexp.MatchString(user) || !userRegexp.MatchString(user) || !hostRegexp.MatchString(host) {
+		return false
+	}
+	switch host {
+	case "localhost", "example.com":
+		return true
+	}
+	if _, err := net.LookupMX(host); err != nil {
+		if _, err := net.LookupIP(host); err != nil {
+			return false
+		}
+	}
+
+	return true
+}
+
 // IsURL check if the string is an URL.
 func IsURL(str string) bool {
 	if str == "" || utf8.RuneCountInString(str) >= maxURLRuneCount || len(str) <= minURLRuneCount || strings.HasPrefix(str, ".") {
@@ -233,18 +264,18 @@ func IsUpperCase(str string) bool {
 
 // HasLowerCase check if the string contains at least 1 lowercase. Empty string is valid.
 func HasLowerCase(str string) bool {
-    if IsNull(str) {
-        return true
-    }
-    return rxHasLowerCase.MatchString(str)
+	if IsNull(str) {
+		return true
+	}
+	return rxHasLowerCase.MatchString(str)
 }
 
 // HasUpperCase check if the string contians as least 1 uppercase. Empty string is valid.
 func HasUpperCase(str string) bool {
-    if IsNull(str) {
-        return true
-    }
-    return rxHasUpperCase.MatchString(str)
+	if IsNull(str) {
+		return true
+	}
+	return rxHasUpperCase.MatchString(str)
 }
 
 // IsInt check if the string is an integer. Empty string is valid.
@@ -539,7 +570,7 @@ func IsHash(str string, algorithm string) bool {
 		return false
 	}
 
-	return Matches(str, "^[a-f0-9]{" + len + "}$")
+	return Matches(str, "^[a-f0-9]{"+len+"}$")
 }
 
 // IsDialString validates the given string for usage with the various Dial() functions
@@ -694,7 +725,9 @@ func ValidateStruct(s interface{}) (bool, error) {
 			continue // Private field
 		}
 		structResult := true
-		if valueField.Kind() == reflect.Struct && typeField.Tag.Get(tagName) != "-" {
+		if (valueField.Kind() == reflect.Struct ||
+			(valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) &&
+			typeField.Tag.Get(tagName) != "-" {
 			var err error
 			structResult, err = ValidateStruct(valueField.Interface())
 			if err != nil {
@@ -1010,7 +1043,11 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
 				delete(options, validatorSpec)
 
 				switch v.Kind() {
-				case reflect.String:
+				case reflect.String,
+					reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
+					reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
+					reflect.Float32, reflect.Float64:
+
 					field := fmt.Sprint(v) // make value into string, then validate with regex
 					if result := validatefunc(field, ps[1:]...); (!result && !negate) || (result && negate) {
 						if customMsgExists {
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/validator_test.go b/traffic_ops/vendor/github.com/asaskevich/govalidator/validator_test.go
similarity index 94%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/validator_test.go
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/validator_test.go
index 300badf8f..c7ec2be6c 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/validator_test.go
+++ b/traffic_ops/vendor/github.com/asaskevich/govalidator/validator_test.go
@@ -500,72 +500,71 @@ func TestIsUpperCase(t *testing.T) {
 }
 
 func TestHasLowerCase(t *testing.T) {
-    t.Parallel()
-
-    var tests = []struct {
-        param    string
-        expected bool
-    }{
-        {"", true},
-        {"abc123", true},
-        {"abc", true},
-        {"a b c", true},
-        {"abcß", true},
-        {"abcẞ", true},
-        {"ABCẞ", false},
-        {"tr竪s 端ber", true},
-        {"fooBar", true},
-        {"123ABC", false},
-        {"ABC123", false},
-        {"ABC", false},
-        {"S T R", false},
-        {"fooBar", true},
-        {"abacaba123", true},
-        {"FÒÔBÀŘ", false},
-        {"fòôbàř", true},
-        {"fÒÔBÀŘ", true},
-        
-    }
-    for _, test := range tests {
-        actual := HasLowerCase(test.param)
-        if actual != test.expected {
-            t.Errorf("Expected HasLowerCase(%q) to be %v, got %v", test.param, test.expected, actual)
-        }
-    }
+	t.Parallel()
+
+	var tests = []struct {
+		param    string
+		expected bool
+	}{
+		{"", true},
+		{"abc123", true},
+		{"abc", true},
+		{"a b c", true},
+		{"abcß", true},
+		{"abcẞ", true},
+		{"ABCẞ", false},
+		{"tr竪s 端ber", true},
+		{"fooBar", true},
+		{"123ABC", false},
+		{"ABC123", false},
+		{"ABC", false},
+		{"S T R", false},
+		{"fooBar", true},
+		{"abacaba123", true},
+		{"FÒÔBÀŘ", false},
+		{"fòôbàř", true},
+		{"fÒÔBÀŘ", true},
+	}
+	for _, test := range tests {
+		actual := HasLowerCase(test.param)
+		if actual != test.expected {
+			t.Errorf("Expected HasLowerCase(%q) to be %v, got %v", test.param, test.expected, actual)
+		}
+	}
 }
 
 func TestHasUpperCase(t *testing.T) {
-    t.Parallel()
-
-    var tests = []struct {
-        param    string
-        expected bool
-    }{
-        {"", true},
-        {"abc123", false},
-        {"abc", false},
-        {"a b c", false},
-        {"abcß", false},
-        {"abcẞ", false},
-        {"ABCẞ", true},
-        {"tr竪s 端ber", false},
-        {"fooBar", true},
-        {"123ABC", true},
-        {"ABC123", true},
-        {"ABC", true},
-        {"S T R", true},
-        {"fooBar", true},
-        {"abacaba123", false},
-        {"FÒÔBÀŘ", true},
-        {"fòôbàř", false},
-        {"Fòôbàř", true},
-    }
-    for _, test := range tests {
-        actual := HasUpperCase(test.param)
-        if actual != test.expected {
-            t.Errorf("Expected HasUpperCase(%q) to be %v, got %v", test.param, test.expected, actual)
-        }
-    }
+	t.Parallel()
+
+	var tests = []struct {
+		param    string
+		expected bool
+	}{
+		{"", true},
+		{"abc123", false},
+		{"abc", false},
+		{"a b c", false},
+		{"abcß", false},
+		{"abcẞ", false},
+		{"ABCẞ", true},
+		{"tr竪s 端ber", false},
+		{"fooBar", true},
+		{"123ABC", true},
+		{"ABC123", true},
+		{"ABC", true},
+		{"S T R", true},
+		{"fooBar", true},
+		{"abacaba123", false},
+		{"FÒÔBÀŘ", true},
+		{"fòôbàř", false},
+		{"Fòôbàř", true},
+	}
+	for _, test := range tests {
+		actual := HasUpperCase(test.param)
+		if actual != test.expected {
+			t.Errorf("Expected HasUpperCase(%q) to be %v, got %v", test.param, test.expected, actual)
+		}
+	}
 }
 
 func TestIsInt(t *testing.T) {
@@ -605,13 +604,12 @@ func TestIsInt(t *testing.T) {
 	}
 }
 
-
 func TestIsHash(t *testing.T) {
 	t.Parallel()
 
 	var tests = []struct {
 		param    string
-		algo 	 string
+		algo     string
 		expected bool
 	}{
 		{"3ca25ae354e192b26879f651a51d92aa8a34d8d3", "sha1", true},
@@ -636,6 +634,33 @@ func TestIsHash(t *testing.T) {
 	}
 }
 
+func TestIsExistingEmail(t *testing.T) {
+	t.Parallel()
+
+	var tests = []struct {
+		param    string
+		expected bool
+	}{
+		{"", false},
+		{"foo@bar.com", true},
+		{"foo@bar.com.au", true},
+		{"foo+bar@bar.com", true},
+		{"foo@bar.coffee", true},
+		{"foo@bar.coffee..coffee", false},
+		{"invalidemail@", false},
+		{"invalid.com", false},
+		{"@invalid.com", false},
+		{"NathAn.daVIeS@DomaIn.cOM", true},
+		{"NATHAN.DAVIES@DOMAIN.CO.UK", true},
+	}
+	for _, test := range tests {
+		actual := IsExistingEmail(test.param)
+		if actual != test.expected {
+			t.Errorf("Expected IsExistingEmail(%q) to be %v, got %v", test.param, test.expected, actual)
+		}
+	}
+}
+
 func TestIsEmail(t *testing.T) {
 	t.Parallel()
 
@@ -813,7 +838,6 @@ func TestIsRequestURL(t *testing.T) {
 		{"http://www.foo---bar.com/", true},
 		{"mailto:someone@example.com", true},
 		{"irc://irc.server.org/channel", true},
-		{"irc://#channel@network", true},
 		{"/abs/test/dir", false},
 		{"./rel/test/dir", false},
 	}
@@ -862,7 +886,6 @@ func TestIsRequestURI(t *testing.T) {
 		{"http://www.foo---bar.com/", true},
 		{"mailto:someone@example.com", true},
 		{"irc://irc.server.org/channel", true},
-		{"irc://#channel@network", true},
 		{"/abs/test/dir", true},
 		{"./rel/test/dir", false},
 	}
@@ -2186,12 +2209,12 @@ type MissingValidationDeclarationStruct struct {
 }
 
 type FieldRequiredByDefault struct {
-    Email string `valid:"email"`
+	Email string `valid:"email"`
 }
 
 type MultipleFieldsRequiredByDefault struct {
-    Url string `valid:"url"`
-    Email string `valid:"email"`
+	Url   string `valid:"url"`
+	Email string `valid:"email"`
 }
 
 type FieldsRequiredByDefaultButExemptStruct struct {
@@ -2231,43 +2254,43 @@ func TestValidateMissingValidationDeclarationStruct(t *testing.T) {
 }
 
 func TestFieldRequiredByDefault(t *testing.T) {
-    var tests = []struct {
-        param    FieldRequiredByDefault
-        expected bool
-    }{
-        {FieldRequiredByDefault{}, false},
-    }
-    SetFieldsRequiredByDefault(true)
-    for _, test := range tests {
-        actual, err := ValidateStruct(test.param)
-        if actual != test.expected {
-            t.Errorf("Expected ValidateStruct(%q) to be %v, got %v", test.param, test.expected, actual)
-            if err != nil {
-                t.Errorf("Got Error on ValidateStruct(%q): %s", test.param, err)
-            }
-        }
-    }
-    SetFieldsRequiredByDefault(false)
+	var tests = []struct {
+		param    FieldRequiredByDefault
+		expected bool
+	}{
+		{FieldRequiredByDefault{}, false},
+	}
+	SetFieldsRequiredByDefault(true)
+	for _, test := range tests {
+		actual, err := ValidateStruct(test.param)
+		if actual != test.expected {
+			t.Errorf("Expected ValidateStruct(%q) to be %v, got %v", test.param, test.expected, actual)
+			if err != nil {
+				t.Errorf("Got Error on ValidateStruct(%q): %s", test.param, err)
+			}
+		}
+	}
+	SetFieldsRequiredByDefault(false)
 }
 
 func TestMultipleFieldsRequiredByDefault(t *testing.T) {
-    var tests = []struct {
-        param    MultipleFieldsRequiredByDefault
-        expected bool
-    }{
-        {MultipleFieldsRequiredByDefault{}, false},
-    }
-    SetFieldsRequiredByDefault(true)
-    for _, test := range tests {
-        actual, err := ValidateStruct(test.param)
-        if actual != test.expected {
-            t.Errorf("Expected ValidateStruct(%q) to be %v, got %v", test.param, test.expected, actual)
-            if err != nil {
-                t.Errorf("Got Error on ValidateStruct(%q): %s", test.param, err)
-            }
-        }
-    }
-    SetFieldsRequiredByDefault(false)
+	var tests = []struct {
+		param    MultipleFieldsRequiredByDefault
+		expected bool
+	}{
+		{MultipleFieldsRequiredByDefault{}, false},
+	}
+	SetFieldsRequiredByDefault(true)
+	for _, test := range tests {
+		actual, err := ValidateStruct(test.param)
+		if actual != test.expected {
+			t.Errorf("Expected ValidateStruct(%q) to be %v, got %v", test.param, test.expected, actual)
+			if err != nil {
+				t.Errorf("Got Error on ValidateStruct(%q): %s", test.param, err)
+			}
+		}
+	}
+	SetFieldsRequiredByDefault(false)
 }
 
 func TestFieldsRequiredByDefaultButExemptStruct(t *testing.T) {
@@ -2653,6 +2676,7 @@ func TestValidateStruct(t *testing.T) {
 		{User{"John", "", "12345", 0, &Address{"Street", "123456789"}, []Address{{"Street", "ABC456D89"}, {"Street", "123456"}}}, false},
 		{UserValid{"John", "john@yahoo.com", "123G#678", 20, &Address{"Street", "123456"}, []Address{{"Street", "123456"}, {"Street", "123456"}}}, true},
 		{UserValid{"John", "john!yahoo.com", "12345678", 20, &Address{"Street", "ABC456D89"}, []Address{}}, false},
+		{UserValid{"John", "john@yahoo.com", "12345678", 20, &Address{"Street", "123456xxx"}, []Address{{"Street", "123456"}, {"Street", "123456"}}}, false},
 		{UserValid{"John", "john!yahoo.com", "12345678", 20, &Address{"Street", "ABC456D89"}, []Address{{"Street", "ABC456D89"}, {"Street", "123456"}}}, false},
 		{UserValid{"John", "", "12345", 0, &Address{"Street", "123456789"}, []Address{{"Street", "ABC456D89"}, {"Street", "123456"}}}, false},
 		{nil, true},
@@ -2970,6 +2994,73 @@ func ExampleValidateStruct() {
 	println(result)
 }
 
+func TestValidateStructParamValidatorInt(t *testing.T) {
+	type Test1 struct {
+		Int   int   `valid:"range(1|10)"`
+		Int8  int8  `valid:"range(1|10)"`
+		Int16 int16 `valid:"range(1|10)"`
+		Int32 int32 `valid:"range(1|10)"`
+		Int64 int64 `valid:"range(1|10)"`
+
+		Uint   uint   `valid:"range(1|10)"`
+		Uint8  uint8  `valid:"range(1|10)"`
+		Uint16 uint16 `valid:"range(1|10)"`
+		Uint32 uint32 `valid:"range(1|10)"`
+		Uint64 uint64 `valid:"range(1|10)"`
+
+		Float32 float32 `valid:"range(1|10)"`
+		Float64 float64 `valid:"range(1|10)"`
+	}
+	test1Ok := &Test1{5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}
+	test1NotOk := &Test1{11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}
+
+	_, err := ValidateStruct(test1Ok)
+	if err != nil {
+		t.Errorf("Test failed: %s", err)
+	}
+
+	_, err = ValidateStruct(test1NotOk)
+	if err == nil {
+		t.Errorf("Test failed: nil")
+	}
+
+	type Test2 struct {
+		Int   int   `valid:"in(1|10)"`
+		Int8  int8  `valid:"in(1|10)"`
+		Int16 int16 `valid:"in(1|10)"`
+		Int32 int32 `valid:"in(1|10)"`
+		Int64 int64 `valid:"in(1|10)"`
+
+		Uint   uint   `valid:"in(1|10)"`
+		Uint8  uint8  `valid:"in(1|10)"`
+		Uint16 uint16 `valid:"in(1|10)"`
+		Uint32 uint32 `valid:"in(1|10)"`
+		Uint64 uint64 `valid:"in(1|10)"`
+
+		Float32 float32 `valid:"in(1|10)"`
+		Float64 float64 `valid:"in(1|10)"`
+	}
+
+	test2Ok1 := &Test2{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
+	test2Ok2 := &Test2{10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}
+	test2NotOk := &Test2{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}
+
+	_, err = ValidateStruct(test2Ok1)
+	if err != nil {
+		t.Errorf("Test failed: %s", err)
+	}
+
+	_, err = ValidateStruct(test2Ok2)
+	if err != nil {
+		t.Errorf("Test failed: %s", err)
+	}
+
+	_, err = ValidateStruct(test2NotOk)
+	if err == nil {
+		t.Errorf("Test failed: nil")
+	}
+}
+
 func TestIsCIDR(t *testing.T) {
 	t.Parallel()
 
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/wercker.yml b/traffic_ops/vendor/github.com/asaskevich/govalidator/wercker.yml
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/asaskevich/govalidator/wercker.yml
rename to traffic_ops/vendor/github.com/asaskevich/govalidator/wercker.yml
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/README.md b/traffic_ops/vendor/github.com/basho/backoff/README.md
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/README.md
rename to traffic_ops/vendor/github.com/basho/backoff/README.md
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/backoff.go b/traffic_ops/vendor/github.com/basho/backoff/backoff.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/backoff.go
rename to traffic_ops/vendor/github.com/basho/backoff/backoff.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/backoff_test.go b/traffic_ops/vendor/github.com/basho/backoff/backoff_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/backoff/backoff_test.go
rename to traffic_ops/vendor/github.com/basho/backoff/backoff_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.github/CONTRIBUTING.md b/traffic_ops/vendor/github.com/basho/riak-go-client/.github/CONTRIBUTING.md
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.github/CONTRIBUTING.md
rename to traffic_ops/vendor/github.com/basho/riak-go-client/.github/CONTRIBUTING.md
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.github/ISSUE_TEMPLATE.md b/traffic_ops/vendor/github.com/basho/riak-go-client/.github/ISSUE_TEMPLATE.md
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.github/ISSUE_TEMPLATE.md
rename to traffic_ops/vendor/github.com/basho/riak-go-client/.github/ISSUE_TEMPLATE.md
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.github/PULL_REQUEST_TEMPLATE.md b/traffic_ops/vendor/github.com/basho/riak-go-client/.github/PULL_REQUEST_TEMPLATE.md
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/.github/PULL_REQUEST_TEMPLATE.md
rename to traffic_ops/vendor/github.com/basho/riak-go-client/.github/PULL_REQUEST_TEMPLATE.md
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/LICENSE b/traffic_ops/vendor/github.com/basho/riak-go-client/LICENSE
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/LICENSE
rename to traffic_ops/vendor/github.com/basho/riak-go-client/LICENSE
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/Makefile b/traffic_ops/vendor/github.com/basho/riak-go-client/Makefile
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/Makefile
rename to traffic_ops/vendor/github.com/basho/riak-go-client/Makefile
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/NOTICE b/traffic_ops/vendor/github.com/basho/riak-go-client/NOTICE
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/NOTICE
rename to traffic_ops/vendor/github.com/basho/riak-go-client/NOTICE
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/README.md b/traffic_ops/vendor/github.com/basho/riak-go-client/README.md
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/README.md
rename to traffic_ops/vendor/github.com/basho/riak-go-client/README.md
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/RELNOTES.md b/traffic_ops/vendor/github.com/basho/riak-go-client/RELNOTES.md
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/RELNOTES.md
rename to traffic_ops/vendor/github.com/basho/riak-go-client/RELNOTES.md
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/async.go b/traffic_ops/vendor/github.com/basho/riak-go-client/async.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/async.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/async.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/benchmark_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/benchmark_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/benchmark_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/benchmark_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/build/protogen b/traffic_ops/vendor/github.com/basho/riak-go-client/build/protogen
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/build/protogen
rename to traffic_ops/vendor/github.com/basho/riak-go-client/build/protogen
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/client.go b/traffic_ops/vendor/github.com/basho/riak-go-client/client.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/client.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/client.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/client_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/client_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/client_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/client_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/client_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/client_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/client_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/client_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/cluster.go b/traffic_ops/vendor/github.com/basho/riak-go-client/cluster.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/cluster.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/cluster.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/cluster_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/cluster_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/cluster_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/cluster_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/cluster_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/cluster_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/cluster_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/cluster_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/command.go b/traffic_ops/vendor/github.com/basho/riak-go-client/command.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/command.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/command.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/command_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/command_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/command_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/command_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/command_rpb_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/command_rpb_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/command_rpb_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/command_rpb_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/command_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/command_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/command_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/command_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection.go b/traffic_ops/vendor/github.com/basho/riak-go-client/connection.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/connection.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/connection_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/connection_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_manager.go b/traffic_ops/vendor/github.com/basho/riak-go-client/connection_manager.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_manager.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/connection_manager.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_manager_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/connection_manager_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_manager_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/connection_manager_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_manager_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/connection_manager_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_manager_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/connection_manager_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/connection_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/connection_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/connection_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/consts.go b/traffic_ops/vendor/github.com/basho/riak-go-client/consts.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/consts.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/consts.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/crdt_commands.go b/traffic_ops/vendor/github.com/basho/riak-go-client/crdt_commands.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/crdt_commands.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/crdt_commands.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/crdt_commands_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/crdt_commands_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/crdt_commands_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/crdt_commands_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/crdt_commands_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/crdt_commands_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/crdt_commands_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/crdt_commands_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/doc.go b/traffic_ops/vendor/github.com/basho/riak-go-client/doc.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/doc.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/doc.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/error.go b/traffic_ops/vendor/github.com/basho/riak-go-client/error.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/error.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/error.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/error_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/error_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/error_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/error_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/cm-client/main.go b/traffic_ops/vendor/github.com/basho/riak-go-client/examples/cm-client/main.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/cm-client/main.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/examples/cm-client/main.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/2i/main.go b/traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/2i/main.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/2i/main.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/2i/main.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/basics/main.go b/traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/basics/main.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/basics/main.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/basics/main.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/conflict-resolution/main.go b/traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/conflict-resolution/main.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/conflict-resolution/main.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/conflict-resolution/main.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/data-types/hyperloglog.go b/traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/data-types/hyperloglog.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/data-types/hyperloglog.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/data-types/hyperloglog.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/search/main.go b/traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/search/main.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/search/main.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/search/main.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/updates/main.go b/traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/updates/main.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/dev/using/updates/main.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/examples/dev/using/updates/main.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/gh-47/main.go b/traffic_ops/vendor/github.com/basho/riak-go-client/examples/gh-47/main.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/examples/gh-47/main.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/examples/gh-47/main.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/gh_issues_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/gh_issues_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/gh_issues_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/gh_issues_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/globals_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/globals_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/globals_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/globals_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/globals_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/globals_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/globals_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/globals_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/kv_commands.go b/traffic_ops/vendor/github.com/basho/riak-go-client/kv_commands.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/kv_commands.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/kv_commands.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/kv_commands_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/kv_commands_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/kv_commands_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/kv_commands_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/kv_commands_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/kv_commands_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/kv_commands_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/kv_commands_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/locatable.go b/traffic_ops/vendor/github.com/basho/riak-go-client/locatable.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/locatable.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/locatable.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/logging.go b/traffic_ops/vendor/github.com/basho/riak-go-client/logging.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/logging.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/logging.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/logging_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/logging_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/logging_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/logging_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/make.cmd b/traffic_ops/vendor/github.com/basho/riak-go-client/make.cmd
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/make.cmd
rename to traffic_ops/vendor/github.com/basho/riak-go-client/make.cmd
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/make.ps1 b/traffic_ops/vendor/github.com/basho/riak-go-client/make.ps1
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/make.ps1
rename to traffic_ops/vendor/github.com/basho/riak-go-client/make.ps1
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/messages.go b/traffic_ops/vendor/github.com/basho/riak-go-client/messages.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/messages.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/messages.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/misc_commands.go b/traffic_ops/vendor/github.com/basho/riak-go-client/misc_commands.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/misc_commands.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/misc_commands.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/misc_commands_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/misc_commands_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/misc_commands_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/misc_commands_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/misc_commands_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/misc_commands_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/misc_commands_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/misc_commands_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/net.go b/traffic_ops/vendor/github.com/basho/riak-go-client/net.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/net.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/net.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node.go b/traffic_ops/vendor/github.com/basho/riak-go-client/node.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/node.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/node_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/node_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node_manager.go b/traffic_ops/vendor/github.com/basho/riak-go-client/node_manager.go
similarity index 80%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node_manager.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/node_manager.go
index 0cfbbe422..0945900f6 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node_manager.go
+++ b/traffic_ops/vendor/github.com/basho/riak-go-client/node_manager.go
@@ -67,17 +67,6 @@ func (nm *defaultNodeManager) ExecuteOnNode(nodes []*Node, command Command, prev
 			break
 		}
 
-		// Ran into a problem here when no node could sucessfully execute the command
-		// without error.  Got into an infinite loop here due to using self signed certs
-		// on all the nodes without properly setting up TLS to accept in-secure certs.
-		//
-		// returning the error here to the cluster allows to it requeue this command and track
-		// the number of execution attempts.  Once the configured 'ExecutionAttempts' has been
-		// exceeded. The cluster then returns the error to the client.
-		if err != nil {
-			return executed, err
-		}
-
 		nm.RLock()
 		if startingIndex == nm.nodeIndex {
 			nm.RUnlock()
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/node_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/node_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/node_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/object.go b/traffic_ops/vendor/github.com/basho/riak-go-client/object.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/object.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/object.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/object_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/object_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/object_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/object_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/queue.go b/traffic_ops/vendor/github.com/basho/riak-go-client/queue.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/queue.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/queue.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/queue_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/queue_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/queue_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/queue_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak/riak.pb.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak/riak.pb.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak/riak.pb.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak/riak.pb.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak/riak_misc.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak/riak_misc.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak/riak_misc.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak/riak_misc.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_dt/riak_dt.pb.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_dt/riak_dt.pb.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_dt/riak_dt.pb.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_dt/riak_dt.pb.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_dt/riak_dt_misc.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_dt/riak_dt_misc.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_dt/riak_dt_misc.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_dt/riak_dt_misc.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_kv/riak_kv.pb.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_kv/riak_kv.pb.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_kv/riak_kv.pb.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_kv/riak_kv.pb.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_kv/riak_kv_misc.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_kv/riak_kv_misc.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_kv/riak_kv_misc.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_kv/riak_kv_misc.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_search/riak_search.pb.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_search/riak_search.pb.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_search/riak_search.pb.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_search/riak_search.pb.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_ts/riak_ts.pb.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_ts/riak_ts.pb.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_ts/riak_ts.pb.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_ts/riak_ts.pb.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_yokozuna/riak_yokozuna.pb.go b/traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_yokozuna/riak_yokozuna.pb.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/rpb/riak_yokozuna/riak_yokozuna.pb.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/rpb/riak_yokozuna/riak_yokozuna.pb.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/security_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/security_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/security_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/security_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/states.go b/traffic_ops/vendor/github.com/basho/riak-go-client/states.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/states.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/states.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/states_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/states_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/states_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/states_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/ts_commands.go b/traffic_ops/vendor/github.com/basho/riak-go-client/ts_commands.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/ts_commands.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/ts_commands.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/ts_commands_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/ts_commands_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/ts_commands_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/ts_commands_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/ts_commands_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/ts_commands_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/ts_commands_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/ts_commands_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/yz_commands.go b/traffic_ops/vendor/github.com/basho/riak-go-client/yz_commands.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/yz_commands.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/yz_commands.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/yz_commands_i_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/yz_commands_i_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/yz_commands_i_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/yz_commands_i_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/yz_commands_test.go b/traffic_ops/vendor/github.com/basho/riak-go-client/yz_commands_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/basho/riak-go-client/yz_commands_test.go
rename to traffic_ops/vendor/github.com/basho/riak-go-client/yz_commands_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/LICENSE b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/LICENSE
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/LICENSE
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/LICENSE
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/README.md b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/README.md
similarity index 99%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/README.md
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/README.md
index 1841a7cb4..5f25bfadd 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/README.md
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/README.md
@@ -443,6 +443,8 @@ Below is the whole list of the rules provided by the `is` package:
 * `IP`: validates if a string is a valid IP address (either version 4 or 6)
 * `IPv4`: validates if a string is a valid version 4 IP address
 * `IPv6`: validates if a string is a valid version 6 IP address
+* `Subdomain`: validates if a string is valid subdomain
+* `Domain`: validates if a string is valid domain
 * `DNSName`: validates if a string is valid DNS name
 * `Host`: validates if a string is a valid IP (both v4 and v6) or a valid DNS name
 * `Port`: validates if a string is a valid port number
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/UPGRADE.md b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/UPGRADE.md
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/UPGRADE.md
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/UPGRADE.md
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/date.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/date.go
similarity index 85%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/date.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/date.go
index 2dc3d583a..432e03515 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/date.go
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/date.go
@@ -9,7 +9,7 @@ import (
 	"time"
 )
 
-type dateRule struct {
+type DateRule struct {
 	layout       string
 	min, max     time.Time
 	message      string
@@ -27,8 +27,8 @@ type dateRule struct {
 // the specified date range.
 //
 // An empty value is considered valid. Use the Required rule to make sure a value is not empty.
-func Date(layout string) *dateRule {
-	return &dateRule{
+func Date(layout string) *DateRule {
+	return &DateRule{
 		layout:       layout,
 		message:      "must be a valid date",
 		rangeMessage: "the data is out of range",
@@ -36,31 +36,31 @@ func Date(layout string) *dateRule {
 }
 
 // Error sets the error message that is used when the value being validated is not a valid date.
-func (r *dateRule) Error(message string) *dateRule {
+func (r *DateRule) Error(message string) *DateRule {
 	r.message = message
 	return r
 }
 
 // RangeError sets the error message that is used when the value being validated is out of the specified Min/Max date range.
-func (r *dateRule) RangeError(message string) *dateRule {
+func (r *DateRule) RangeError(message string) *DateRule {
 	r.rangeMessage = message
 	return r
 }
 
 // Min sets the minimum date range. A zero value means skipping the minimum range validation.
-func (r *dateRule) Min(min time.Time) *dateRule {
+func (r *DateRule) Min(min time.Time) *DateRule {
 	r.min = min
 	return r
 }
 
 // Max sets the maximum date range. A zero value means skipping the maximum range validation.
-func (r *dateRule) Max(max time.Time) *dateRule {
+func (r *DateRule) Max(max time.Time) *DateRule {
 	r.max = max
 	return r
 }
 
 // Validate checks if the given value is a valid date.
-func (r *dateRule) Validate(value interface{}) error {
+func (r *DateRule) Validate(value interface{}) error {
 	value, isNil := Indirect(value)
 	if isNil || IsEmpty(value) {
 		return nil
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/date_test.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/date_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/date_test.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/date_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/error.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/error.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/error.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/error.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/error_test.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/error_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/error_test.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/error_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/example_test.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/example_test.go
similarity index 99%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/example_test.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/example_test.go
index c16face37..44bb7fa87 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/example_test.go
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/example_test.go
@@ -127,4 +127,4 @@ func Example_five() {
 	fmt.Println(err)
 	// Output:
 	// Level: cannot be blank; Name: cannot be blank.
-}
\ No newline at end of file
+}
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/in.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/in.go
similarity index 83%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/in.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/in.go
index 9673dd0ba..33ee5e534 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/in.go
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/in.go
@@ -9,20 +9,20 @@ import "errors"
 // In returns a validation rule that checks if a value can be found in the given list of values.
 // Note that the value being checked and the possible range of values must be of the same type.
 // An empty value is considered valid. Use the Required rule to make sure a value is not empty.
-func In(values ...interface{}) *inRule {
-	return &inRule{
+func In(values ...interface{}) *InRule {
+	return &InRule{
 		elements: values,
 		message:  "must be a valid value",
 	}
 }
 
-type inRule struct {
+type InRule struct {
 	elements []interface{}
 	message  string
 }
 
 // Validate checks if the given value is valid or not.
-func (r *inRule) Validate(value interface{}) error {
+func (r *InRule) Validate(value interface{}) error {
 	value, isNil := Indirect(value)
 	if isNil || IsEmpty(value) {
 		return nil
@@ -37,7 +37,7 @@ func (r *inRule) Validate(value interface{}) error {
 }
 
 // Error sets the error message for the rule.
-func (r *inRule) Error(message string) *inRule {
+func (r *InRule) Error(message string) *InRule {
 	r.message = message
 	return r
 }
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/in_test.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/in_test.go
similarity index 94%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/in_test.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/in_test.go
index ad0c87be8..24201f1f4 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/in_test.go
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/in_test.go
@@ -11,7 +11,7 @@ import (
 )
 
 func TestIn(t *testing.T) {
-	var v int = 1
+	var v = 1
 	var v2 *int
 	tests := []struct {
 		tag    string
@@ -36,7 +36,7 @@ func TestIn(t *testing.T) {
 	}
 }
 
-func Test_inRule_Error(t *testing.T) {
+func Test_InRule_Error(t *testing.T) {
 	r := In(1, 2, 3)
 	assert.Equal(t, "must be a valid value", r.message)
 	r.Error("123")
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/is/rules.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/is/rules.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/is/rules.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/is/rules.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/is/rules_test.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/is/rules_test.go
similarity index 100%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/is/rules_test.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/is/rules_test.go
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/length.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/length.go
similarity index 89%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/length.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/length.go
index 752df45d5..74c2ae76b 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/length.go
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/length.go
@@ -14,7 +14,7 @@ import (
 // If max is 0, it means there is no upper bound for the length.
 // This rule should only be used for validating strings, slices, maps, and arrays.
 // An empty value is considered valid. Use the Required rule to make sure a value is not empty.
-func Length(min, max int) *lengthRule {
+func Length(min, max int) *LengthRule {
 	message := "the value must be empty"
 	if min == 0 && max > 0 {
 		message = fmt.Sprintf("the length must be no more than %v", max)
@@ -23,7 +23,7 @@ func Length(min, max int) *lengthRule {
 	} else if min > 0 && max > 0 {
 		message = fmt.Sprintf("the length must be between %v and %v", min, max)
 	}
-	return &lengthRule{
+	return &LengthRule{
 		min:     min,
 		max:     max,
 		message: message,
@@ -35,20 +35,20 @@ func Length(min, max int) *lengthRule {
 // This rule should only be used for validating strings, slices, maps, and arrays.
 // An empty value is considered valid. Use the Required rule to make sure a value is not empty.
 // If the value being validated is not a string, the rule works the same as Length.
-func RuneLength(min, max int) *lengthRule {
+func RuneLength(min, max int) *LengthRule {
 	r := Length(min, max)
 	r.rune = true
 	return r
 }
 
-type lengthRule struct {
+type LengthRule struct {
 	min, max int
 	message  string
 	rune     bool
 }
 
 // Validate checks if the given value is valid or not.
-func (v *lengthRule) Validate(value interface{}) error {
+func (v *LengthRule) Validate(value interface{}) error {
 	value, isNil := Indirect(value)
 	if isNil || IsEmpty(value) {
 		return nil
@@ -71,7 +71,7 @@ func (v *lengthRule) Validate(value interface{}) error {
 }
 
 // Error sets the error message for the rule.
-func (v *lengthRule) Error(message string) *lengthRule {
+func (v *LengthRule) Error(message string) *LengthRule {
 	v.message = message
 	return v
 }
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/length_test.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/length_test.go
similarity index 98%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/length_test.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/length_test.go
index 5eda7317c..76c53bb03 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/length_test.go
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/length_test.go
@@ -75,7 +75,7 @@ func TestRuneLength(t *testing.T) {
 	}
 }
 
-func Test_lengthRule_Error(t *testing.T) {
+func Test_LengthRule_Error(t *testing.T) {
 	r := Length(10, 20)
 	assert.Equal(t, "the length must be between 10 and 20", r.message)
 
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/match.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/match.go
similarity index 84%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/match.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/match.go
index 02aa4fb62..4a842bede 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/match.go
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/match.go
@@ -12,20 +12,20 @@ import (
 // Match returns a validation rule that checks if a value matches the specified regular expression.
 // This rule should only be used for validating strings and byte slices, or a validation error will be reported.
 // An empty value is considered valid. Use the Required rule to make sure a value is not empty.
-func Match(re *regexp.Regexp) *matchRule {
-	return &matchRule{
+func Match(re *regexp.Regexp) *MatchRule {
+	return &MatchRule{
 		re:      re,
 		message: "must be in a valid format",
 	}
 }
 
-type matchRule struct {
+type MatchRule struct {
 	re      *regexp.Regexp
 	message string
 }
 
 // Validate checks if the given value is valid or not.
-func (v *matchRule) Validate(value interface{}) error {
+func (v *MatchRule) Validate(value interface{}) error {
 	value, isNil := Indirect(value)
 	if isNil {
 		return nil
@@ -41,7 +41,7 @@ func (v *matchRule) Validate(value interface{}) error {
 }
 
 // Error sets the error message for the rule.
-func (v *matchRule) Error(message string) *matchRule {
+func (v *MatchRule) Error(message string) *MatchRule {
 	v.message = message
 	return v
 }
diff --git a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/match_test.go b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/match_test.go
similarity index 95%
rename from traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/match_test.go
rename to traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/match_test.go
index 98075e658..e3363032c 100644
--- a/traffic_ops/traffic_ops_golang/vendor/github.com/go-ozzo/ozzo-validation/match_test.go
+++ b/traffic_ops/vendor/github.com/go-ozzo/ozzo-validation/match_test.go
@@ -36,7 +36,7 @@ func TestMatch(t *testing.T) {
 	}
 }

  (This diff was longer than 20,000 lines, and has been truncated...)


 

----------------------------------------------------------------
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