You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by mi...@apache.org on 2016/11/07 22:23:43 UTC

[22/26] incubator-trafficcontrol git commit: merge master

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/infrastructure/test/apitest/apitest.go
----------------------------------------------------------------------
diff --git a/infrastructure/test/apitest/apitest.go b/infrastructure/test/apitest/apitest.go
index 7ca4a21..584d48c 100644
--- a/infrastructure/test/apitest/apitest.go
+++ b/infrastructure/test/apitest/apitest.go
@@ -1,5 +1,25 @@
 package apitest
 
+/*
+ * 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 (
 	"bytes"
 	"crypto/tls"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/infrastructure/test/environment/environment.go
----------------------------------------------------------------------
diff --git a/infrastructure/test/environment/environment.go b/infrastructure/test/environment/environment.go
index 262dae5..752c853 100644
--- a/infrastructure/test/environment/environment.go
+++ b/infrastructure/test/environment/environment.go
@@ -1,5 +1,25 @@
 package environment
 
+/*
+ * 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 (
 	"encoding/json"
 	"io/ioutil"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/infrastructure/test/ui/traffic_ops/traffic_ops_test.go
----------------------------------------------------------------------
diff --git a/infrastructure/test/ui/traffic_ops/traffic_ops_test.go b/infrastructure/test/ui/traffic_ops/traffic_ops_test.go
index d54f892..1a9e2f0 100644
--- a/infrastructure/test/ui/traffic_ops/traffic_ops_test.go
+++ b/infrastructure/test/ui/traffic_ops/traffic_ops_test.go
@@ -1,5 +1,25 @@
 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 (
 	"testing"
 	"time"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/changelog.pl
----------------------------------------------------------------------
diff --git a/misc/changelog.pl b/misc/changelog.pl
index 35c03e1..edbffc3 100755
--- a/misc/changelog.pl
+++ b/misc/changelog.pl
@@ -1,6 +1,5 @@
 #!/usr/bin/perl
 #
-# Copyright 2015 Comcast Cable Communications Management, LLC
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/kickstart_create_network_line.py
----------------------------------------------------------------------
diff --git a/misc/kickstart_create_network_line.py b/misc/kickstart_create_network_line.py
index 66c85c7..ee1378e 100755
--- a/misc/kickstart_create_network_line.py
+++ b/misc/kickstart_create_network_line.py
@@ -1,5 +1,4 @@
 #!/usr/bin/python
-# Copyright 2015 Comcast Cable Communications Management, LLC
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/kickstart_drive_config.sh
----------------------------------------------------------------------
diff --git a/misc/kickstart_drive_config.sh b/misc/kickstart_drive_config.sh
index bf2e2a1..1d6b824 100644
--- a/misc/kickstart_drive_config.sh
+++ b/misc/kickstart_drive_config.sh
@@ -1,6 +1,5 @@
 #!/bin/bash
 
-# Copyright 2015 Comcast Cable Communications Management, LLC
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/release.pl
----------------------------------------------------------------------
diff --git a/misc/release.pl b/misc/release.pl
index 8f7d9ef..e46e443 100755
--- a/misc/release.pl
+++ b/misc/release.pl
@@ -1,6 +1,5 @@
 #!/usr/bin/env perl 
 #
-# Copyright 2015 Comcast Cable Communications Management, LLC
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -33,7 +32,7 @@ my $usage = "\n"
 	. "--gpg-key          - Your gpg-key id. ie: 774ACED1\n"
 	. "--release-no       - The release-no name you want to cut. ie: 1.1.0\n"
 	. "--git-hash         - (optional) The git hash that will be used to reference the release. ie: da4aab57d \n"
-	. "--git-remote-url   - (optional) Overrides the git repo URL where the release will be pulled and sent (mostly for testing). ie: git\@github.com:yourrepo/traffic_control.git \n"
+	. "--git-remote-url   - (optional) Overrides the git repo URL where the release will be pulled and sent (mostly for testing). ie: git\@github.com:yourrepo/incubator-trafficcontrol.git \n"
 	. "--dry-run          - (optional) Simulation mode which will NOT apply any changes. \n"
 	. "--debug            - (optional) Show debug output\n"
 	. "\nArguments:   \n\n"
@@ -44,7 +43,7 @@ my $usage = "\n"
 my $git_remote_name = 'official';
 
 #my $git_remote_url = 'git@github.com:Comcast/traffic_control.git';
-my $git_remote_url = 'git@github.com:Comcast/traffic_control.git';
+my $git_remote_url = 'https://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol.git';
 
 my $gpg_key;
 my $release_no;
@@ -207,7 +206,7 @@ sub check_branch_exists {
 
 sub clone_repo_to_tmp {
 	my $tmp_dir = "/tmp";
-	my $tc_dir  = "traffic_control";
+	my $tc_dir  = "incubator-trafficcontrol";
 	$working_dir = sprintf( "%s/%s", $tmp_dir, $tc_dir );
 	remove_tree($working_dir);
 	chdir $tmp_dir;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/traffic-control-cdn/css/home.css
----------------------------------------------------------------------
diff --git a/misc/traffic-control-cdn/css/home.css b/misc/traffic-control-cdn/css/home.css
index 42d3b52..5b61953 100644
--- a/misc/traffic-control-cdn/css/home.css
+++ b/misc/traffic-control-cdn/css/home.css
@@ -1,3 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 /*!
  * Home Screen CSS
  * 

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/traffic-control-cdn/downloads/index.html
----------------------------------------------------------------------
diff --git a/misc/traffic-control-cdn/downloads/index.html b/misc/traffic-control-cdn/downloads/index.html
index 1c0f0ef..554d9a1 100644
--- a/misc/traffic-control-cdn/downloads/index.html
+++ b/misc/traffic-control-cdn/downloads/index.html
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
   <head>
@@ -33,20 +52,20 @@
         <p class="sectionContainer">All RPMs have been built and tested on CentOS 6.5.<br></p>
 
         <!-- 1.7.0 -->
-        <p class="sectionContainer">PRE-RELEASE -- RELEASE-1.7.0<br>
+        <p class="sectionContainer">STABLE -- RELEASE-1.7.0<br>
         Full change list is <a href="https://github.com/Comcast/traffic_control/commits/RELEASE-1.7.0">Release 1.7.0 on github</a>.</p>
         <table class="dlTable">
-        <!-- <tr><td class="dlTableCell"><a href="1.6.1/RELEASE-1.6.1/traffic_ops-1.6.1-3513.fbb4fcd7.x86_64.rpm">RELEASE-1.6.1/traffic_ops-1.6.1-3513.fbb4fcd7.x86_64.rpm</a></td></tr>
-        <tr><td class="dlTableCell"><a href="1.6.1/RELEASE-1.6.1/traffic_monitor-1.6.1-3513.fbb4fcd7.el6.x86_64.rpm">RELEASE-1.6.1/traffic_monitor-1.6.1-3513.fbb4fcd7.el6.x86_64.rpm</a></td></tr>
-        <tr><td class="dlTableCell"><a href="1.6.1/RELEASE-1.6.1/traffic_router-1.6.1-3513.fbb4fcd7.el6.x86_64.rpm">RELEASE-1.6.1/traffic_router-1.6.1-3513.fbb4fcd7.el6.x86_64.rpm</a></td></tr>
-        <tr><td class="dlTableCell"><a href="1.6.1/RELEASE-1.6.1/traffic_ops_ort-1.6.1-3513.fbb4fcd7.x86_64.rpm">RELEASE-1.6.1/traffic_ops_ort-1.6.1-3513.fbb4fcd7.x86_64.rpm</a></td></tr>
-        <tr><td class="dlTableCell"><a href="1.6.1/RELEASE-1.6.1/traffic_stats-1.6.1-3513.fbb4fcd7.x86_64.rpm">RELEASE-1.6.1/traffic_stats-1.6.1-3513.fbb4fcd7.x86_64.rpm</a></td></tr>
-        <tr><td class="dlTableCell"><a href="1.6.1/RELEASE-1.6.1/astats_over_http-1.2-8.el6.x86_64.rpm">astats_over_http-1.2-8.el6.x86_64.rpm</a></td></tr> -->
-        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/trafficserver-5.3.2-759.ee14bbe.el6.x86_64.rpm">trafficserver-5.3.2-759.ee14bbe.el6.x86_64.rpm</a></td></tr> <tr><td class="dlTableCell"><a
-              href="1.7.0/RELEASE-1.7.0/trafficserver-debuginfo-5.3.2-759.ee14bbe.el6.x86_64.rpm">trafficserver-debuginfo-5.3.2-759.ee14bbe.el6.x86_64.rpm</a></td></tr>
-        <!-- <tr><td class="dlTableCell"><a href="1.6.1/RELEASE-1.6.1/SHA1SUMS.asc">SHA1SUMS.asc</a></td></tr> -->
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/traffic_ops-1.7.0-3908.5b77f60f.x86_64.rpm">RELEASE-1.7.0/traffic_ops-1.7.0-3908.5b77f60f.x86_64.rpm</a></td></tr>
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/traffic_portal-1.7.0-3908.5b77f60f.x86_64.rpm">RELEASE-1.7.0/traffic_portal-1.7.0-3908.5b77f60f.x86_64.rpm</a></td></tr>
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/traffic_monitor-1.7.0-3908.5b77f60f.el6.x86_64.rpm">RELEASE-1.7.0/traffic_monitor-1.7.0-3908.5b77f60f.el6.x86_64.rpm</a></td></tr>
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/traffic_router-1.7.0-3908.5b77f60f.el6.x86_64.rpm">RELEASE-1.7.0/traffic_router-1.7.0-3908.5b77f60f.el6.x86_64.rpm</a></td></tr>
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/traffic_ops_ort-1.7.0-3908.5b77f60f.x86_64.rpm">RELEASE-1.7.0/traffic_ops_ort-1.7.0-3908.5b77f60f.x86_64.rpm</a></td></tr>
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/traffic_stats-1.7.0-3908.5b77f60f.x86_64.rpm">RELEASE-1.7.0/traffic_stats-1.7.0-3908.5b77f60f.x86_64.rpm</a></td></tr>
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/trafficserver-5.3.2-759.ee14bbe.el6.x86_64.rpm">trafficserver-5.3.2-759.ee14bbe.el6.x86_64.rpm</a></td></tr>
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/trafficserver-debuginfo-5.3.2-759.ee14bbe.el6.x86_64.rpm">trafficserver-debuginfo-5.3.2-759.ee14bbe.el6.x86_64.rpm</a></td></tr>
+        <tr><td class="dlTableCell"><a href="1.7.0/RELEASE-1.7.0/SHA1SUMS.asc">SHA1SUMS.asc</a></td></tr>
         </table>
-
+    
         <!-- 1.6.1 -->
         <p class="sectionContainer">STABLE -- RELEASE-1.6.1<br>
         Full change list is <a href="https://github.com/Comcast/traffic_control/commits/RELEASE-1.6.1">Release 1.6.1 on github</a>.</p>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/traffic-control-cdn/index.html
----------------------------------------------------------------------
diff --git a/misc/traffic-control-cdn/index.html b/misc/traffic-control-cdn/index.html
index 42ae629..580f81e 100644
--- a/misc/traffic-control-cdn/index.html
+++ b/misc/traffic-control-cdn/index.html
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
   <head>
@@ -12,9 +31,7 @@
 
   </head>
   <body>
-    <div class="bkgdWrapper">
-      
-    </div>
+    <div class="bkgdWrapper"></div>
     <div class="appWrapper">
       <div class="appHeader">
             <div class="applogo"></div>
@@ -29,33 +46,36 @@
                 </ul>
               </div>
         </div>
-        <p class="sectionContainer">
-          Traffic Control allows you to build a large scale content delivery network using open source. Built around <a href="http://trafficserver.apache.org">Apache Traffic Server</a> as the caching software, Traffic Control implements all the core functions of a modern CDN:
-        </p>
 
-        <table class="tableMain" cellpadding="10">
-          <tr>
+    <p class="sectionContainer">
+    Traffic Control allows you to build a large scale content delivery network using open source. Built around <a href="http://trafficserver.apache.org">Apache Traffic Server</a> as the caching software, Traffic Control implements all the core functions of a modern CDN:
+    </p>
+
+    <table class="tableMain" cellpadding="10">
+        <tr>
             <td class="tableMainCell"><a href="traffic_router/index.html"><img src="images/traffic_router_logo.png"></a></td>
-            <td class="tableMainCell">Traffic Router is a Java Tomcat application that routes clients to the closest available cache on the CDN using both HTTP and DNS. By using consistent hashing it sends requests for the same content to the same cache in a group of caches working together in a location. It takes care of routing clients around hot spots and problems in the CDN by using the information from Traffic Monitor with regards to state of all the caches.</td>
-          </tr>
-          <tr>
+            <td class="tableMainCell">Traffic Router is a Java Tomcat application that routes clients to the closest available cache on the CDN using both HTTP and DNS. By using consistent hashing it sends requests for the same content to the same cache in a group of caches working together in a location. It takes care of routing clients around hot spots and problems in the CDN by using the information from Traffic Monitor with regards to state of all the caches. 
+            </td>
+        </tr>
+        <tr>
             <td class="tableMainCell"><a href="traffic_monitor/index.html"><img src="images/traffic_monitor_logo.png"></a></td>
-            <td class="tableMainCell">Traffic Monitor is a Java Tomcat application that implements the CDN health protocol. Every cache in the CDN is checked using HTTP for vital stats, and based on these stats, caches are declared healthy or unhealthy. This information is then used by Traffic Router to make it's routing decisions.</td>
-          </tr>
-          <tr>
+            <td class="tableMainCell">Traffic Monitor is a Java Tomcat application that implements the CDN health protocol. Every cache in the CDN is checked using HTTP for vital stats, and based on these stats, caches are declared healthy or unhealthy. This information is then used by Traffic Router to make it's routing decisions.
+            </td>
+        </tr>
+        <tr>
             <td class="tableMainCell"><a href="traffic_ops/index.html"><img src="images/traffic_operations_logo.png"></a></td>
             <td class="tableMainCell">Traffic Ops is a Mojolicious perl and jQuery UI application for management and monitoring of all servers in the CDN. All server and content routing information for the CDN is managed through Traffic Ops. It also exposes RESTful API enpoints for consumption by tools and other applications.
-          </td>
-          </tr>
-          <tr>
+            </td>
+        </tr>
+        <tr>
             <td class="tableMainCell"><a href="traffic_stats/index.html"><img src="images/traffic_stats_logo.png"></a></td>
             <td class="tableMainCell">Traffic Stats is a program written in Golang that is used to acquire and store statistics about CDNs controlled by Traffic Control. Traffic Stats mines metrics from Traffic Monitor\u2019s JSON APIs and stores the data in InfluxDb.</td>
-          </tr>
-          <tr>
+        </tr>  
+        <tr>
             <td class="tableMainCell"><a href="traffic_portal/index.html"><img src="images/traffic_portal_logo.png"></a></td>
             <td class="tableMainCell">Traffic Portal is an AngularJS 1.x client served from a Node.js web server designed to consume the Traffic Ops 1.x API. Traffic Portal provides a set of functionality restricted to the delivery service(s) of the authenticated user. Functionality primarily includes a set of charts / graphs designed to provide insight into the performance of a user\u2019s delivery service(s).</td>
-          </tr>
-        </table>
-      </div>
+        </tr>  
+    </table>
+
   </body>
 </html>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/traffic-control-cdn/traffic_monitor/index.html
----------------------------------------------------------------------
diff --git a/misc/traffic-control-cdn/traffic_monitor/index.html b/misc/traffic-control-cdn/traffic_monitor/index.html
index c32854b..04d5dae 100644
--- a/misc/traffic-control-cdn/traffic_monitor/index.html
+++ b/misc/traffic-control-cdn/traffic_monitor/index.html
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
   <head>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/traffic-control-cdn/traffic_ops/index.html
----------------------------------------------------------------------
diff --git a/misc/traffic-control-cdn/traffic_ops/index.html b/misc/traffic-control-cdn/traffic_ops/index.html
index bce51b1..f3abbeb 100644
--- a/misc/traffic-control-cdn/traffic_ops/index.html
+++ b/misc/traffic-control-cdn/traffic_ops/index.html
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
   <head>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/traffic-control-cdn/traffic_portal/index.html
----------------------------------------------------------------------
diff --git a/misc/traffic-control-cdn/traffic_portal/index.html b/misc/traffic-control-cdn/traffic_portal/index.html
index 30bb8eb..448a5c8 100644
--- a/misc/traffic-control-cdn/traffic_portal/index.html
+++ b/misc/traffic-control-cdn/traffic_portal/index.html
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
 <head>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/traffic-control-cdn/traffic_router/index.html
----------------------------------------------------------------------
diff --git a/misc/traffic-control-cdn/traffic_router/index.html b/misc/traffic-control-cdn/traffic_router/index.html
index 8c91848..53eb1cf 100644
--- a/misc/traffic-control-cdn/traffic_router/index.html
+++ b/misc/traffic-control-cdn/traffic_router/index.html
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
   <head>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/misc/traffic-control-cdn/traffic_stats/index.html
----------------------------------------------------------------------
diff --git a/misc/traffic-control-cdn/traffic_stats/index.html b/misc/traffic-control-cdn/traffic_stats/index.html
index e95e7c8..7f8cf42 100644
--- a/misc/traffic-control-cdn/traffic_stats/index.html
+++ b/misc/traffic-control-cdn/traffic_stats/index.html
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
   <head>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/client/client.go
----------------------------------------------------------------------
diff --git a/test/router/client/client.go b/test/router/client/client.go
index b998bba..4605b76 100644
--- a/test/router/client/client.go
+++ b/test/router/client/client.go
@@ -1,5 +1,25 @@
 package client
 
+/*
+ * 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 (
 	"crypto/tls"
 	"crypto/x509"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/css/loadtest.css
----------------------------------------------------------------------
diff --git a/test/router/css/loadtest.css b/test/router/css/loadtest.css
index b0b6acb..2a962c1 100644
--- a/test/router/css/loadtest.css
+++ b/test/router/css/loadtest.css
@@ -1,3 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 .grid-table-header {
     font-weight: bold;
 }
@@ -24,4 +43,4 @@ h4 .btn {
 
 .form-inline button {
     margin-left: 5px;
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/data/httpresult.go
----------------------------------------------------------------------
diff --git a/test/router/data/httpresult.go b/test/router/data/httpresult.go
index f0e797b..5973b6a 100644
--- a/test/router/data/httpresult.go
+++ b/test/router/data/httpresult.go
@@ -1,5 +1,25 @@
 package data
 
+/*
+ * 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 "time"
 
 type HttpResult struct {

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/dnssec/Readme.md
----------------------------------------------------------------------
diff --git a/test/router/dnssec/Readme.md b/test/router/dnssec/Readme.md
new file mode 100644
index 0000000..139824b
--- /dev/null
+++ b/test/router/dnssec/Readme.md
@@ -0,0 +1,23 @@
+DNSSEC Tests
+============
+
+Running the test
+
+`ginkgo -- -ns=router-01.thecdn.example.com:53  -ds=ds-01.thecdn.example.com.`
+
+Sample Output
+```
+Running Suite: Dnssec Suite
+===========================
+Random Seed: 1476984556
+Will run 4 of 4 specs
+
+2016/10/20 11:29:17 Nameserver router-01.thecdn.example.com:53
+2016/10/20 11:29:17 DeliveryService ds-01.thecdn.example.com.
+\u2022\u2022\u2022\u2022
+Ran 4 of 4 Specs in 0.110 seconds
+SUCCESS! -- 4 Passed | 0 Failed | 0 Pending | 0 Skipped PASS
+
+Ginkgo ran 1 suite in 825.345359ms
+Test Suite Passed
+```
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/dnssec/dnssec.go
----------------------------------------------------------------------
diff --git a/test/router/dnssec/dnssec.go b/test/router/dnssec/dnssec.go
new file mode 100644
index 0000000..d48dc4c
--- /dev/null
+++ b/test/router/dnssec/dnssec.go
@@ -0,0 +1,159 @@
+package dnssec
+
+/*
+ * 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 (
+. "github.com/miekg/dns"
+. "github.com/onsi/gomega"
+"log"
+)
+
+type DnssecClient struct {
+	*Client
+}
+
+type SignedRRSet struct {
+	RRSIG RRSIG
+	RRSet []RR
+}
+
+type SignedKeys struct {
+	SignedZsks []SignedRRSet
+	SignedKsks []SignedRRSet
+}
+
+func MakeLabelHierarchy(label string) []string {
+	labels := []string{}
+	done := false
+	i := 0
+	for !done {
+		label = label[i:]
+		labels = append([]string{label}, labels...)
+		i, done = NextLabel(label,i)
+	}
+
+	return append([]string{"."}, labels...)
+}
+
+func (d *DnssecClient) GetRecords(nameserver string, name string, t uint16) (*Msg) {
+	m := new(Msg)
+	m.Id = Id()
+	m.RecursionDesired = true
+	m.SetEdns0(4096, true)
+	m.Question = []Question{{name, t, ClassINET}}
+	r, _, err := d.Exchange(m, nameserver)
+
+	Expect(err).Should(BeNil())
+	Expect(len(r.Answer)).ToNot(Equal(0), "Received no answers from %v for query of records type %d for zone %v", nameserver, t, name)
+	return r
+}
+
+func sigCovers(s RRSIG, rr RR) bool {
+	return s.TypeCovered == rr.Header().Rrtype &&
+		s.Hdr.Class == rr.Header().Class &&
+		s.Hdr.Ttl == rr.Header().Ttl
+}
+
+func (d *DnssecClient) GetSignedRRSets(nameserver string, name string, t uint16) ([]SignedRRSet) {
+	records := []RR{}
+	rrsigs := []RR{}
+
+	answers := d.GetRecords(nameserver, name, t).Answer
+	for _, ans := range answers {
+		if ans.Header().Rrtype == TypeRRSIG {
+			rrsigs = append(rrsigs, ans)
+		} else {
+			records = append(records, ans)
+		}
+	}
+
+	rrsets := []SignedRRSet{}
+	for _, sig := range rrsigs {
+		switch s := sig.(type) {
+		case *RRSIG:
+			rs := RRSIG{
+				Hdr:         s.Hdr,
+				Signature:   s.Signature,
+				Algorithm:   s.Algorithm,
+				Expiration:  s.Expiration,
+				Inception:   s.Inception,
+				KeyTag:      s.KeyTag,
+				Labels:      s.Labels,
+				OrigTtl:     s.OrigTtl,
+				SignerName:  s.SignerName,
+				TypeCovered: s.TypeCovered,
+			}
+
+			signedSet := SignedRRSet{
+				RRSIG: rs,
+			}
+
+			for _, rr := range records {
+				if sigCovers(*s,rr) {
+					signedSet.RRSet = append(signedSet.RRSet, rr)
+				} else {
+					log.Println("rrsig does not cover record")
+					log.Println(s.Header(),s.TypeCovered)
+					log.Println(rr.Header(),rr.Header().Rrtype)
+				}
+			}
+
+			rrsets = append(rrsets, signedSet)
+		}
+
+	}
+
+	return rrsets
+}
+
+func (d *DnssecClient) DelegationSignerData(nameserver string, name string) ([]SignedRRSet) {
+	return d.GetSignedRRSets(nameserver, name, TypeDS)
+}
+
+func (d *DnssecClient) SigningData(nameserver string, name string) SignedKeys {
+	var signedKeys = SignedKeys{
+		SignedZsks: []SignedRRSet{},
+		SignedKsks: []SignedRRSet{},
+	}
+
+	signedRrsets := d.GetSignedRRSets(nameserver, name, TypeDNSKEY)
+
+	for _, signedRRset := range signedRrsets {
+		if len(signedRRset.RRSet) < 1 {
+			log.Println("****** no rrset")
+			continue;
+		}
+
+		for _, rr := range signedRRset.RRSet {
+			switch k := rr.(type) {
+			case *DNSKEY:
+				if k.Flags & 1 == 1 {
+					signedKeys.SignedKsks = append(signedKeys.SignedKsks, signedRRset)
+				} else {
+					signedKeys.SignedZsks = append(signedKeys.SignedZsks, signedRRset)
+				}
+			}
+		}
+	}
+
+	return signedKeys
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/dnssec/dnssec_suite_test.go
----------------------------------------------------------------------
diff --git a/test/router/dnssec/dnssec_suite_test.go b/test/router/dnssec/dnssec_suite_test.go
new file mode 100644
index 0000000..c079705
--- /dev/null
+++ b/test/router/dnssec/dnssec_suite_test.go
@@ -0,0 +1,56 @@
+package dnssec_test
+
+/*
+ * 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 (
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+
+	"testing"
+	"github.com/apache/incubator-trafficcontrol/test/router/dnssec"
+	"github.com/miekg/dns"
+	"flag"
+	"log"
+)
+
+var d *dnssec.DnssecClient
+var nameserver string
+var deliveryService string
+
+func init() {
+	flag.StringVar(&nameserver,"ns","changeit","ns is used to direct dns queries to a traffic router")
+	flag.StringVar(&deliveryService,"ds","changeit","ds is used to target some dns DS and DNS queries made by traffic router")
+}
+
+var _ = BeforeSuite(func() {
+	d = &dnssec.DnssecClient{new(dns.Client)}
+	d.Net = "udp"
+
+	Expect(nameserver).ToNot(Equal("changeit"), "Pass in a ns flag with the hostname of the traffic router")
+	Expect(deliveryService).ToNot(Equal("changeit"), "Pass in a ds flag with the dns label for a DNS delivery service")
+	log.Println("Nameserver",nameserver)
+	log.Println("DeliveryService", deliveryService)
+})
+
+func TestDnssec(t *testing.T) {
+	RegisterFailHandler(Fail)
+	RunSpecs(t, "Dnssec Suite")
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/dnssec/dnssec_test.go
----------------------------------------------------------------------
diff --git a/test/router/dnssec/dnssec_test.go b/test/router/dnssec/dnssec_test.go
new file mode 100644
index 0000000..a29ef40
--- /dev/null
+++ b/test/router/dnssec/dnssec_test.go
@@ -0,0 +1,129 @@
+package dnssec_test
+
+/*
+ * 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 (
+	"github.com/apache/incubator-trafficcontrol/test/router/dnssec"
+	"github.com/miekg/dns"
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+)
+
+var _ = Describe("Dnssec", func() {
+	Context("The Interwebs", func() {
+		It("Makes Label Hierarchy", func() {
+			Expect(dnssec.MakeLabelHierarchy("example.com.")).To(Equal([]string{".", "com.", "example.com."}))
+		})
+
+		It("Uses Parent Zone Key to validate DS", func() {
+			signedDSSets := d.DelegationSignerData(nameserver, deliveryService)
+
+			Expect(len(signedDSSets)).ToNot(Equal(0))
+			Expect(len(signedDSSets[0].RRSet)).ToNot(Equal(0))
+
+			verifiedCount := 0
+			for _, signedDSSet := range signedDSSets {
+
+				signedKeys := d.SigningData(nameserver, signedDSSet.RRSIG.SignerName)
+
+				Expect(len(signedKeys.SignedKsks)).ToNot(Equal(0))
+				Expect(len(signedKeys.SignedZsks)).ToNot(Equal(0))
+
+				for _, sk := range signedKeys.SignedZsks {
+					for _, k := range sk.RRSet {
+						switch kk := k.(type) {
+						case *dns.DNSKEY:
+							if kk.KeyTag() == signedDSSet.RRSIG.KeyTag {
+								Expect(signedDSSet.RRSIG.Verify(kk, signedDSSet.RRSet)).To(BeNil())
+								verifiedCount++
+							}
+						}
+					}
+				}
+
+				for _, sk := range signedKeys.SignedKsks {
+					for _, k := range sk.RRSet {
+						switch kk := k.(type) {
+						case *dns.DNSKEY:
+							if kk.KeyTag() == signedDSSet.RRSIG.KeyTag {
+								Expect(signedDSSet.RRSIG.Verify(kk, signedDSSet.RRSet)).To(BeNil())
+								verifiedCount++
+							}
+						}
+					}
+				}
+			}
+
+			Expect(verifiedCount).ToNot(Equal(0))
+		})
+
+		It("Uses DS to validate Public Key", func() {
+			signedKeys := d.SigningData(nameserver, deliveryService)
+			signedDSSets := d.DelegationSignerData(nameserver, deliveryService)
+
+			Expect(len(signedDSSets)).ToNot(Equal(0))
+
+			count := 0
+			for _, signedZsk := range signedKeys.SignedZsks {
+				for _, zsk := range signedZsk.RRSet {
+					switch z := zsk.(type) {
+					case *dns.DNSKEY:
+						for _, signedDs := range signedDSSets {
+							for _, ds := range signedDs.RRSet {
+								switch d := ds.(type) {
+								case *dns.DS:
+									if d.KeyTag == z.KeyTag() {
+										computedDS := z.ToDS(d.DigestType)
+										Expect(d.Digest).To(Equal(computedDS.Digest))
+										count++
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+
+			Expect(count).ToNot(Equal(0))
+		})
+
+		It("Uses KSK public key to verify ZSK RRSig", func() {
+			signedKeys := d.SigningData(nameserver, deliveryService)
+
+
+			count := 0
+			for _, signedZsk := range signedKeys.SignedZsks {
+				for _, signedKsk := range signedKeys.SignedKsks {
+					for _, ksk := range signedKsk.RRSet {
+						switch k := ksk.(type) {
+						case *dns.DNSKEY:
+							if k.KeyTag() == signedZsk.RRSIG.KeyTag {
+								Expect(signedZsk.RRSIG.Verify(k, signedZsk.RRSet)).To(BeNil())
+								count++
+							}
+						}
+					}
+				}
+			}
+			Expect(count).ToNot(Equal(0))
+		})
+	})
+})

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/index.html
----------------------------------------------------------------------
diff --git a/test/router/index.html b/test/router/index.html
index f94f773..e4dbdee 100644
--- a/test/router/index.html
+++ b/test/router/index.html
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
 <head>
@@ -28,4 +47,4 @@
     <div id="loadtest"></div>
 </div>
 </body>
-</html>
\ No newline at end of file
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/load/load.go
----------------------------------------------------------------------
diff --git a/test/router/load/load.go b/test/router/load/load.go
index 9db3d17..8cde990 100644
--- a/test/router/load/load.go
+++ b/test/router/load/load.go
@@ -1,5 +1,25 @@
 package load
 
+/*
+ * 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 (
 	"strings"
 	"sync"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/test/router/server/server.go
----------------------------------------------------------------------
diff --git a/test/router/server/server.go b/test/router/server/server.go
index c12b109..5f62b0c 100644
--- a/test/router/server/server.go
+++ b/test/router/server/server.go
@@ -1,5 +1,25 @@
 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 (
 	"crypto/tls"
 	"encoding/json"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/build/build_rpm.sh
----------------------------------------------------------------------
diff --git a/traffic_monitor/build/build_rpm.sh b/traffic_monitor/build/build_rpm.sh
index c5761ac..e8970a0 100755
--- a/traffic_monitor/build/build_rpm.sh
+++ b/traffic_monitor/build/build_rpm.sh
@@ -1,7 +1,6 @@
 #!/bin/bash
 
 #
-# Copyright 2015 Comcast Cable Communications Management, LLC
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/build/pmd/ruleset.xml
----------------------------------------------------------------------
diff --git a/traffic_monitor/build/pmd/ruleset.xml b/traffic_monitor/build/pmd/ruleset.xml
index 715a042..6f5ad95 100644
--- a/traffic_monitor/build/pmd/ruleset.xml
+++ b/traffic_monitor/build/pmd/ruleset.xml
@@ -1,4 +1,24 @@
 <?xml version="1.0"?>
+
+<!--
+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.
+-->
+
 <ruleset name="Overpass PMD Ruleset" xmlns="http://pmd.sf.net/ruleset/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
     xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/etc/ats_sim.js
----------------------------------------------------------------------
diff --git a/traffic_monitor/etc/ats_sim.js b/traffic_monitor/etc/ats_sim.js
index c4c176f..e2535c3 100644
--- a/traffic_monitor/etc/ats_sim.js
+++ b/traffic_monitor/etc/ats_sim.js
@@ -1,3 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 
 var myip = "127.0.0.1";
 var myport = 80;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/common/adapter/adapter.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/common/adapter/adapter.go b/traffic_monitor/experimental/common/adapter/adapter.go
index de0a322..bdb3621 100644
--- a/traffic_monitor/experimental/common/adapter/adapter.go
+++ b/traffic_monitor/experimental/common/adapter/adapter.go
@@ -1,5 +1,25 @@
 package adapter
 
+/*
+ * 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 (
 	"io"
 )

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/common/crstates/crstates.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/common/crstates/crstates.go b/traffic_monitor/experimental/common/crstates/crstates.go
index 4f260f9..20e10ca 100644
--- a/traffic_monitor/experimental/common/crstates/crstates.go
+++ b/traffic_monitor/experimental/common/crstates/crstates.go
@@ -1,5 +1,25 @@
 package crstates
 
+/*
+ * 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.
+ */
+
+
 type Cache struct {
 	Name      string `json:"name,omitempty"`
 	Available bool   `json:"isAvailable"`

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/common/fetcher/fetcher.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/common/fetcher/fetcher.go b/traffic_monitor/experimental/common/fetcher/fetcher.go
index e439bb2..6534661 100644
--- a/traffic_monitor/experimental/common/fetcher/fetcher.go
+++ b/traffic_monitor/experimental/common/fetcher/fetcher.go
@@ -1,13 +1,33 @@
 package fetcher
 
+/*
+ * 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"
 	"io/ioutil"
 	"net/http"
 	"time"
 
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/common/handler"
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/common/log"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/handler"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/log"
 	"github.com/davecheney/gmx"
 )
 
@@ -43,7 +63,9 @@ func (f HttpFetcher) Fetch(id string, url string, pollId uint64, pollFinishedCha
 	if f.Pending != nil {
 		f.Pending.Inc()
 	}
+	startReq := time.Now()
 	response, err := f.Client.Do(req)
+	reqTime := time.Now().Sub(startReq)
 	if f.Pending != nil {
 		f.Pending.Dec()
 	}
@@ -69,11 +91,11 @@ func (f HttpFetcher) Fetch(id string, url string, pollId uint64, pollFinishedCha
 			f.Success.Inc()
 		}
 		log.Debugf("poll %v %v fetch end\n", pollId, time.Now())
-		f.Handler.Handle(id, response.Body, err, pollId, pollFinishedChan)
+		f.Handler.Handle(id, response.Body, reqTime, err, pollId, pollFinishedChan)
 	} else {
 		if f.Fail != nil {
 			f.Fail.Inc()
 		}
-		f.Handler.Handle(id, nil, err, pollId, pollFinishedChan)
+		f.Handler.Handle(id, nil, reqTime, err, pollId, pollFinishedChan)
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/common/handler/handler.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/common/handler/handler.go b/traffic_monitor/experimental/common/handler/handler.go
index 46f9426..312553a 100644
--- a/traffic_monitor/experimental/common/handler/handler.go
+++ b/traffic_monitor/experimental/common/handler/handler.go
@@ -1,10 +1,31 @@
 package handler
 
+/*
+ * 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 (
 	"encoding/json"
 	"io"
+	"time"
 
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/common/log"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/log"
 )
 
 const (
@@ -14,7 +35,7 @@ const (
 )
 
 type Handler interface {
-	Handle(string, io.Reader, error, uint64, chan<- uint64)
+	Handle(string, io.Reader, time.Duration, error, uint64, chan<- uint64)
 }
 
 type OpsConfigFileHandler struct {

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/common/instrumentation/instrumentation.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/common/instrumentation/instrumentation.go b/traffic_monitor/experimental/common/instrumentation/instrumentation.go
index 19e03ef..12e29b4 100644
--- a/traffic_monitor/experimental/common/instrumentation/instrumentation.go
+++ b/traffic_monitor/experimental/common/instrumentation/instrumentation.go
@@ -1,5 +1,25 @@
 package instrumentation
 
+/*
+ * 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 (
 	"github.com/davecheney/gmx"
 )

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/common/log/log.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/common/log/log.go b/traffic_monitor/experimental/common/log/log.go
index a48362a..884d4c3 100644
--- a/traffic_monitor/experimental/common/log/log.go
+++ b/traffic_monitor/experimental/common/log/log.go
@@ -1,6 +1,26 @@
 // Inspired by https://www.goinggo.net/2013/11/using-log-package-in-go.html
 package log
 
+/*
+ * 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"
 	"io"
@@ -15,7 +35,7 @@ var (
 	Error   *log.Logger
 )
 
-func Init(debugW, infoW, warnW, errW io.Writer) {
+func Init(errW, warnW, infoW, debugW io.Writer) {
 	Debug = log.New(debugW, "DEBUG: ", log.Lshortfile)
 	Info = log.New(infoW, "INFO: ", log.Lshortfile)
 	Warning = log.New(warnW, "WARNING: ", log.Lshortfile)
@@ -48,3 +68,20 @@ func Debugf(format string, v ...interface{}) {
 func Debugln(v ...interface{}) {
 	Debug.Output(3, time.Now().Format(timeFormat)+": "+fmt.Sprintln(v...))
 }
+
+// Close calls `Close()` on the given Closer, and logs any error. On error, the context is logged, followed by a colon, the error message, and a newline. This is primarily designed to be used in `defer`, for example, `defer log.Close(resp.Body, "readData fetching /foo/bar")`.
+func Close(c io.Closer, context string) {
+	err := c.Close()
+	if err != nil {
+		Errorf("%v: %v", context, err)
+	}
+}
+
+// Closef acts like Close, with a given format string and values, followed by a colon, the error message, and a newline. The given values are not coerced, concatenated, or printed unless an error occurs, so this is more efficient than `Close()`.
+func Closef(c io.Closer, contextFormat string, v ...interface{}) {
+	err := c.Close()
+	if err != nil {
+		Errorf(contextFormat, v...)
+		Errorf(": %v", err)
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/common/poller/poller.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/common/poller/poller.go b/traffic_monitor/experimental/common/poller/poller.go
index 42a0d7d..c1a98fb 100644
--- a/traffic_monitor/experimental/common/poller/poller.go
+++ b/traffic_monitor/experimental/common/poller/poller.go
@@ -1,7 +1,28 @@
 package poller
 
+/*
+ * 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 (
 	"io/ioutil"
+	"math/rand"
 	"net/http"
 	"os"
 	"sync/atomic"
@@ -9,12 +30,12 @@ import (
 
 	"gopkg.in/fsnotify.v1"
 
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/common/fetcher"
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/common/handler"
-	instr "github.com/Comcast/traffic_control/traffic_monitor/experimental/common/instrumentation"
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/common/log"
-	towrap "github.com/Comcast/traffic_control/traffic_monitor/experimental/traffic_monitor/trafficopswrapper" // TODO move to common
-	to "github.com/Comcast/traffic_control/traffic_ops/client"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/fetcher"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/handler"
+	instr "github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/instrumentation"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/log"
+	towrap "github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/trafficopswrapper" // TODO move to common
+	to "github.com/apache/incubator-trafficcontrol/traffic_ops/client"
 )
 
 type Poller interface {
@@ -22,14 +43,20 @@ type Poller interface {
 }
 
 type HttpPoller struct {
-	Config        HttpPollerConfig
-	ConfigChannel chan HttpPollerConfig
-	Fetcher       fetcher.Fetcher
-	TickChan      chan uint64
+	Config          HttpPollerConfig
+	ConfigChannel   chan HttpPollerConfig
+	FetcherTemplate fetcher.HttpFetcher // FetcherTemplate has all the constant settings, and is copied to create fetchers with custom HTTP client timeouts.
+	TickChan        chan uint64
+}
+
+type PollConfig struct {
+	URL     string
+	Timeout time.Duration
+	Handler handler.Handler
 }
 
 type HttpPollerConfig struct {
-	Urls     map[string]string
+	Urls     map[string]PollConfig
 	Interval time.Duration
 }
 
@@ -46,7 +73,7 @@ func NewHTTP(interval time.Duration, tick bool, httpClient *http.Client, counter
 		Config: HttpPollerConfig{
 			Interval: interval,
 		},
-		Fetcher: fetcher.HttpFetcher{
+		FetcherTemplate: fetcher.HttpFetcher{
 			Handler:  fetchHandler,
 			Client:   httpClient,
 			Counters: counters,
@@ -114,29 +141,35 @@ func (p HttpPoller) Poll() {
 	// iterationCount++ // on tick<:
 	// case p.TickChan <- iterationCount:
 	killChans := map[string]chan<- struct{}{}
-	for {
-		select {
-		case newConfig := <-p.ConfigChannel:
-			deletions, additions := diffConfigs(p.Config, newConfig)
-			for _, id := range deletions {
-				killChan := killChans[id]
-				go func() { killChan <- struct{}{} }() // go - we don't want to wait for old polls to die.
-				delete(killChans, id)
-			}
-			for _, info := range additions {
-				kill := make(chan struct{})
-				killChans[info.ID] = kill
-				go pollHttp(info.Interval, info.ID, info.URL, p.Fetcher, kill)
+	for newConfig := range p.ConfigChannel {
+		deletions, additions := diffConfigs(p.Config, newConfig)
+		for _, id := range deletions {
+			killChan := killChans[id]
+			go func() { killChan <- struct{}{} }() // go - we don't want to wait for old polls to die.
+			delete(killChans, id)
+		}
+		for _, info := range additions {
+			kill := make(chan struct{})
+			killChans[info.ID] = kill
+
+			fetcher := p.FetcherTemplate
+			if info.Timeout != 0 { // if the timeout isn't explicitly set, use the template value.
+				c := *fetcher.Client
+				fetcher.Client = &c // copy the client, so we don't change other fetchers.
+				fetcher.Client.Timeout = info.Timeout
 			}
-			p.Config = newConfig
+			go pollHttp(info.Interval, info.ID, info.URL, fetcher, kill)
 		}
+		p.Config = newConfig
 	}
 }
 
 type HTTPPollInfo struct {
 	Interval time.Duration
+	Timeout  time.Duration
 	ID       string
 	URL      string
+	Handler  handler.Handler
 }
 
 // diffConfigs takes the old and new configs, and returns a list of deleted IDs, and a list of new polls to do
@@ -148,26 +181,41 @@ func diffConfigs(old HttpPollerConfig, new HttpPollerConfig) ([]string, []HTTPPo
 		for id, _ := range old.Urls {
 			deletions = append(deletions, id)
 		}
-		for id, url := range new.Urls {
-			additions = append(additions, HTTPPollInfo{Interval: new.Interval, ID: id, URL: url})
+		for id, pollCfg := range new.Urls {
+			additions = append(additions, HTTPPollInfo{
+				Interval: new.Interval,
+				ID:       id,
+				URL:      pollCfg.URL,
+				Timeout:  pollCfg.Timeout,
+			})
 		}
 		return deletions, additions
 	}
 
-	for id, oldUrl := range old.Urls {
-		newUrl, newIdExists := new.Urls[id]
+	for id, oldPollCfg := range old.Urls {
+		newPollCfg, newIdExists := new.Urls[id]
 		if !newIdExists {
 			deletions = append(deletions, id)
-		} else if newUrl != oldUrl {
+		} else if newPollCfg != oldPollCfg {
 			deletions = append(deletions, id)
-			additions = append(additions, HTTPPollInfo{Interval: new.Interval, ID: id, URL: newUrl})
+			additions = append(additions, HTTPPollInfo{
+				Interval: new.Interval,
+				ID:       id,
+				URL:      newPollCfg.URL,
+				Timeout:  newPollCfg.Timeout,
+			})
 		}
 	}
 
-	for id, newUrl := range new.Urls {
+	for id, newPollCfg := range new.Urls {
 		_, oldIdExists := old.Urls[id]
 		if !oldIdExists {
-			additions = append(additions, HTTPPollInfo{Interval: new.Interval, ID: id, URL: newUrl})
+			additions = append(additions, HTTPPollInfo{
+				Interval: new.Interval,
+				ID:       id,
+				URL:      newPollCfg.URL,
+				Timeout:  newPollCfg.Timeout,
+			})
 		}
 	}
 
@@ -208,11 +256,14 @@ func (p FilePoller) Poll() {
 
 // TODO iterationCount and/or p.TickChan?
 func pollHttp(interval time.Duration, id string, url string, fetcher fetcher.Fetcher, die <-chan struct{}) {
+	pollSpread := time.Duration(rand.Float64()*float64(interval/time.Nanosecond)) * time.Nanosecond
+	time.Sleep(pollSpread)
 	tick := time.NewTicker(interval)
 	lastTime := time.Now()
 	for {
 		select {
 		case now := <-tick.C:
+			tick = time.NewTicker(interval) // recreate timer, to avoid Go's "smoothing" nonsense
 			realInterval := now.Sub(lastTime)
 			if realInterval > interval+(time.Millisecond*100) {
 				instr.TimerFail.Inc()

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/traffic_monitor/build.sh
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/build.sh b/traffic_monitor/experimental/traffic_monitor/build.sh
index 8cc5932..e8b09e2 100755
--- a/traffic_monitor/experimental/traffic_monitor/build.sh
+++ b/traffic_monitor/experimental/traffic_monitor/build.sh
@@ -1 +1,17 @@
+# 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.
 go build -ldflags "-X main.GitRevision=`git rev-parse HEAD` -X main.BuildTimestamp=`date +'%Y-%M-%dT%H:%M:%S'`"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/traffic_monitor/cache/astats.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/astats.go b/traffic_monitor/experimental/traffic_monitor/cache/astats.go
index ad658f8..96258c8 100644
--- a/traffic_monitor/experimental/traffic_monitor/cache/astats.go
+++ b/traffic_monitor/experimental/traffic_monitor/cache/astats.go
@@ -1,15 +1,36 @@
 package cache
 
+/*
+ * 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 (
 	"encoding/json"
-	"io"
 )
 
+// Astats contains ATS data returned from the Astats ATS plugin. This includes generic stats, as well as fixed system stats.
 type Astats struct {
 	Ats    map[string]interface{} `json:"ats"`
 	System AstatsSystem           `json:"system"`
 }
 
+// AstatsSystem represents fixed system stats returne from ATS by the Astats plugin.
 type AstatsSystem struct {
 	InfName           string `json:"inf.name"`
 	InfSpeed          int    `json:"inf.speed"`
@@ -22,25 +43,9 @@ type AstatsSystem struct {
 	AstatsLoad        int    `json:"astatsLoad"`
 }
 
-type AstatsAdapter struct{}
-
+// Unmarshal unmarshalls the given bytes, which must be JSON Astats data, into an Astats object.
 func Unmarshal(body []byte) (Astats, error) {
 	var aStats Astats
 	err := json.Unmarshal(body, &aStats)
 	return aStats, err
 }
-
-func (AstatsAdapter) Transform(r io.Reader) ([]Astats, error) {
-	dec := json.NewDecoder(r)
-	var as []Astats
-
-	for {
-		var a Astats
-		if err := dec.Decode(&a); err == io.EOF {
-			return as, nil
-		} else if err != nil {
-			return as, err
-		}
-		as = append(as, a)
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go b/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go
index 14401c3..67dd8aa 100644
--- a/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go
+++ b/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go
@@ -1,5 +1,25 @@
 package cache
 
+/*
+ * 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"
 	"io/ioutil"
@@ -18,5 +38,5 @@ func TestAstats(t *testing.T) {
 	if err != nil {
 		t.Log(err)
 	}
-	fmt.Printf("Found %v key/val pairs in ats, and %v key/val pairs in system\n", len(aStats.Ats), len(aStats.System))
+	fmt.Printf("Found %v key/val pairs in ats\n", len(aStats.Ats))
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/be5ab888/traffic_monitor/experimental/traffic_monitor/cache/cache.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/cache.go b/traffic_monitor/experimental/traffic_monitor/cache/cache.go
index eb54e42..bcc3449 100644
--- a/traffic_monitor/experimental/traffic_monitor/cache/cache.go
+++ b/traffic_monitor/experimental/traffic_monitor/cache/cache.go
@@ -1,14 +1,34 @@
 package cache
 
+/*
+ * 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 (
 	"encoding/json"
 	"fmt"
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/common/log"
-	dsdata "github.com/Comcast/traffic_control/traffic_monitor/experimental/traffic_monitor/deliveryservicedata"
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/traffic_monitor/enum"
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/traffic_monitor/http_server"
-	"github.com/Comcast/traffic_control/traffic_monitor/experimental/traffic_monitor/peer"
-	todata "github.com/Comcast/traffic_control/traffic_monitor/experimental/traffic_monitor/trafficopsdata"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/log"
+	dsdata "github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/deliveryservicedata"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/enum"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/peer"
+	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/srvhttp"
+	todata "github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/trafficopsdata"
 	"io"
 	"net/url"
 	"regexp"
@@ -17,6 +37,7 @@ import (
 	"time"
 )
 
+// Handler is a cache handler, which fulfills the common/handler `Handler` interface.
 type Handler struct {
 	ResultChannel      chan Result
 	Notify             int
@@ -25,20 +46,23 @@ type Handler struct {
 	MultipleSpaceRegex *regexp.Regexp
 }
 
-// NewHandler does NOT precomputes stat data before calling ResultChannel, and Result.Precomputed will be nil
+// NewHandler returns a new cache handler. Note this handler does NOT precomputes stat data before calling ResultChannel, and Result.Precomputed will be nil
+// TODO change this to take the ResultChan. It doesn't make sense for the Handler to 'own' the Result Chan.
 func NewHandler() Handler {
 	return Handler{ResultChannel: make(chan Result), MultipleSpaceRegex: regexp.MustCompile(" +")}
 }
 
-// NewPrecomputeHandler precomputes stat data and populates result.Precomputed before passing to ResultChannel.
+// NewPrecomputeHandler constructs a new cache Handler, which precomputes stat data and populates result.Precomputed before passing to ResultChannel.
 func NewPrecomputeHandler(toData todata.TODataThreadsafe, peerStates peer.CRStatesPeersThreadsafe) Handler {
 	return Handler{ResultChannel: make(chan Result), MultipleSpaceRegex: regexp.MustCompile(" +"), ToData: &toData, PeerStates: &peerStates}
 }
 
-func (h Handler) Precompute() bool {
-	return h.ToData != nil && h.PeerStates != nil
+// Precompute returns whether this handler precomputes data before passing the result to the ResultChannel
+func (handler Handler) Precompute() bool {
+	return handler.ToData != nil && handler.PeerStates != nil
 }
 
+// PrecomputedData represents data parsed and pre-computed from the Result.
 type PrecomputedData struct {
 	DeliveryServiceStats map[enum.DeliveryServiceName]dsdata.Stat
 	OutBytes             int64
@@ -47,18 +71,21 @@ type PrecomputedData struct {
 	Reporting            bool
 }
 
+// Result is the data result returned by a cache.
 type Result struct {
-	Id        enum.CacheName
-	Available bool
-	Error     error
-	Astats    Astats
-	Time      time.Time
-	Vitals    Vitals
-	PrecomputedData
+	ID           enum.CacheName
+	Error        error
+	Astats       Astats
+	Time         time.Time
+	RequestTime  time.Duration
+	Vitals       Vitals
 	PollID       uint64
 	PollFinished chan<- uint64
+	PrecomputedData
+	Available bool
 }
 
+// Vitals is the vitals data returned from a cache.
 type Vitals struct {
 	LoadAvg    float64
 	BytesOut   int64
@@ -67,35 +94,30 @@ type Vitals struct {
 	MaxKbpsOut int64
 }
 
+// Stat is a generic stat, including the untyped value and the time the stat was taken.
 type Stat struct {
 	Time  int64       `json:"time"`
 	Value interface{} `json:"value"`
 }
 
+// Stats is designed for returning via the API. It contains result history for each cache, as well as common API data.
 type Stats struct {
-	Caches      map[enum.CacheName]map[string][]Stat `json:"caches"`
-	QueryParams string                               `json:"pp"`
-	DateStr     string                               `json:"date"`
+	srvhttp.CommonAPIData
+	Caches map[enum.CacheName]map[string][]Stat `json:"caches"`
 }
 
+// Filter filters whether stats and caches should be returned from a data set.
 type Filter interface {
 	UseStat(name string) bool
 	UseCache(name enum.CacheName) bool
 	WithinStatHistoryMax(int) bool
 }
 
-const (
-	NOTIFY_NEVER = iota
-	NOTIFY_CHANGE
-	NOTIFY_ALWAYS
-)
-
 // StatsMarshall encodes the stats in JSON, encoding up to historyCount of each stat. If statsToUse is empty, all stats are encoded; otherwise, only the given stats are encoded. If wildcard is true, stats which contain the text in each statsToUse are returned, instead of exact stat names. If cacheType is not CacheTypeInvalid, only stats for the given type are returned. If hosts is not empty, only the given hosts are returned.
 func StatsMarshall(statHistory map[enum.CacheName][]Result, filter Filter, params url.Values) ([]byte, error) {
 	stats := Stats{
-		Caches:      map[enum.CacheName]map[string][]Stat{},
-		QueryParams: http_server.ParametersStr(params),
-		DateStr:     http_server.DateStr(time.Now()),
+		CommonAPIData: srvhttp.GetCommonAPIData(params, time.Now()),
+		Caches:        map[enum.CacheName]map[string][]Stat{},
 	}
 
 	// TODO in 1.0, stats are divided into 'location', 'cache', and 'type'. 'cache' are hidden by default.
@@ -126,7 +148,7 @@ func StatsMarshall(statHistory map[enum.CacheName][]Result, filter Filter, param
 					stats.Caches[id] = map[string][]Stat{}
 				}
 
-				stats.Caches[id][stat] = append(stats.Caches[id][stat], s)
+				stats.Caches[id][stat] = append(stats.Caches[id][stat], Stat{Time: s.Time, Value: fmt.Sprintf("%v", s.Value)}) // convert stats to strings, for the TM1.0 /publish/CacheStats API
 			}
 		}
 	}
@@ -134,18 +156,20 @@ func StatsMarshall(statHistory map[enum.CacheName][]Result, filter Filter, param
 	return json.Marshal(stats)
 }
 
-func (handler Handler) Handle(id string, r io.Reader, err error, pollId uint64, pollFinished chan<- uint64) {
-	log.Debugf("poll %v %v handle start\n", pollId, time.Now())
+// Handle handles results fetched from a cache, parsing the raw Reader data and passing it along to a chan for further processing.
+func (handler Handler) Handle(id string, r io.Reader, reqTime time.Duration, reqErr error, pollID uint64, pollFinished chan<- uint64) {
+	log.Debugf("poll %v %v handle start\n", pollID, time.Now())
 	result := Result{
-		Id:           enum.CacheName(id),
+		ID:           enum.CacheName(id),
 		Time:         time.Now(), // TODO change this to be computed the instant we get the result back, to minimise inaccuracy
-		PollID:       pollId,
+		RequestTime:  reqTime,
+		PollID:       pollID,
 		PollFinished: pollFinished,
 	}
 
-	if err != nil {
-		log.Errorf("%v handler given error '%v'\n", id, err) // error here, in case the thing that called Handle didn't error
-		result.Error = err
+	if reqErr != nil {
+		log.Errorf("%v handler given error '%v'\n", id, reqErr) // error here, in case the thing that called Handle didn't error
+		result.Error = reqErr
 		handler.ResultChannel <- result
 		return
 	}
@@ -159,9 +183,9 @@ func (handler Handler) Handle(id string, r io.Reader, err error, pollId uint64,
 
 	result.PrecomputedData.Reporting = true
 
-	if err := json.NewDecoder(r).Decode(&result.Astats); err != nil {
-		log.Errorf("%s procnetdev decode error '%v'\n", id, err)
-		result.Error = err
+	if decodeErr := json.NewDecoder(r).Decode(&result.Astats); decodeErr != nil {
+		log.Errorf("%s procnetdev decode error '%v'\n", id, decodeErr)
+		result.Error = decodeErr
 		handler.ResultChannel <- result
 		return
 	}
@@ -174,23 +198,23 @@ func (handler Handler) Handle(id string, r io.Reader, err error, pollId uint64,
 		log.Warnf("addkbps %s inf.speed empty\n", id)
 	}
 
-	log.Debugf("poll %v %v handle decode end\n", pollId, time.Now())
+	log.Debugf("poll %v %v handle decode end\n", pollID, time.Now())
 
-	if err != nil {
-		result.Error = err
-		log.Errorf("addkbps handle %s error '%v'\n", id, err)
+	if reqErr != nil {
+		result.Error = reqErr
+		log.Errorf("addkbps handle %s error '%v'\n", id, reqErr)
 	} else {
 		result.Available = true
 	}
 
 	if handler.Precompute() {
-		log.Debugf("poll %v %v handle precompute start\n", pollId, time.Now())
+		log.Debugf("poll %v %v handle precompute start\n", pollID, time.Now())
 		result = handler.precompute(result)
-		log.Debugf("poll %v %v handle precompute end\n", pollId, time.Now())
+		log.Debugf("poll %v %v handle precompute end\n", pollID, time.Now())
 	}
-	log.Debugf("poll %v %v handle write start\n", pollId, time.Now())
+	log.Debugf("poll %v %v handle write start\n", pollID, time.Now())
 	handler.ResultChannel <- result
-	log.Debugf("poll %v %v handle end\n", pollId, time.Now())
+	log.Debugf("poll %v %v handle end\n", pollID, time.Now())
 }
 
 // outBytes takes the proc.net.dev string, and the interface name, and returns the bytes field
@@ -226,7 +250,7 @@ func (handler Handler) precompute(result Result) Result {
 	var err error
 	if result.PrecomputedData.OutBytes, err = outBytes(result.Astats.System.ProcNetDev, result.Astats.System.InfName, handler.MultipleSpaceRegex); err != nil {
 		result.PrecomputedData.OutBytes = 0
-		log.Errorf("addkbps %s handle precomputing outbytes '%v'\n", result.Id, err)
+		log.Errorf("addkbps %s handle precomputing outbytes '%v'\n", result.ID, err)
 	}
 
 	kbpsInMbps := int64(1000)
@@ -234,9 +258,9 @@ func (handler Handler) precompute(result Result) Result {
 
 	for stat, value := range result.Astats.Ats {
 		var err error
-		stats, err = processStat(result.Id, stats, todata, stat, value, result.Time)
+		stats, err = processStat(result.ID, stats, todata, stat, value, result.Time)
 		if err != nil && err != dsdata.ErrNotProcessedStat {
-			log.Errorf("precomputing cache %v stat %v value %v error %v", result.Id, stat, value, err)
+			log.Errorf("precomputing cache %v stat %v value %v error %v", result.ID, stat, value, err)
 			result.PrecomputedData.Errors = append(result.PrecomputedData.Errors, err)
 		}
 	}