this.files.forEach(function(f) {
      // Concat specified files.
      var src = f.src.filter(function(filepath) {
        // Warn on and remove invalid source files (if nonull was set).
        if (!grunt.file.exists(filepath)) {
          grunt.log.warn('Source file "' + filepath + '" not found.');
          return false;
        } else {
          return true;
        }
      }).map(function(filepath) {
        // Read file source.
        fp = filepath;
        return grunt.file.read(filepath, { encoding : 'utf8'});
      }).join('');

      fp = fp.substr(fp.lastIndexOf('/') + 1, (fp.indexOf('.hbs') - fp.lastIndexOf('/') - 1));

      // convert length to size
      src = convert.hbsSize(src);

      // convert blocks
      src = convert.hbsBlocks(src);

      // convert special body block
      src = convert.hbsBody(src);

      // convert includes
      src = convert.hbsIncludes(src);

      // convert comments
      src = convert.hbsComments(src);

      // convert if/else
      src = convert.hbsIf(src);

      // wrap with required macro tag
      src = convert.injectMacroHandle(src, fp);

      // substitute tokens
      src = convert.hbsTokens(src);

      src = convert.ftlTrim(src);

      // add version tag
      src = '<#-- grunt-hbs2ftl v.' + pkg.version + ' -->\n' + src;
  
      grunt.file.write(f.dest, src, { encoding : 'utf8'});

      // Print a success message.
      // grunt.log.writeln('File "' + f.dest + '" created.');
    });
    this.files.forEach(function(f) {

      var src = f.src.filter(function(filepath) {
        // Warn on and remove invalid source files (if nonull was set).
        if (!grunt.file.exists(filepath)) {
          grunt.log.warn('Source file "' + filepath + '" not found.');
          return false;
        } else {
          return true;
        }
      }).map(function(filepath) {
        // Read file source.
        // console.log('generating [ ' + filepath + ' ]'); 
        return grunt.file.read(filepath, { encoding : 'utf8'});
      }).join('');

      src = convert.hbsStripHTMLComments(src);

      // console.log('--------- hbsArrayNotation');
      src = convert.hbsArrayNotation(src);

      // convert .length to [namespace]_index
      src = convert.hbsSize(src);

      // convert contentFor
      src = convert.hbsContentFor(src);

      // convert blocks
      src = convert.hbsBlocks(src);

      // convert each to list - high in order execution as it changes variable context internally
      src = convert.hbsWith(src);
      src = convert.hbsEach(src);

      // convert special body block
      src = convert.hbsBody(src);

      // convert includes
      src = convert.hbsIncludes(src);

      // convert explicitly set layouts
      src = convert.hbsExplicitLayout(src);

      // convert comments
      src = convert.hbsComments(src);

      // convert if/else
      src = convert.hbsIf(src);

      // convert eq to if clause
      src = convert.hbsEq(src);

      // convert unless to !if
      src = convert.hbsUnless(src);

      // convert default into string interpolator
      src = convert.hbsDefault(src);

      // handle html literals - also in hbstokens for namespacing
      src = convert.hbsNoEscape(src); 

      // handle {{#join }}
      src = convert.hbsJoin(src);

      // convert handlebars helpers in user-directives
// console.log('--------- hbsHelpers');
      src = convert.hbsHelpers(src); // must be run AFTER convert.hbsBlocks()

      // lastly, convert standard hbs tokens into ftl-versions
// console.log('--------- hbsTokens');
      src = convert.hbsTokens(src);

      // html minify
      src = convert.ftlTrim(src);

      src = globals.versionHeader + src;
      
      src = src.trim();
      
      src = convert.ftlCompress(src);


      // add version tag

      grunt.file.write(f.dest, src, { encoding : 'utf8'});

      // Print a success message.
      grunt.log.writeln('Generating [ ' + f.dest + ' ]');
    });