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

<table class="table">
	<thead>
		<tr><th>Today</th></tr>
	</thead>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
</table>
<table class="table">
	<thead>
	<tr>
		<th>Yesterday</th>
	</tr>
	</thead>
     <tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
	<tr>
		<td><a href="profile.html">Warren</a> commented on <a href="ticket.html">E-5476</a> (Fix header graphic) saying:
		<div style="color:grey;">"The header graphic is going to need a re-think"</div></td>
	</tr>
</table>
