January 14, 2020
Milk Bread All of Your Bread
Article-tangzhong-Milk-Bread-Baking-technique

This simple trick makes baked goods as fluffy and soft as the best sandwich bread.

Wouldn’t it be great if every home-baked yeasted bread could stay as fluffy as packaged white bread for just as long, without pumping it through with preservatives? Anyone who’s ever tasted the pillowy crumb of homemade milk bread knows that it can. And it’s all thanks to a simple technique involving a little bit of water and a little bit of flour.

Whether you’re baking dinner rolls, conchas, challah, or really any kind of bread where you hope to maintain a soft, tender crumb and moist texture that lasts for longer than one dinner party, you could be incorporating tangzhong into your dough before it’s even baked. This Chinese technique (also known as “yudane” in Japan, or “water roux”) incorporates a pre-cooked slurry based on a percentage of the recipe’s flour and liquid into the dough. It’s what gives milk bread its light crumb and feathery melt-in-your-mouth texture. And it’s a technique that can easily be applied to countless yeasted bread recipes.

PJ Hamel, a longtime baker and blogger for King Arthur Flour, explains that tangzhong pre-gelatinizes the starches in the flour, which allows those starches to absorb more water. Using hot water or milk, flour can absorb twice as much liquid as it can at room temperature. “Tangzhong yields a softer bread due to the fact that the bread retains more moisture for a longer amount of time, which means its shelf life is also extended,” Hamel tells me. Unlike mass-produced white bread, which is enhanced with chemical emulsifiers and preservatives to keep its freshness, tangzhong-enhanced bread just requires a little more flour and water.

So how do you retrofit tangzhong into your favorite yeasted bread recipe? Hamel recommends calculating 5 to 10 percent of your recipe’s flour and then four or five times the liquid, cooking and whisking them together in a saucepan over medium heat until the mixture becomes thick, like frosting. Let the paste cool, then add it all in with your regular ingredients when the time comes. Cooling the paste is an important step that’s not to be missed. “You don’t want to take any chance of [the hot tangzhong] coming in contact with the yeast and killing it,” Hamel says.

Unlike mass-produced white bread, which is enhanced with chemical emulsifiers and preservatives to keep its freshness, tangzhong-enhanced bread just requires a little more flour and water.

Breads with higher hydration percentages tend to be the best contenders for a tangzhong upgrade. Generally, these are breads with light textures, like pan dulces, anpan, and brioches. Even if you’re not one of the ever-growing group of bread nerds obsessing over teensy details, it helps to know at least a little bit about your dough’s hydration. Calculating hydration is simple: Just take the amount of water (or milk) by weight divided by the amount of flour by weight, and voilà.

Not a math person? No problem. One enterprising King Arthur Flour commenter shared with Hamel a handy conversion spreadsheet that calculates your bread’s hydration as well as its suggested slurry content. Once you see the weight of your liquid in the original recipe, subtract it from the liquid weight in the 75 percent hydration column, and you’ll find out how much extra liquid to add when mixing all your dough together. That way, your dough will be perfectly hydrated and easy to work with, and your breads—now so very moist and fluffy—will last a lot longer.

I’ve used tangzhong in fluffy yeasted bread recipes from traditional milk bread to challah to sandwich rolls, and it hasn’t failed me yet. The sandwich rolls were tender and fluffy and light, and my challah had a delicate but pleasantly chewy crumb that seemingly never dried out—it was still as light and spongy as Wonder Bread four days later. And while I enthusiastically encourage experimentation, beware of using tangzhong in chewier or more structured breads. The soft pretzels I attempted to make with tangzhong tasted like malty, mealy air. Hamel agrees on this point. “If the dough has a very low hydration to begin with, it’s for a reason,” she explains. “For example, bagel dough is low hydration. Bagels are supposed to be chewy and close-grained and kind of stiff, not soft.”

