    /**
     * @private
     */
    Ext.define('Ext.grid.feature.RowWrap', {
        extend: 'Ext.grid.feature.Feature',
        alias: 'feature.rowwrap',

        rowWrapTd: 'td.' + Ext.baseCSSPrefix + 'grid-rowwrap',

        // turn off feature events.
        hasFeatureEvent: false,

        tableTpl: {
            before: function(values, out) {
                if (values.view.bufferedRenderer) {
                    values.view.bufferedRenderer.variableRowHeight = true;
                }
            },
            priority: 200
        },

        wrapTpl: [
            '<tr data-boundView="{view.id}" data-recordId="{record.internalId}" data-recordIndex="{recordIndex}" class="{[values.itemClasses.join(" ")]} ' + Ext.baseCSSPrefix + 'grid-wrap-row">',
                '<td class="' + Ext.baseCSSPrefix + 'grid-rowwrap ' + Ext.baseCSSPrefix + 'grid-td" colSpan="{columns.length}">',
                    '<table class="' + Ext.baseCSSPrefix + '{view.id}-table ' + Ext.baseCSSPrefix + 'grid-table" border="0" cellspacing="0" cellpadding="0">',
                        '{[values.view.renderColumnSizer(out)]}',
                        '{%',
                            'values.itemClasses.length = 0;',
                            'this.nextTpl.applyOut(values, out, parent)',
                        '%}',
                    '</table>',
                '</td>',
            '</tr>', {
                priority: 200
            }
        ],

        init: function(grid) {
            var me = this;
            me.view.addTableTpl(me.tableTpl);
            me.view.addRowTpl(Ext.XTemplate.getTpl(me, 'wrapTpl'));
            me.view.headerCt.on({
                columnhide: me.onColumnHideShow,
                columnshow: me.onColumnHideShow,
                scope: me
            });
        },

        // Keep row wtap colspan in sync with number of *visible* columns.
        onColumnHideShow: function() {
            var view = this.view,
                items = view.el.query(this.rowWrapTd),
                colspan = view.headerCt.getVisibleGridColumns().length,
                len = items.length,
                i;

            for (i = 0; i < len; ++i) {
                items[i].colSpan = colspan;
            }
        }
    });