anchor.diff:  class Application {
       final Logger _logger = new Logger("gitinit.Application");
   
  -    static const _ARG_HELP          = 'help';
  -    static const _ARG_LOGLEVEL      = 'loglevel';
  -    static const _ARG_SETTINGS      = 'settings';
  -    static const _ARG_INIT          = 'init';
  +    static const _ARG_HELP              = 'help';
  +    static const _ARG_LOGLEVEL          = 'loglevel';
  +    static const _ARG_SETTINGS          = 'settings';
  +    static const _ARG_INIT              = 'init';
  +    static const _ARG_CHANGELOG         = 'changelog';
  +    static const _ARG_CHANGELOG_KEYS    = 'keys';
   
       ArgParser _parser;
   
  
positive.code:         }
  
          // git remote add origin https://github.com/MikeMitterer/dart-wsk-material.git
          final ProcessResult resultAddOrigin = Process.runSync('git', ["remote", "add" , "origin", "https://github.com/MikeMitterer/$repoName"]);
          if(resultAddOrigin.exitCode != 0) {
              _logger.severe("'remote add' failed ${resultAddOrigin.stderr}");
          }
  
          // git remote set-url origin git@github.com:MikeMitterer/dart-wsk-material.git
          final ProcessResult resultSetUrl = Process.runSync('git', ["remote", "set-url" , "origin", "git@github.com:MikeMitterer/$repoName"]);
          if(resultSetUrl.exitCode != 0) {
              _logger.severe("'remote set-url' faild ${resultSetUrl.stderr}}");
          }
  