Otherwise, go wild. Monkey bread, sandwich bread, rolls, brioches, sweet and savory buns. This adapted recipe for kaiser rolls yields the perfect cushion for a bacon, egg, and cheese sandwich because the bread won’t dry out on you in a day or two, and it can sit in a sealed plastic bag on the counter for a few days. Think of it as your past self doing your future self a favor.

RECIPE: Milk Bread Kaiser Rolls

Dayna Evans

Dayna Evans is a writer in New York. You can find more of her writing at daynaevans.com.

[email_signup id="3"]
<div class="email-subscribe exp-subscribe subscribe"> <div class="alert alert-success exp-success ga-etembed-success" style="display:none;"> Great! You've signed up successfully! </div> <div class="alert alert-danger exp-error" style="display:none;"> We are experiencing an error, please try again. </div> <form name="subscribe" id="email-signup" class="email-signup-form" action="https://tastecooking.com/wp-admin/admin-ajax.php" method="POST" target="_top" data-event-assigned="false"> <fieldset class="form-group form-inline email-submit-group"> <label for="email-address" class="sr-only">Email Address</label> <input id="email-newsletter" type="email" placeholder="your@email.com" class="email-newsletter text email form-control" name="email" value=""> <button type="submit" value="Subscribe" name="subscribe" class="btn btn-primary email-submit-btn ga-etembed-success"> <i class="fa fa-envelope"></i> Subscribe </button> </fieldset> <small class="exp-small terms" style=""> By clicking Subscribe, I acknowledge that I have read and agree to the Penguin Random House <a href="http://www.penguinrandomhouse.com/privacy/" target="_blank">Privacy Policy</a> and <a href="http://www.penguinrandomhouse.com/terms/" target="_blank">Terms of Use</a> and agree to receive news and updates from TASTE and Penguin Random House. </small> <fieldset class="field-group checkboxes" style="display:none"> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50501,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook General</strong></span> </label> </div> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50502,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook Promo</strong></span> </label> </div> </fieldset><!-- /.checkboxes --> <input type="hidden" name="data_acq_code" value="TASTE_POPUP_STATIC_ONGOING" /> <input type="hidden" name="data_programs" value="50501|505,50502|505" /> <input type="hidden" name="form_id" value="3" /> <input type="hidden" name="partner" value="" /> <input type="hidden" name="action" value="crown_email_signup_submit" /> <input type="hidden" name="ref_url" value="" /> </form> </div> <script> jQuery(document).ready(function () { var unassigned_forms; setInterval( function() { //Check for unassigned forms var forms = jQuery( '.email-signup-form' ); unassigned_forms = false; forms.each( function( index ) { if ( jQuery( this ).attr( 'data-event-assigned' ) === 'false' ) { unassigned_forms = true; } }); if ( unassigned_forms ) { forms.off( 'submit' ).on( 'submit', function ( e ) { forms.attr( 'data-event-assigned', 'true' ); e.preventDefault(); // Basic email validation var email = jQuery(e.target).find('.email-newsletter').val(), valid_email = false, groupEl = jQuery(e.target).closest('.email-subscribe'); if ( !!email && typeof(email) === "string" ) { var email_array = email.split('@'); if ( email_array.length === 2 ) { if ( email_array[1].split('.').length > 1 ) { valid_email = true; } } } if ( valid_email ) { jQuery('.alert-danger').hide(); // Show loading gif groupEl.find('.email-signup-form').hide(); groupEl.find('.email-submit-loading').show(); // Populate ref_url jQuery(this).find('input[name="ref_url"]').val(window.location.href); // Generate Payload var payload = jQuery(this).serializeArray(); jQuery.ajax({ url: jQuery(this).attr('action'), type: 'POST', data: payload, success: function (data) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display success msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-success').show(); jQuery(e.target).parent().find('#downloadbtn').show(); }, fail: function (err) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display failure msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-danger').show(); } }); } else { groupEl.find('.alert-danger').html('Please enter a valid email address.').show(); } }); forms.off( 'keypress' ).on( 'keypress', function ( e ) { if ( e.which === 13 ) { e.preventDefault(); jQuery( this ).submit(); } }); } }, 100); }); </script>
[email_signup id="3"]
<div class="email-subscribe exp-subscribe subscribe"> <div class="alert alert-success exp-success ga-etembed-success" style="display:none;"> Great! You've signed up successfully! </div> <div class="alert alert-danger exp-error" style="display:none;"> We are experiencing an error, please try again. </div> <form name="subscribe" id="email-signup" class="email-signup-form" action="https://tastecooking.com/wp-admin/admin-ajax.php" method="POST" target="_top" data-event-assigned="false"> <fieldset class="form-group form-inline email-submit-group"> <label for="email-address" class="sr-only">Email Address</label> <input id="email-newsletter" type="email" placeholder="your@email.com" class="email-newsletter text email form-control" name="email" value=""> <button type="submit" value="Subscribe" name="subscribe" class="btn btn-primary email-submit-btn ga-etembed-success"> <i class="fa fa-envelope"></i> Subscribe </button> </fieldset> <small class="exp-small terms" style=""> By clicking Subscribe, I acknowledge that I have read and agree to the Penguin Random House <a href="http://www.penguinrandomhouse.com/privacy/" target="_blank">Privacy Policy</a> and <a href="http://www.penguinrandomhouse.com/terms/" target="_blank">Terms of Use</a> and agree to receive news and updates from TASTE and Penguin Random House. </small> <fieldset class="field-group checkboxes" style="display:none"> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50501,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook General</strong></span> </label> </div> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50502,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook Promo</strong></span> </label> </div> </fieldset><!-- /.checkboxes --> <input type="hidden" name="data_acq_code" value="TASTE_POPUP_STATIC_ONGOING" /> <input type="hidden" name="data_programs" value="50501|505,50502|505" /> <input type="hidden" name="form_id" value="3" /> <input type="hidden" name="partner" value="" /> <input type="hidden" name="action" value="crown_email_signup_submit" /> <input type="hidden" name="ref_url" value="" /> </form> </div> <script> jQuery(document).ready(function () { var unassigned_forms; setInterval( function() { //Check for unassigned forms var forms = jQuery( '.email-signup-form' ); unassigned_forms = false; forms.each( function( index ) { if ( jQuery( this ).attr( 'data-event-assigned' ) === 'false' ) { unassigned_forms = true; } }); if ( unassigned_forms ) { forms.off( 'submit' ).on( 'submit', function ( e ) { forms.attr( 'data-event-assigned', 'true' ); e.preventDefault(); // Basic email validation var email = jQuery(e.target).find('.email-newsletter').val(), valid_email = false, groupEl = jQuery(e.target).closest('.email-subscribe'); if ( !!email && typeof(email) === "string" ) { var email_array = email.split('@'); if ( email_array.length === 2 ) { if ( email_array[1].split('.').length > 1 ) { valid_email = true; } } } if ( valid_email ) { jQuery('.alert-danger').hide(); // Show loading gif groupEl.find('.email-signup-form').hide(); groupEl.find('.email-submit-loading').show(); // Populate ref_url jQuery(this).find('input[name="ref_url"]').val(window.location.href); // Generate Payload var payload = jQuery(this).serializeArray(); jQuery.ajax({ url: jQuery(this).attr('action'), type: 'POST', data: payload, success: function (data) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display success msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-success').show(); jQuery(e.target).parent().find('#downloadbtn').show(); }, fail: function (err) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display failure msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-danger').show(); } }); } else { groupEl.find('.alert-danger').html('Please enter a valid email address.').show(); } }); forms.off( 'keypress' ).on( 'keypress', function ( e ) { if ( e.which === 13 ) { e.preventDefault(); jQuery( this ).submit(); } }); } }, 100); }); </script>