 <p>I found the problem/solution!</p> <p>The problem is that in my Controller_Website I had this in my <code>action_before()</code>:</p> <pre><code>// Create a new DM_Nav object to hold our page info // Make this page info available to all views as well $this-&gt;page_info = new DM_Nav; View::bind_global('page_info', $this-&gt;page_info); </code></pre> <p>The problem is the <code>bind_global</code> – which is actually <em>working as it's supposed to</em> by letting you change the value of this variable after the fact... <em>(A very neat feature indeed.)</em></p> <p>The workaround/solution was to force the template to use only the original <code>page_info</code> by detecting if it was an initial/main request. So at the very end of the <code>action_before()</code> method of <code>Controller_Website</code> where it says:</p> <pre><code>// Only if auto_render is still TRUE (Default) if ($this-&gt;auto_render === TRUE AND $this-&gt;request-&gt;is_initial()) { </code></pre> <p>I added this line to the end of that <code>if</code> statement:</p> <pre><code> $this-&gt;template-&gt;page_info = $this-&gt;page_info; } </code></pre> <p>This line is redundant on initial/main requests, but it means that any additional sub-requests can still have access to their own <code>page_info</code> values without affecting the values used in the template. It appears, then, that if you assign a property to a view and then attempt to <code>bind_global()</code> the same property with new values, it doesn't overwrite it and uses the original values instead... <em>(Which is why this solution works.)</em> Interesting.</p>