diff --git a/CHANGES b/CHANGES
index 6dfc012d39eb79c293b3ca6e7be9bbc1c6ce9f62..a6bae660a35fdea7ed68eb2281aeb6641e83bbad 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,10 @@
 0.4.2
+- Fixed bug regarding <%call>/def calls w/ content
+  whereby the identity of the "caller" callable
+  inside the <%def> would be corrupted by the 
+  presence of another <%call> in the same block.  
+  [ticket:170]
+
 - Fixed the babel plugin to accommodate <%block>
   [ticket:169]
 
diff --git a/mako/codegen.py b/mako/codegen.py
index 5369180772005cec00c2b44396b71465ecd31e59..b8c638286688a316c16153257dff9573b9292974 100644
--- a/mako/codegen.py
+++ b/mako/codegen.py
@@ -847,10 +847,10 @@ class _GenerateRenderMethod(object):
 
         self.printer.writelines(
             # get local reference to current caller, if any
-            "caller = context.caller_stack._get_caller()",
+            "__M_caller = context.caller_stack._get_caller()",
             # push on caller for nested call
             "context.caller_stack.nextcaller = "
-                "runtime.Namespace('caller', context, callables=ccall(caller))",
+                "runtime.Namespace('caller', context, callables=ccall(__M_caller))",
             "try:")
         self.write_source_comment(node)
         self.printer.writelines(
diff --git a/test/test_call.py b/test/test_call.py
index 6aadf62e4c922868110b5d0c2f895d23925b923c..5f13e958876314ee4d38477fd541d475bd454021 100644
--- a/test/test_call.py
+++ b/test/test_call.py
@@ -279,6 +279,63 @@ class CallTest(TemplateTest):
         ''')
         assert flatten_result(template.render()) == "foo"
  
+    def test_nested_call_4(self):
+        base = """
+        <%def name="A()">
+        A_def
+        ${caller.body()}
+        </%def>
+
+        <%def name="B()">
+        B_def
+        ${caller.body()}
+        </%def>
+        """
+
+        template = Template(base + """
+        <%def name="C()">
+         C_def
+         <%self:B>
+           <%self:A>
+              A_body
+           </%self:A>
+            B_body
+           ${caller.body()}
+         </%self:B>
+        </%def>
+
+        <%self:C>
+        C_body
+        </%self:C>
+        """)
+
+        eq_(
+            flatten_result(template.render()),
+            "C_def B_def A_def A_body B_body C_body"
+        )
+
+        template = Template(base + """
+        <%def name="C()">
+         C_def
+         <%self:B>
+            B_body
+           ${caller.body()}
+           <%self:A>
+              A_body
+           </%self:A>
+         </%self:B>
+        </%def>
+
+        <%self:C>
+        C_body
+        </%self:C>
+        """)
+
+        eq_(
+            flatten_result(template.render()),
+            "C_def B_def B_body C_body A_def A_body"
+        )
+
     def test_chained_call_in_nested(self):
         t = Template("""
             <%def name="embedded()">