negative.code:         _logger.info("Done!");
          _logger.info("    Call now 'git push -u origin --all'");
          _logger.info("    and 'git push -u origin --tags'");
      }
  
      void _writeChangeLog(final Map<String,String> settings) {
          Validate.notEmpty(settings);
  
          final File file = new File("CHANGELOG.md");
          if(file.existsSync()) { file.deleteSync(); }
  
          final StringBuffer buffer = new StringBuffer();
          buffer.writeln("#Change Log#");
  
          String firsCharUppercase(final String word) {
              return "${word.substring(0,1).toUpperCase()}${word.substring(1)}";
          }
  
          void iterateThroughSection(final String tag, final String tagRange,final _LogSections sections,{ final bool isUnreleased: false }) {
              _logger.info("$tag, ${isUnreleased ? '' : _getTagDate(tag) } ($tagRange)");
  
              _logger.info(_getTagHeadline(tag,tagRange));
  
              buffer.writeln();
              if(!isUnreleased) {
                  buffer.writeln("##${_getTagHeadline(tag,tagRange)} - ${_getTagDate(tag)}##");
              } else {
                  buffer.writeln("##${_getTagHeadline(tag,tagRange)}##");
              }
  
              sections.names.forEach((final String key,final List<String> lines) {
                  if(lines.isNotEmpty) {
                      _logger.info("Section: ${firsCharUppercase(key)}");
                      buffer.writeln("###${firsCharUppercase(key)}###");
  
                      lines.forEach((final String line) {
                          _logger.info(" - $line");
                          buffer.writeln("* ${line}");
                      });
                  }
              });
          }
  
  
          final List<String> tags = _getTags();
  
          String tagRange = "${tags.first}...HEAD";
          final _LogSections sectionsUnreleased = _getLogSections(tagRange);
          if(!sectionsUnreleased.isEmpty()) {
              iterateThroughSection("Unreleased",tagRange,sectionsUnreleased,isUnreleased: true );
          }
  
          for(int index = 0; index < tags.length; index++) {
              final String tag = tags[index];
              //_logger.info("Tag: $tag, ${_getTagDate(tag)}");
  
              tagRange = index < tags.length - 1 ? "${tag}...${tags[index + 1]}" : tag;
  
              final _LogSections sections = _getLogSections(tagRange);
              if(!sections.isEmpty()) {
                  iterateThroughSection(tag, tagRange,sections);
              }
          }
  
          file.writeAsString(buffer.toString());
          _logger.info("${file.path} created...");
      }
  
      void _printChangelogLabels() {
          final _LogSections sections = new _LogSections();
          _logger.info("Labels:");
          sections.key2Section.forEach((final String key,final String section ) {
              _logger.info("\t${key.padRight(10)}Sample: git commit -am \"$key: <your message>\"");
          });
          _logger.info("");
      }
  
      _LogSections _getLogSections(final String forTag) {
          Validate.notBlank(forTag);
  
          final String ghaccount = _getAccountName();
          final String ghproject = _getRepoName().replaceFirst(r".git","");
  
          // pretty-format: http://opensource.apple.com/source/Git/Git-19/src/git-htmldocs/pretty-formats.txt
          final String changelogformat = "%s [%h](http://github.com/$ghaccount/$ghproject/commit/%H)";
          _logger.fine(changelogformat);
  
          //'git', 'log',range , "--pretty=format:$changelogformat"
          final ProcessResult resultGetLog = Process.runSync('git', ["log", forTag , "--pretty=format:$changelogformat"]);
          if(resultGetLog.exitCode != 0) {
              _logger.severe("Get Log for $forTag faild with ${resultGetLog.stderr}!");
          }
  
          final _LogSections sections = new _LogSections();
          resultGetLog.stdout.split(new RegExp(r"\n+|\r+")).forEach((final String line) {
              if(line.isNotEmpty) {
                  sections.addLineToSection(line);
              }
          });
  
          return sections;
      }
  
      String _getUser() {
          final ProcessResult resultGetUser = Process.runSync('git', ["config", "--get" , "user.name"]);
          if(resultGetUser.exitCode != 0) {
              _logger.severe("Get user.name faild with ${resultGetUser.stderr}!");
          }
          final String user = resultGetUser.stdout.trim();
          _logger.fine("User: $user");
          return user;
      }
  
      String _getRepoName() {
          final ProcessResult resultGetRepo = Process.runSync('git', ["config", "--get" , "remote.origin.url"]);
          if(resultGetRepo.exitCode != 0) {
              _logger.severe("Get remote.origin.url faild with ${resultGetRepo.stderr}!");
          }
          final String repository = resultGetRepo.stdout.replaceFirst(new RegExp(r"[^/]*/"),"").trim();
          _logger.fine("Repository: $repository");
          return repository;
      }
  
      String _getAccountName() {
          final ProcessResult resultGetRepo = Process.runSync('git', ["config", "--get" , "remote.origin.url"]);
          if(resultGetRepo.exitCode != 0) {
              _logger.severe("Get remote.origin.url faild with ${resultGetRepo.stderr}!");
          }
          String accountname = resultGetRepo.stdout.replaceFirst(new RegExp(r"[^:]*:"),"").trim();
          accountname = accountname.replaceFirst(new RegExp(r"/.*"),"").trim();
          _logger.fine("AccountName: $accountname");
          return accountname;
      }
  
      String _getTagDate(final String tag) {
          Validate.notBlank(tag);
  
          final ProcessResult resultGetTagDate = Process.runSync('git', ["log", "-1" , "--format=%ai", tag ]);
          if(resultGetTagDate.exitCode != 0) {
              _logger.severe("Get Date for Tag $tag faild with ${resultGetTagDate.stderr}!");
          }
          final String date = resultGetTagDate.stdout.replaceFirst(new RegExp(r" .*"),"").trim();
          _logger.fine("Date: $date");
          return date;
      }
  
      String _getTagHeadline(final String tag, final String range) {
          Validate.notBlank(tag);
          Validate.notBlank(range);
  
          final String ghaccount = _getAccountName();
          final String ghproject = _getRepoName().replaceFirst(r".git","");
  
          final String headline = "[$tag](http://github.com/$ghaccount/$ghproject/compare/$range)";
          return headline;
      }
  
      /// Gibt alle Tags zurück und sortiert sie in umgekehrter Reihenfolge
      List<String> _getTags() {
          // git tag -l
          final ProcessResult resultGetTags = Process.runSync('git', ["tag", "-l"]);
          if(resultGetTags.exitCode != 0) {
              _logger.severe("'Tag-Request failed with error ${resultGetTags.stderr}!");
          }
          final List<String> lines = new List<String>();
  
          resultGetTags.stdout.split(new RegExp(r"\s+")).forEach((final String tag) {
              if(tag.isNotEmpty) {
                  lines.add(tag);
              }
          });
  
          lines.sort((final String one, final String two) {
              return one.compareTo(two) * -1;
          });
  
          _logger.fine(lines);
  
          return lines;
      }
  
      /// Goes through the files
  