diff --git a/core/COPYRIGHT.txt b/core/COPYRIGHT.txt
index 07d68a7..18b074e 100644
--- a/core/COPYRIGHT.txt
+++ b/core/COPYRIGHT.txt
@@ -24,5 +24,3 @@ license, including:
   jQuery - Copyright (c) 2008 - 2009 John Resig
 
   Symfony2 - Copyright (c) 2004 - 2011 Fabien Potencier
-
-  Twig - Copyright (c) 2009 - 2012 Fabien Potencier
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index fa1335b..acc82d6 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -204,11 +204,6 @@ const LANGUAGE_NOT_APPLICABLE = 'zxx';
 const LANGUAGE_MULTIPLE = 'mul';
 
 /**
- * The language code used when referring to all languages.
- */
-const LANGUAGE_ALL = TRUE;
-
-/**
  * The type of language used to define the content language.
  */
 const LANGUAGE_TYPE_CONTENT = 'language_content';
@@ -2658,28 +2653,18 @@ function language_multilingual() {
 /**
  * Returns a list of configured languages.
  *
- * @param $all
- *   (optional) A flag depending on the need for locked languages in the
- *   returned list.
- *
  * @return
  *   An associative array of languages, keyed by the language code, ordered by
  *   weight ascending and name ascending.
  */
-function language_list($all = FALSE) {
-
+function language_list() {
   $languages = &drupal_static(__FUNCTION__);
-
   // Initialize master language list.
   if (!isset($languages)) {
-    // Initialize local language list cache.
-   $languages = array();
-
-    // Fill in master language list based on current configuration.
     $default = language_default();
     if (language_multilingual() || module_exists('language')) {
       // Use language module configuration if available.
-      $languages = db_query('SELECT *, 0 as `default` FROM {language} ORDER BY weight ASC, name ASC')->fetchAllAssoc('langcode', PDO::FETCH_ASSOC);
+      $languages = db_query('SELECT * FROM {language} ORDER BY weight ASC, name ASC')->fetchAllAssoc('langcode', PDO::FETCH_ASSOC);
 
       // Initialize default property so callers have an easy reference and can
       // save the same object without data loss.
@@ -2691,58 +2676,9 @@ function language_list($all = FALSE) {
     else {
       // No language module, so use the default language only.
       $languages = array($default->langcode => $default);
-      // Add the special languages, they will be filtered later if needed.
-      $languages += language_locked_languages($default->weight);
     }
   }
 
-  // Filter the full list of languages based on the value of the $all flag. By
-  // default we remove the locked languages, but the caller may request for
-  // those languages to be added as well.
-  $filtered_languages = array();
-  foreach ($languages as $langcode => $language) {
-    if ($language->locked && !$all) {
-      continue;
-     }
-    $filtered_languages[$langcode] = $language;
-  }
-
-  return $filtered_languages;
-}
-
-/**
- * Returns a list with the locked languages.
- *
- * @param int $weight
- *   An integer value that is used as the start value for the weights of the
- *   locked languages.
- *
- * @return
- *   An array of language objects.
- */
-function language_locked_languages($weight = 0) {
-  $locked_language = array(
-    'default' => FALSE,
-    'locked' => TRUE,
-    'enabled' => TRUE,
-  );
-
-  $languages = array();
-  $languages[LANGUAGE_NOT_SPECIFIED] = new Language(array(
-    'langcode' => LANGUAGE_NOT_SPECIFIED,
-    'name' => t('Not specified'),
-    'weight' => ++$weight,
-  ) + $locked_language);
-  $languages[LANGUAGE_NOT_APPLICABLE] = new Language(array(
-    'langcode' => LANGUAGE_NOT_APPLICABLE,
-    'name' => t('Not applicable'),
-    'weight' => ++$weight,
-  ) + $locked_language);
-  $languages[LANGUAGE_MULTIPLE] = new Language(array(
-    'langcode' => LANGUAGE_MULTIPLE,
-    'name' => t('Multiple'),
-    'weight' => ++$weight,
-  ) + $locked_language);
   return $languages;
 }
 
@@ -2756,7 +2692,7 @@ function language_locked_languages($weight = 0) {
  *   A fully-populated language object or FALSE.
  */
 function language_load($langcode) {
-  $languages = language_list(LANGUAGE_ALL);
+  $languages = language_list();
   return isset($languages[$langcode]) ? $languages[$langcode] : FALSE;
 }
 
@@ -2784,16 +2720,6 @@ function language_name($langcode) {
 }
 
 /**
- * Checks if a language is locked.
- *
- * @param $langcode
- *   The language code.
- */
-function language_is_locked($langcode) {
-  return array_key_exists($langcode, language_locked_languages());
-}
-
-/**
  * Returns the default language used on the site.
  *
  * @return
@@ -2805,7 +2731,6 @@ function language_default() {
     'name' => 'English',
     'direction' => 0,
     'weight' => 0,
-    'locked' => 0,
   ));
   $info['default'] = TRUE;
   return new Language($info);
@@ -3013,16 +2938,11 @@ function drupal_classloader() {
         break;
     }
 
-    // Register explicit PSR-0 vendor namespaces.
+    // Register explicit vendor namespaces.
     $loader->registerNamespaces(array(
       // All Symfony-borrowed code lives in /core/vendor/Symfony.
       'Symfony' => DRUPAL_ROOT . '/core/vendor',
     ));
-    // Register PEAR-style vendor namespaces.
-    $loader->registerPrefixes(array(
-      // All Twig-borrowed code lives in /core/vendor/Twig.
-      'Twig' => DRUPAL_ROOT . '/core/vendor',
-    ));
     // Register the Drupal namespace for classes in core as a fallback.
     // This allows to register additional namespaces within the Drupal namespace
     // (e.g., for modules) and avoids an additional file_exists() on the Drupal
diff --git a/core/includes/common.inc b/core/includes/common.inc
index 2375b78..15c54d3 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -643,13 +643,11 @@ function drupal_encode_path($path) {
  * callback.
  *
  * @param $path
- *   (optional) A Drupal path or a full URL, which will be passed to url() to
- *   compute the redirect for the URL.
+ *   A Drupal path or a full URL.
  * @param $options
- *   (optional) An associative array of additional URL options to pass to url().
+ *   An associative array of additional URL options to pass to url().
  * @param $http_response_code
- *   (optional) The HTTP status code to use for the redirection, defaults to
- *   302. The valid values for 3xx redirection status codes are defined in
+ *   The valid values for 3xx redirection status codes are defined in
  *   @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3 RFC 2616 @endlink
  *   and the
  *   @link http://tools.ietf.org/html/draft-reschke-http-status-308-07 draft for the new HTTP status codes: @endlink
@@ -1992,9 +1990,8 @@ function _format_date_callback(array $matches = NULL, $new_langcode = NULL) {
  * alternative than url().
  *
  * @param $path
- *   (optional) The internal path or external URL being linked to, such as
- *   "node/34" or "http://example.com/foo". The default value is equivalent to
- *   passing in '<front>'. A few notes:
+ *   The internal path or external URL being linked to, such as "node/34" or
+ *   "http://example.com/foo". A few notes:
  *   - If you provide a full URL, it will be considered an external URL.
  *   - If you provide only the path (e.g. "node/34"), it will be
  *     considered an internal link. In this case, it should be a system URL,
@@ -2010,8 +2007,7 @@ function _format_date_callback(array $matches = NULL, $new_langcode = NULL) {
  *     include them in $path, or use $options['query'] to let this function
  *     URL encode them.
  * @param $options
- *   (optional) An associative array of additional options, with the following
- *   elements:
+ *   An associative array of additional options, with the following elements:
  *   - 'query': An array of query key/value-pairs (without any URL-encoding) to
  *     append to the URL.
  *   - 'fragment': A fragment identifier (named anchor) to append to the URL.
diff --git a/core/includes/gettext.inc b/core/includes/gettext.inc
deleted file mode 100644
index 4e3b221..0000000
--- a/core/includes/gettext.inc
+++ /dev/null
@@ -1,1131 +0,0 @@
-<?php
-
-/**
- * @file
- * Gettext parsing and generating API.
- *
- * @todo Decouple these functions from Locale API and put to gettext_ namespace.
- */
-
-/**
- * @defgroup locale-api-import-export Translation import/export API.
- * @{
- * Functions to import and export translations.
- *
- * These functions provide the ability to import translations from
- * external files and to export translations and translation templates.
- */
-
-/**
- * Parses Gettext Portable Object information and inserts it into the database.
- *
- * @param $file
- *   Drupal file object corresponding to the PO file to import.
- * @param $langcode
- *   Language code.
- * @param $overwrite_options
- *   An associative array indicating what data should be overwritten, if any.
- *   - not_customized: strings marked not customized should be overwritten.
- *   - customized: strings marked customized should be overwritten.
- * @param $customized
- *   Whether the strings being imported should be saved as customized.
- *   Use LOCALE_CUSTOMIZED or LOCALE_NOT_CUSTOMIZED. All strings in the file
- *   will be saved with this customization flag.
- */
-function _locale_import_po($file, $langcode, $overwrite_options, $customized = LOCALE_NOT_CUSTOMIZED) {
-  // Try to allocate enough time to parse and import the data.
-  drupal_set_time_limit(240);
-
-  // Check if we have the language already in the database.
-  if (!language_load($langcode)) {
-    drupal_set_message(t('The language selected for import is not supported.'), 'error');
-    return FALSE;
-  }
-
-  // Get strings from file (returns on failure after a partial import, or on success)
-  $status = _locale_import_read_po('db-store', $file, $overwrite_options, $langcode, $customized);
-  if ($status === FALSE) {
-    // Error messages are set in _locale_import_read_po().
-    return FALSE;
-  }
-
-  // Get status information on import process.
-  list($header_done, $additions, $updates, $deletes, $skips) = _locale_import_one_string('db-report');
-
-  if (!$header_done) {
-    drupal_set_message(t('The translation file %filename appears to have a missing or malformed header.', array('%filename' => $file->filename)), 'error');
-  }
-
-  // Clear cache and force refresh of JavaScript translations.
-  _locale_invalidate_js($langcode);
-  cache()->deletePrefix('locale:');
-
-  // Rebuild the menu, strings may have changed.
-  menu_router_rebuild();
-
-  drupal_set_message(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => $additions, '%update' => $updates, '%delete' => $deletes)));
-  watchdog('locale', 'Imported %file into %locale: %number new strings added, %update updated and %delete removed.', array('%file' => $file->filename, '%locale' => $langcode, '%number' => $additions, '%update' => $updates, '%delete' => $deletes));
-  if ($skips) {
-    if (module_exists('dblog')) {
-      $skip_message = format_plural($skips, 'A translation string was skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', '@count translation strings were skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', array('@url' => url('admin/reports/dblog')));
-    }
-    else {
-      $skip_message = format_plural($skips, 'A translation string was skipped because of disallowed or malformed HTML. See the log for details.', '@count translation strings were skipped because of disallowed or malformed HTML. See the log for details.');
-    }
-    drupal_set_message($skip_message, 'error');
-    watchdog('locale', '@count disallowed HTML string(s) in %file', array('@count' => $skips, '%file' => $file->uri), WATCHDOG_WARNING);
-  }
-  return TRUE;
-}
-
-/**
- * Parses a Gettext Portable Object file into an array.
- *
- * @param $op
- *   Storage operation type: db-store or mem-store.
- * @param $file
- *   Drupal file object corresponding to the PO file to import.
- * @param $overwrite_options
- *   An associative array indicating what data should be overwritten, if any.
- *   - not_customized: not customized strings should be overwritten.
- *   - customized: customized strings should be overwritten.
- * @param $lang
- *   Language code.
- * @param $customized
- *   Whether the strings being imported should be saved as customized.
- *   Use LOCALE_CUSTOMIZED or LOCALE_NOT_CUSTOMIZED.
- */
-function _locale_import_read_po($op, $file, $overwrite_options = NULL, $lang = NULL, $customized = LOCALE_NOT_CUSTOMIZED) {
-
-  // The file will get closed by PHP on returning from this function.
-  $fd = fopen($file->uri, 'rb');
-  if (!$fd) {
-    _locale_import_message('The translation import failed because the file %filename could not be read.', $file);
-    return FALSE;
-  }
-
-  /*
-   * The parser context. Can be:
-   *  - 'COMMENT' (#)
-   *  - 'MSGID' (msgid)
-   *  - 'MSGID_PLURAL' (msgid_plural)
-   *  - 'MSGCTXT' (msgctxt)
-   *  - 'MSGSTR' (msgstr or msgstr[])
-   *  - 'MSGSTR_ARR' (msgstr_arg)
-   */
-  $context = 'COMMENT';
-
-  // Current entry being read.
-  $current = array();
-
-  // Current plurality for 'msgstr[]'.
-  $plural = 0;
-
-  // Current line.
-  $lineno = 0;
-
-  while (!feof($fd)) {
-    // A line should not be longer than 10 * 1024.
-    $line = fgets($fd, 10 * 1024);
-
-    if ($lineno == 0) {
-      // The first line might come with a UTF-8 BOM, which should be removed.
-      $line = str_replace("\xEF\xBB\xBF", '', $line);
-    }
-
-    $lineno++;
-
-    // Trim away the linefeed.
-    $line = trim(strtr($line, array("\\\n" => "")));
-
-    if (!strncmp('#', $line, 1)) {
-      // Lines starting with '#' are comments.
-
-      if ($context == 'COMMENT') {
-        // Already in comment token, insert the comment.
-        $current['#'][] = substr($line, 1);
-      }
-      elseif (($context == 'MSGSTR') || ($context == 'MSGSTR_ARR')) {
-        // We are currently in string token, close it out.
-        _locale_import_one_string($op, $current, $overwrite_options, $lang, $file, $customized);
-
-        // Start a new entry for the comment.
-        $current         = array();
-        $current['#'][]  = substr($line, 1);
-
-        $context = 'COMMENT';
-      }
-      else {
-        // A comment following any other token is a syntax error.
-        _locale_import_message('The translation file %filename contains an error: "msgstr" was expected but not found on line %line.', $file, $lineno);
-        return FALSE;
-      }
-    }
-    elseif (!strncmp('msgid_plural', $line, 12)) {
-      // A plural form for the current message.
-
-      if ($context != 'MSGID') {
-        // A plural form cannot be added to anything else but the id directly.
-        _locale_import_message('The translation file %filename contains an error: "msgid_plural" was expected but not found on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      // Remove 'msgid_plural' and trim away whitespace.
-      $line = trim(substr($line, 12));
-      // At this point, $line should now contain only the plural form.
-
-      $quoted = _locale_import_parse_quoted($line);
-      if ($quoted === FALSE) {
-        // The plural form must be wrapped in quotes.
-        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      // Append the plural form to the current entry.
-      $current['msgid'] .= LOCALE_PLURAL_DELIMITER . $quoted;
-
-      $context = 'MSGID_PLURAL';
-    }
-    elseif (!strncmp('msgid', $line, 5)) {
-      // Starting a new message.
-
-      if (($context == 'MSGSTR') || ($context == 'MSGSTR_ARR')) {
-        // We are currently in a message string, close it out.
-        _locale_import_one_string($op, $current, $overwrite_options, $lang, $file, $customized);
-
-        // Start a new context for the id.
-        $current = array();
-      }
-      elseif ($context == 'MSGID') {
-        // We are currently already in the context, meaning we passed an id with no data.
-        _locale_import_message('The translation file %filename contains an error: "msgid" is unexpected on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      // Remove 'msgid' and trim away whitespace.
-      $line = trim(substr($line, 5));
-      // At this point, $line should now contain only the message id.
-
-      $quoted = _locale_import_parse_quoted($line);
-      if ($quoted === FALSE) {
-        // The message id must be wrapped in quotes.
-        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      $current['msgid'] = $quoted;
-      $context = 'MSGID';
-    }
-    elseif (!strncmp('msgctxt', $line, 7)) {
-      // Starting a new context.
-
-      if (($context == 'MSGSTR') || ($context == 'MSGSTR_ARR')) {
-        // We are currently in a message, start a new one.
-        _locale_import_one_string($op, $current, $overwrite_options, $lang, $file, $customized);
-        $current = array();
-      }
-      elseif (!empty($current['msgctxt'])) {
-        // A context cannot apply to another context.
-        _locale_import_message('The translation file %filename contains an error: "msgctxt" is unexpected on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      // Remove 'msgctxt' and trim away whitespaces.
-      $line = trim(substr($line, 7));
-      // At this point, $line should now contain the context.
-
-      $quoted = _locale_import_parse_quoted($line);
-      if ($quoted === FALSE) {
-        // The context string must be quoted.
-        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      $current['msgctxt'] = $quoted;
-
-      $context = 'MSGCTXT';
-    }
-    elseif (!strncmp('msgstr[', $line, 7)) {
-      // A message string for a specific plurality.
-
-      if (($context != 'MSGID') && ($context != 'MSGCTXT') && ($context != 'MSGID_PLURAL') && ($context != 'MSGSTR_ARR')) {
-        // Message strings must come after msgid, msgxtxt, msgid_plural, or other msgstr[] entries.
-        _locale_import_message('The translation file %filename contains an error: "msgstr[]" is unexpected on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      // Ensure the plurality is terminated.
-      if (strpos($line, ']') === FALSE) {
-        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      // Extract the plurality.
-      $frombracket = strstr($line, '[');
-      $plural = substr($frombracket, 1, strpos($frombracket, ']') - 1);
-
-      // Skip to the next whitespace and trim away any further whitespace, bringing $line to the message data.
-      $line = trim(strstr($line, " "));
-
-      $quoted = _locale_import_parse_quoted($line);
-      if ($quoted === FALSE) {
-        // The string must be quoted.
-        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      $current['msgstr'][$plural] = $quoted;
-
-      $context = 'MSGSTR_ARR';
-    }
-    elseif (!strncmp("msgstr", $line, 6)) {
-      // A string for the an id or context.
-
-      if (($context != 'MSGID') && ($context != 'MSGCTXT')) {
-        // Strings are only valid within an id or context scope.
-        _locale_import_message('The translation file %filename contains an error: "msgstr" is unexpected on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      // Remove 'msgstr' and trim away away whitespaces.
-      $line = trim(substr($line, 6));
-      // At this point, $line should now contain the message.
-
-      $quoted = _locale_import_parse_quoted($line);
-      if ($quoted === FALSE) {
-        // The string must be quoted.
-        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      $current['msgstr'] = $quoted;
-
-      $context = 'MSGSTR';
-    }
-    elseif ($line != '') {
-      // Anything that is not a token may be a continuation of a previous token.
-
-      $quoted = _locale_import_parse_quoted($line);
-      if ($quoted === FALSE) {
-        // The string must be quoted.
-        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
-        return FALSE;
-      }
-
-      // Append the string to the current context.
-      if (($context == 'MSGID') || ($context == 'MSGID_PLURAL')) {
-        $current['msgid'] .= $quoted;
-      }
-      elseif ($context == 'MSGCTXT') {
-        $current['msgctxt'] .= $quoted;
-      }
-      elseif ($context == 'MSGSTR') {
-        $current['msgstr'] .= $quoted;
-      }
-      elseif ($context == 'MSGSTR_ARR') {
-        $current['msgstr'][$plural] .= $quoted;
-      }
-      else {
-        // No valid context to append to.
-        _locale_import_message('The translation file %filename contains an error: there is an unexpected string on line %line.', $file, $lineno);
-        return FALSE;
-      }
-    }
-  }
-
-  // End of PO file, closed out the last entry.
-  if (($context == 'MSGSTR') || ($context == 'MSGSTR_ARR')) {
-    _locale_import_one_string($op, $current, $overwrite_options, $lang, $file, $customized);
-  }
-  elseif ($context != 'COMMENT') {
-    _locale_import_message('The translation file %filename ended unexpectedly at line %line.', $file, $lineno);
-    return FALSE;
-  }
-}
-
-/**
- * Sets an error message if an error occurred during locale file parsing.
- *
- * @param $message
- *   The message to be translated.
- * @param $file
- *   Drupal file object corresponding to the PO file to import.
- * @param $lineno
- *   An optional line number argument.
- */
-function _locale_import_message($message, $file, $lineno = NULL) {
-  $vars = array('%filename' => $file->filename);
-  if (isset($lineno)) {
-    $vars['%line'] = $lineno;
-  }
-  $t = get_t();
-  drupal_set_message($t($message, $vars), 'error');
-}
-
-/**
- * Performs the specified operation for one string.
- *
- * @param $op
- *   Operation to perform: 'db-store', 'db-report', 'mem-store' or 'mem-report'.
- * @param $value
- *   Details of the string stored.
- * @param $overwrite_options
- *   An associative array indicating what data should be overwritten, if any.
- *   - not_customized: not customized strings should be overwritten.
- *   - customized: customized strings should be overwritten.
- * @param $lang
- *   Language to store the string in.
- * @param $file
- *   Object representation of file being imported, only required when op is
- *   'db-store'.
- * @param $customized
- *   Whether the strings being imported should be saved as customized.
- *   Use LOCALE_CUSTOMIZED or LOCALE_NOT_CUSTOMIZED.
- */
-function _locale_import_one_string($op, $value = NULL, $overwrite_options = NULL, $lang = NULL, $file = NULL, $customized = LOCALE_NOT_CUSTOMIZED) {
-  $report = &drupal_static(__FUNCTION__, array('additions' => 0, 'updates' => 0, 'deletes' => 0, 'skips' => 0));
-  $header_done = &drupal_static(__FUNCTION__ . ':header_done', FALSE);
-  $strings = &drupal_static(__FUNCTION__ . ':strings', array());
-
-  switch ($op) {
-    // Return stored strings
-    case 'mem-report':
-      return $strings;
-
-    // Store string in memory (only supports single strings)
-    case 'mem-store':
-      $strings[isset($value['msgctxt']) ? $value['msgctxt'] : ''][$value['msgid']] = $value['msgstr'];
-      return;
-
-    // Called at end of import to inform the user
-    case 'db-report':
-      return array($header_done, $report['additions'], $report['updates'], $report['deletes'], $report['skips']);
-
-    // Store the string we got in the database.
-    case 'db-store':
-
-      if ($value['msgid'] == '') {
-        // If 'msgid' is empty, it means we got values for the header of the
-        // file as per the structure of the Gettext format.
-        $locale_plurals = variable_get('locale_translation_plurals', array());
-        if (array_sum($overwrite_options) || empty($locale_plurals[$lang]['plurals'])) {
-          // Since we only need to parse the header if we ought to update the
-          // plural formula, only run this if we don't need to keep existing
-          // data untouched or if we don't have an existing plural formula.
-          $header = _locale_import_parse_header($value['msgstr']);
-
-          // Get and store the plural formula if available.
-          if (isset($header["Plural-Forms"]) && $p = _locale_import_parse_plural_forms($header["Plural-Forms"], $file->uri)) {
-            list($nplurals, $formula) = $p;
-            $locale_plurals[$lang] = array(
-              'plurals' => $nplurals,
-              'formula' => $formula,
-            );
-            variable_set('locale_translation_plurals', $locale_plurals);
-          }
-        }
-        $header_done = TRUE;
-      }
-
-      else {
-        // Found a string to store, clean up and prepare the data.
-        $comments = _locale_import_shorten_comments(empty($value['#']) ? array() : $value['#']);
-
-        if (is_array($value['msgstr'])) {
-          // Sort plural variants by their form index.
-          ksort($value['msgstr']);
-          // Serialize plural variants in one string by LOCALE_PLURAL_DELIMITER.
-          $value['msgstr'] = implode(LOCALE_PLURAL_DELIMITER, $value['msgstr']);
-        }
-
-        _locale_import_one_string_db(
-          $report,
-          $lang,
-          isset($value['msgctxt']) ? $value['msgctxt'] : '',
-          $value['msgid'],
-          $value['msgstr'],
-          $comments,
-          $overwrite_options,
-          $customized
-        );
-      }
-  } // end of db-store operation
-}
-
-/**
- * Imports one string into the database.
- *
- * @param $report
- *   Report array summarizing the number of changes done in the form:
- *   array(inserts, updates, deletes).
- * @param $langcode
- *   Language code to import string into.
- * @param $context
- *   The context of this string.
- * @param $source
- *   Source string.
- * @param $translation
- *   Translation to language specified in $langcode.
- * @param $location
- *   Location value to save with source string.
- * @param $overwrite_options
- *   An associative array indicating what data should be overwritten, if any.
- *   - not_customized: not customized strings should be overwritten.
- *   - customized: customized strings should be overwritten.
- * @param $customized
- *   (optional) Whether the strings being imported should be saved as customized.
- *   Use LOCALE_CUSTOMIZED or LOCALE_NOT_CUSTOMIZED.
- *
- * @return
- *   The string ID of the existing string modified or the new string added.
- */
-function _locale_import_one_string_db(&$report, $langcode, $context, $source, $translation, $location, $overwrite_options, $customized = LOCALE_NOT_CUSTOMIZED) {
-
-  // Initialize overwrite options if not set.
-  $overwrite_options += array(
-    'not_customized' => FALSE,
-    'customized' => FALSE,
-  );
-
-  // Look up the source string and any existing translation.
-  $string = db_query("SELECT s.lid, t.customized FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.source = :source AND s.context = :context", array(
-    ':source' => $source,
-    ':context' => $context,
-    ':language' => $langcode,
-    ))
-    ->fetchObject();
-
-  if (!empty($translation)) {
-    // Skip this string unless it passes a check for dangerous code.
-    if (!locale_string_is_safe($translation)) {
-      watchdog('locale', 'Import of string "%string" was skipped because of disallowed or malformed HTML.', array('%string' => $translation), WATCHDOG_ERROR);
-      $report['skips']++;
-      return 0;
-    }
-    elseif (isset($string->lid)) {
-      // We have this source string saved already.
-      db_update('locales_source')
-        ->fields(array(
-          'location' => $location,
-        ))
-        ->condition('lid', $string->lid)
-        ->execute();
-
-      if (!isset($string->customized)) {
-        // No translation in this language.
-        db_insert('locales_target')
-          ->fields(array(
-            'lid' => $string->lid,
-            'language' => $langcode,
-            'translation' => $translation,
-            'customized' => $customized,
-          ))
-          ->execute();
-
-        $report['additions']++;
-      }
-      elseif ($overwrite_options[$string->customized ? 'customized' : 'not_customized']) {
-        // Translation exists, only overwrite if instructed.
-        db_update('locales_target')
-          ->fields(array(
-            'translation' => $translation,
-            'customized' => $customized,
-          ))
-          ->condition('language', $langcode)
-          ->condition('lid', $string->lid)
-          ->execute();
-
-        $report['updates']++;
-      }
-      return $string->lid;
-    }
-    else {
-      // No such source string in the database yet.
-      $lid = db_insert('locales_source')
-        ->fields(array(
-          'location' => $location,
-          'source' => $source,
-          'context' => (string) $context,
-        ))
-        ->execute();
-
-      db_insert('locales_target')
-        ->fields(array(
-           'lid' => $lid,
-           'language' => $langcode,
-           'translation' => $translation,
-           'customized' => $customized,
-        ))
-        ->execute();
-
-      $report['additions']++;
-      return $lid;
-    }
-  }
-  elseif (isset($string->lid) && isset($string->customized) && $overwrite_options[$string->customized ? 'customized' : 'not_customized']) {
-    // Empty translation, remove existing if instructed.
-    db_delete('locales_target')
-      ->condition('language', $langcode)
-      ->condition('lid', $string->lid)
-      ->execute();
-
-    $report['deletes']++;
-    return $string->lid;
-  }
-}
-
-/**
- * Parses a Gettext Portable Object file header.
- *
- * @param $header
- *   A string containing the complete header.
- *
- * @return
- *   An associative array of key-value pairs.
- */
-function _locale_import_parse_header($header) {
-  $header_parsed = array();
-  $lines = array_map('trim', explode("\n", $header));
-  foreach ($lines as $line) {
-    if ($line) {
-      list($tag, $contents) = explode(":", $line, 2);
-      $header_parsed[trim($tag)] = trim($contents);
-    }
-  }
-  return $header_parsed;
-}
-
-/**
- * Parses a Plural-Forms entry from a Gettext Portable Object file header.
- *
- * @param $pluralforms
- *   A string containing the Plural-Forms entry.
- * @param $filepath
- *   A string containing the filepath.
- *
- * @return
- *   An array containing the number of plurals and a
- *   formula in PHP for computing the plural form.
- */
-function _locale_import_parse_plural_forms($pluralforms, $filepath) {
-  // First, delete all whitespace
-  $pluralforms = strtr($pluralforms, array(" " => "", "\t" => ""));
-
-  // Select the parts that define nplurals and plural
-  $nplurals = strstr($pluralforms, "nplurals=");
-  if (strpos($nplurals, ";")) {
-    $nplurals = substr($nplurals, 9, strpos($nplurals, ";") - 9);
-  }
-  else {
-    return FALSE;
-  }
-  $plural = strstr($pluralforms, "plural=");
-  if (strpos($plural, ";")) {
-    $plural = substr($plural, 7, strpos($plural, ";") - 7);
-  }
-  else {
-    return FALSE;
-  }
-
-  // Get PHP version of the plural formula
-  $plural = _locale_import_parse_arithmetic($plural);
-
-  if ($plural !== FALSE) {
-    return array($nplurals, $plural);
-  }
-  else {
-    drupal_set_message(t('The translation file %filepath contains an error: the plural formula could not be parsed.', array('%filepath' => $filepath)), 'error');
-    return FALSE;
-  }
-}
-
-/**
- * Parses and sanitizes an arithmetic formula into a PHP expression.
- *
- * While parsing, we ensure, that the operators have the right
- * precedence and associativity.
- *
- * @param $string
- *   A string containing the arithmetic formula.
- *
- * @return
- *   The PHP version of the formula.
- */
-function _locale_import_parse_arithmetic($string) {
-  // Operator precedence table
-  $precedence = array("(" => -1, ")" => -1, "?" => 1, ":" => 1, "||" => 3, "&&" => 4, "==" => 5, "!=" => 5, "<" => 6, ">" => 6, "<=" => 6, ">=" => 6, "+" => 7, "-" => 7, "*" => 8, "/" => 8, "%" => 8);
-  // Right associativity
-  $right_associativity = array("?" => 1, ":" => 1);
-
-  $tokens = _locale_import_tokenize_formula($string);
-
-  // Parse by converting into infix notation then back into postfix
-  // Operator stack - holds math operators and symbols
-  $operator_stack = array();
-  // Element Stack - holds data to be operated on
-  $element_stack = array();
-
-  foreach ($tokens as $token) {
-    $current_token = $token;
-
-    // Numbers and the $n variable are simply pushed into $element_stack
-    if (is_numeric($token)) {
-      $element_stack[] = $current_token;
-    }
-    elseif ($current_token == "n") {
-      $element_stack[] = '$n';
-    }
-    elseif ($current_token == "(") {
-      $operator_stack[] = $current_token;
-    }
-    elseif ($current_token == ")") {
-      $topop = array_pop($operator_stack);
-      while (isset($topop) && ($topop != "(")) {
-        $element_stack[] = $topop;
-        $topop = array_pop($operator_stack);
-      }
-    }
-    elseif (!empty($precedence[$current_token])) {
-      // If it's an operator, then pop from $operator_stack into $element_stack until the
-      // precedence in $operator_stack is less than current, then push into $operator_stack
-      $topop = array_pop($operator_stack);
-      while (isset($topop) && ($precedence[$topop] >= $precedence[$current_token]) && !(($precedence[$topop] == $precedence[$current_token]) && !empty($right_associativity[$topop]) && !empty($right_associativity[$current_token]))) {
-        $element_stack[] = $topop;
-        $topop = array_pop($operator_stack);
-      }
-      if ($topop) {
-        $operator_stack[] = $topop;   // Return element to top
-      }
-      $operator_stack[] = $current_token;      // Parentheses are not needed
-    }
-    else {
-      return FALSE;
-    }
-  }
-
-  // Flush operator stack
-  $topop = array_pop($operator_stack);
-  while ($topop != NULL) {
-    $element_stack[] = $topop;
-    $topop = array_pop($operator_stack);
-  }
-
-  // Now extract formula from stack
-  $previous_size = count($element_stack) + 1;
-  while (count($element_stack) < $previous_size) {
-    $previous_size = count($element_stack);
-    for ($i = 2; $i < count($element_stack); $i++) {
-      $op = $element_stack[$i];
-      if (!empty($precedence[$op])) {
-        $f = "";
-        if ($op == ":") {
-          $f = $element_stack[$i - 2] . "):" . $element_stack[$i - 1] . ")";
-        }
-        elseif ($op == "?") {
-          $f = "(" . $element_stack[$i - 2] . "?(" . $element_stack[$i - 1];
-        }
-        else {
-          $f = "(" . $element_stack[$i - 2] . $op . $element_stack[$i - 1] . ")";
-        }
-        array_splice($element_stack, $i - 2, 3, $f);
-        break;
-      }
-    }
-  }
-
-  // If only one element is left, the number of operators is appropriate
-  if (count($element_stack) == 1) {
-    return $element_stack[0];
-  }
-  else {
-    return FALSE;
-  }
-}
-
-/**
- * Provides backward-compatible formula parsing for token_get_all().
- *
- * @param $string
- *   A string containing the arithmetic formula.
- *
- * @return
- *   The PHP version of the formula.
- */
-function _locale_import_tokenize_formula($formula) {
-  $formula = str_replace(" ", "", $formula);
-  $tokens = array();
-  for ($i = 0; $i < strlen($formula); $i++) {
-    if (is_numeric($formula[$i])) {
-      $num = $formula[$i];
-      $j = $i + 1;
-      while ($j < strlen($formula) && is_numeric($formula[$j])) {
-        $num .= $formula[$j];
-        $j++;
-      }
-      $i = $j - 1;
-      $tokens[] = $num;
-    }
-    elseif ($pos = strpos(" =<>!&|", $formula[$i])) { // We won't have a space
-      $next = $formula[$i + 1];
-      switch ($pos) {
-        case 1:
-        case 2:
-        case 3:
-        case 4:
-          if ($next == '=') {
-            $tokens[] = $formula[$i] . '=';
-            $i++;
-          }
-          else {
-            $tokens[] = $formula[$i];
-          }
-          break;
-        case 5:
-          if ($next == '&') {
-            $tokens[] = '&&';
-            $i++;
-          }
-          else {
-            $tokens[] = $formula[$i];
-          }
-          break;
-        case 6:
-          if ($next == '|') {
-            $tokens[] = '||';
-            $i++;
-          }
-          else {
-            $tokens[] = $formula[$i];
-          }
-          break;
-      }
-    }
-    else {
-      $tokens[] = $formula[$i];
-    }
-  }
-  return $tokens;
-}
-
-/**
- * Generates a short, one-string version of the passed comment array.
- *
- * @param $comment
- *   An array of strings containing a comment.
- *
- * @return
- *   Short one-string version of the comment.
- */
-function _locale_import_shorten_comments($comment) {
-  $comm = '';
-  while (count($comment)) {
-    $test = $comm . substr(array_shift($comment), 1) . ', ';
-    if (strlen($comm) < 130) {
-      $comm = $test;
-    }
-    else {
-      break;
-    }
-  }
-  return trim(substr($comm, 0, -2));
-}
-
-/**
- * Parses a string in quotes.
- *
- * @param $string
- *   A string specified with enclosing quotes.
- *
- * @return
- *   The string parsed from inside the quotes.
- */
-function _locale_import_parse_quoted($string) {
-  if (substr($string, 0, 1) != substr($string, -1, 1)) {
-    return FALSE;   // Start and end quotes must be the same
-  }
-  $quote = substr($string, 0, 1);
-  $string = substr($string, 1, -1);
-  if ($quote == '"') {        // Double quotes: strip slashes
-    return stripcslashes($string);
-  }
-  elseif ($quote == "'") {  // Simple quote: return as-is
-    return $string;
-  }
-  else {
-    return FALSE;             // Unrecognized quote
-  }
-}
-
-/**
- * Generates a structured array of all translated strings for the language.
- *
- * @param $language
- *   Language object to generate the output for, or NULL if generating
- *   translation template.
- * @param $options
- *   (optional) An associative array specifying what to include in the output:
- *   - customized: include customized strings (if TRUE)
- *   - uncustomized: include non-customized string (if TRUE)
- *   - untranslated: include untranslated source strings (if TRUE)
- *   Ignored if $language is NULL.
- *
- * @return
- *   An array of translated strings that can be used to generate an export.
- */
-function _locale_export_get_strings($language = NULL, $options = array()) {
-
-  // Assume FALSE for all options if not provided by the API.
-  $options += array(
-    'customized' => FALSE,
-    'not_customized' => FALSE,
-    'not_translated' => FALSE,
-  );
-  if (array_sum($options) == 0) {
-    // If user asked to not include anything in the translation files,
-    // that would not make sense, so just fall back on providing a template.
-    $language = NULL;
-  }
-
-  // Build and execute query to collect source strings and translations.
-  $query = db_select('locales_source', 's');
-  if (!empty($language)) {
-    if ($options['not_translated']) {
-      // Left join to keep untranslated strings in.
-      $query->leftJoin('locales_target', 't', 's.lid = t.lid AND t.language = :language', array(':language' => $language->langcode));
-    }
-    else {
-      // Inner join to filter for only translations.
-      $query->innerJoin('locales_target', 't', 's.lid = t.lid AND t.language = :language', array(':language' => $language->langcode));
-    }
-    if ($options['customized']) {
-      if (!$options['not_customized']) {
-        // Filter for customized strings only.
-        $query->condition('t.customized', LOCALE_CUSTOMIZED);
-      }
-      // Else no filtering needed in this case.
-    }
-    else {
-      if ($options['not_customized']) {
-        // Filter for non-customized strings only.
-        $query->condition('t.customized', LOCALE_NOT_CUSTOMIZED);
-      }
-      else {
-        // Filter for strings without translation.
-        $query->isNull('t.translation');
-      }
-    }
-    $query->fields('t', array('translation'));
-  }
-  else {
-    $query->leftJoin('locales_target', 't', 's.lid = t.lid');
-  }
-  $query->fields('s', array('lid', 'source', 'context', 'location'));
-  $result = $query->execute();
-
-  // Structure results in an array with metainformation on the strings.
-  $strings = array();
-  foreach ($result as $child) {
-    $strings[$child->lid] = array(
-      'comment'     => $child->location,
-      'source'      => $child->source,
-      'context'     => $child->context,
-      'translation' => isset($child->translation) ? $child->translation : '',
-    );
-  }
-  return $strings;
-}
-
-/**
- * Generates the PO(T) file contents for the given strings.
- *
- * @param $language
- *   Language object to generate the output for, or NULL if generating
- *   translation template.
- * @param $strings
- *   Array of strings to export. See _locale_export_get_strings()
- *   on how it should be formatted.
- * @param $header
- *   The header portion to use for the output file. Defaults
- *   are provided for PO and POT files.
- */
-function _locale_export_po_generate($language = NULL, $strings = array(), $header = NULL) {
-  global $user;
-
-  $locale_plurals = variable_get('locale_translation_plurals', array());
-
-  if (!isset($header)) {
-    if (isset($language)) {
-      $header = '# ' . $language->name . ' translation of ' . variable_get('site_name', 'Drupal') . "\n";
-      $header .= '# Generated by ' . $user->name . ' <' . $user->mail . ">\n";
-      $header .= "#\n";
-      $header .= "msgid \"\"\n";
-      $header .= "msgstr \"\"\n";
-      $header .= "\"Project-Id-Version: PROJECT VERSION\\n\"\n";
-      $header .= "\"POT-Creation-Date: " . date("Y-m-d H:iO") . "\\n\"\n";
-      $header .= "\"PO-Revision-Date: " . date("Y-m-d H:iO") . "\\n\"\n";
-      $header .= "\"Last-Translator: NAME <EMAIL@ADDRESS>\\n\"\n";
-      $header .= "\"Language-Team: LANGUAGE <EMAIL@ADDRESS>\\n\"\n";
-      $header .= "\"MIME-Version: 1.0\\n\"\n";
-      $header .= "\"Content-Type: text/plain; charset=utf-8\\n\"\n";
-      $header .= "\"Content-Transfer-Encoding: 8bit\\n\"\n";
-      if (!empty($locale_plurals[$language->langcode]['formula'])) {
-        $header .= "\"Plural-Forms: nplurals=" . $locale_plurals[$language->langcode]['plurals'] . "; plural=" . strtr($locale_plurals[$language->langcode]['formula'], array('$' => '')) . ";\\n\"\n";
-        // Remember number of plural variants to optimize the export.
-        $nplurals = $locale_plurals[$language->langcode]['plurals'];
-      }
-      else {
-        // Remember we did not have a plural number for the export.
-        $nplurals = 0;
-      }
-    }
-    else {
-      $header = "# LANGUAGE translation of PROJECT\n";
-      $header .= "# Copyright (c) YEAR NAME <EMAIL@ADDRESS>\n";
-      $header .= "#\n";
-      $header .= "msgid \"\"\n";
-      $header .= "msgstr \"\"\n";
-      $header .= "\"Project-Id-Version: PROJECT VERSION\\n\"\n";
-      $header .= "\"POT-Creation-Date: " . date("Y-m-d H:iO") . "\\n\"\n";
-      $header .= "\"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\\n\"\n";
-      $header .= "\"Last-Translator: NAME <EMAIL@ADDRESS>\\n\"\n";
-      $header .= "\"Language-Team: LANGUAGE <EMAIL@ADDRESS>\\n\"\n";
-      $header .= "\"MIME-Version: 1.0\\n\"\n";
-      $header .= "\"Content-Type: text/plain; charset=utf-8\\n\"\n";
-      $header .= "\"Content-Transfer-Encoding: 8bit\\n\"\n";
-      $header .= "\"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n\"\n";
-    }
-  }
-
-  $output = $header . "\n";
-
-  foreach ($strings as $lid => $string) {
-    if ($string['comment']) {
-      $output .= '#: ' . $string['comment'] . "\n";
-    }
-    if (!empty($string['context'])) {
-      $output .= 'msgctxt ' . _locale_export_string($string['context']);
-    }
-    if (strpos($string['source'], LOCALE_PLURAL_DELIMITER) !== FALSE) {
-      // Export plural string.
-      $export_array = explode(LOCALE_PLURAL_DELIMITER, $string['source']);
-      $output .= 'msgid ' . _locale_export_string($export_array[0]);
-      $output .= 'msgid_plural ' . _locale_export_string($export_array[1]);
-      if (isset($language)) {
-        $export_array = explode(LOCALE_PLURAL_DELIMITER, $string['translation']);
-        for ($i = 0; $i < $nplurals; $i++) {
-          if (isset($export_array[$i])) {
-            $output .= 'msgstr[' . $i . '] ' . _locale_export_string($export_array[$i]);
-          }
-          else {
-            $output .= 'msgstr[' . $i . '] ""' . "\n";
-          }
-        }
-      }
-      else {
-        $output .= 'msgstr[0] ""' . "\n";
-        $output .= 'msgstr[1] ""' . "\n";
-      }
-    }
-    else {
-      $output .= 'msgid ' . _locale_export_string($string['source']);
-      $output .= 'msgstr ' . _locale_export_string($string['translation']);
-    }
-    $output .= "\n";
-  }
-  return $output;
-}
-
-/**
- * Writes a generated PO or POT file to the output.
- *
- * @param $language
- *   Language object to generate the output for, or NULL if generating
- *   translation template.
- * @param $output
- *   The PO(T) file to output as a string. See _locale_export_generate_po()
- *   on how it can be generated.
- */
-function _locale_export_po($language = NULL, $output = NULL) {
-  // Log the export event.
-  if (isset($language)) {
-    $filename = $language->langcode . '.po';
-    watchdog('locale', 'Exported %locale translation file: %filename.', array('%locale' => $language->name, '%filename' => $filename));
-  }
-  else {
-    $filename = 'drupal.pot';
-    watchdog('locale', 'Exported translation file: %filename.', array('%filename' => $filename));
-  }
-  // Download the file for the client.
-  header("Content-Disposition: attachment; filename=$filename");
-  header("Content-Type: text/plain; charset=utf-8");
-  print $output;
-  drupal_exit();
-}
-
-/**
- * Prints a string on multiple lines.
- */
-function _locale_export_string($str) {
-  $stri = addcslashes($str, "\0..\37\\\"");
-  $parts = array();
-
-  // Cut text into several lines
-  while ($stri != "") {
-    $i = strpos($stri, "\\n");
-    if ($i === FALSE) {
-      $curstr = $stri;
-      $stri = "";
-    }
-    else {
-      $curstr = substr($stri, 0, $i + 2);
-      $stri = substr($stri, $i + 2);
-    }
-    $curparts = explode("\n", _locale_export_wrap($curstr, 70));
-    $parts = array_merge($parts, $curparts);
-  }
-
-  // Multiline string
-  if (count($parts) > 1) {
-    return "\"\"\n\"" . implode("\"\n\"", $parts) . "\"\n";
-  }
-  // Single line string
-  elseif (count($parts) == 1) {
-    return "\"$parts[0]\"\n";
-  }
-  // No translation
-  else {
-    return "\"\"\n";
-  }
-}
-
-/**
- * Wraps text for Portable Object (Template) files.
- */
-function _locale_export_wrap($str, $len) {
-  $words = explode(' ', $str);
-  $return = array();
-
-  $cur = "";
-  $nstr = 1;
-  while (count($words)) {
-    $word = array_shift($words);
-    if ($nstr) {
-      $cur = $word;
-      $nstr = 0;
-    }
-    elseif (strlen("$cur $word") > $len) {
-      $return[] = $cur . " ";
-      $cur = $word;
-    }
-    else {
-      $cur = "$cur $word";
-    }
-  }
-  $return[] = $cur;
-
-  return implode("\n", $return);
-}
-
-/**
- * @} End of "defgroup locale-api-import-export".
- */
diff --git a/core/includes/gettext.sketch.inc b/core/includes/gettext.sketch.inc
new file mode 100644
index 0000000..fdaa2c5
--- /dev/null
+++ b/core/includes/gettext.sketch.inc
@@ -0,0 +1,195 @@
+<?php
+
+/**
+ * @file
+ * Experimental "sketchy" code for gettext parsing and generating API.
+ * For a world without failures, exceptions and certainly without users ;)
+ */
+
+use Drupal\Core\Gettext\BatchStateInterface;
+
+use Drupal\Core\Gettext\PoFileWriter;
+use Drupal\Core\Gettext\PoFileReader;
+
+use Drupal\Core\Gettext\PoDatabaseWriter;
+use Drupal\Core\Gettext\PoDatabaseReader;
+
+/**
+ * Example code to import a po file into the database.
+ *
+ * Import a po file into the Database.
+ * TODO: xml ?!?
+ * The file may be local, remote (via stream wrapper) or even XML.
+ * The import has a small memory footprint.
+ * The import may be split up to enable batch handling.
+ */
+$langcode = 'nl';
+
+$reader = new PoFileReader();
+$reader->setURI('public://source.po.txt');
+$reader->setLangcode($langcode);
+$reader->open();
+
+// Get header
+$header = $reader->getHeader();
+
+$writer = new PoDatabaseWriter();
+$writer->setLangcode($langcode);
+
+// Write 10 items
+$writer->writeItems($reader, 10);
+$state = $reader->getState();
+// Store state in Batch
+$reader->setState($state);
+
+// Write remaining items
+$writer->writeItems($reader);
+
+// Invoke it through batch
+gettext_transfer($reader, $writer);
+
+/**
+ * Example code to export translations to a po file.
+ *
+ * Export gettext data to a PO file.
+ * The file may be local, remote (via stream wrapper) or even XML.
+ * The import has a small memory footprint.
+ * The import may be split up to enable batch handling.
+ */
+
+$reader = new PoDatabaseReader;
+$reader->setLangcode($langcode);
+$destination = 'public://destination.po.txt';
+$writer = new PoFileWriter();
+$writer->setURI($destination);
+$writer->setLangcode($langcode);
+$writer->setHeader($reader->getHeader());
+
+
+$writer->writeItems($reader);
+
+/**
+ * Transfers gettext data from source to destination.
+ */
+function gettext_transfer($reader, $writer) {
+  // Use batch processing if both source and destination support it and the source
+  // is large enough. If not, process in once.
+  if ($reader instanceof BatchStateInterface && $writer instanceof BatchStateInterface) {
+    // Transfer data in batches.
+    // Built and execute batch.
+    $batch = gettext_transfer_batch_setup($reader, $writer);
+    batch_set($batch);
+  }
+  else {
+    $writer->writeItems($reader);
+  }
+}
+
+/**
+ * Set up a batch process to transfer Gettext data.
+ */
+function gettext_transfer_batch_setup($reader, $writer) {
+  $batch = array(
+    'operations' => array(
+      // TODO: can this be objects?
+      // Shouldn't we use $reader->getState() / $writer->getState();
+      array('gettext_transfer_batch_op', array($reader, $writer)),
+    ),
+    'finished' => 'gettext_transfer_batch_finished',
+  );
+  return $batch;
+}
+
+/**
+ * Batch operation transferring gettext data.
+ *
+ * @todo Add source filter conditions (context, language(?)) as parameter.
+ */
+function gettext_transfer_batch_op($source, $destination) {
+  // Initialize sandbox for batch reading.
+  if (empty($context['sandbox'])) {
+    $context['sandbox']['transfer'] = array(
+      'chunk' => min($source->chunkSize(), $destination->chunkSize()),
+    );
+  }
+
+  // Execute one transfer cycle, which will process bite size 'chunks'.
+  $success = gettext_transfer_execute($source, $destination, $context['sandbox']['transfer']);
+
+  // After a number of cycles executing gettext_transfer_execute() the transfer
+  // is completed.
+  // See gettextapi_import_batch_op() for details.
+  if ($context['sandbox']['transfer']['finished']) {
+    $context['finished'] = 1;
+
+    if ($success) {
+      // Collect statistics from $context['sandbox']['transfer']
+      // and tell the world about what great work we did.
+    }
+  }
+}
+
+/**
+ * Batch wrap-up for gettext data transfer.
+ */
+function gettext_transfer_batch_finished($success, $results, $operations) {
+  if ($success) {
+    // Call post processing handler defined by the destination object.
+    // Can we get the callback and arguments via $results?
+    $post_process_callback = $results['post_process_callback'];
+    $arguments = $results['post_process_arguments'];
+    $post_process_callback($arguments);
+
+    // We did it, Magoo! :)
+  }
+  else {
+    // Sadly reporting where it went wrong.
+  }
+}
+
+/**
+ * Post processing for gettext language import into the database.
+ *
+ * To be called after successfull (batch) import.
+ */
+function gettext_post_process_import($langcode) {
+  // After succesfull import we refresh all affected parts of the system.
+  _locale_invalidate_js($langcode);
+  cache_clear_all('locale:', 'cache', TRUE);
+  menu_rebuild();
+}
+
+/**
+ * Transfer gettext data from source to destination in bite size chunks.
+ */
+function gettext_transfer_execute($source, $destination, &$transfer) {
+  // If transfer is not yet started we set the header data.
+  // The header (if supported) is written before the first translation is written.
+  if (!$destination->inProgress()) {
+    $destination->setHeader($source->getHeader());
+  }
+
+  //TODO: this is not yet rewriten to PoFile|Database|Reader|Writer
+  $chunk = $transfer['chunk'];
+  // Transfer translations as long as valid data is available and
+  // the bite size chunk is not yet swallowed.
+  while ($source->valid() && $chunk > 0) {
+    // Get one translation from source, write it to destination.
+    $translation = $source->read();
+    $destination->write($translation);
+    $chunk--;
+  }
+
+  // Report the percentage of completion for progress reporting.
+  // Ai, user interface. Why do we bother ;)
+  $transfer['state']['percentage_of_completion'] = $source->poc();
+
+  // Close connections when we are done and report the results.
+  if ($source->finished()) {
+    $destination->finish();
+    $transfer['finished'] = TRUE;
+  }
+
+  // Report statistics including errors and error log.
+  $transfer['result'] = $destination->statistics();
+}
diff --git a/core/includes/install.inc b/core/includes/install.inc
index 96e84b3..fbd279e 100644
--- a/core/includes/install.inc
+++ b/core/includes/install.inc
@@ -2,6 +2,7 @@
 
 use Drupal\Core\Database\Database;
 use Drupal\Core\Config\FileStorage;
+use Drupal\Core\Gettext\Gettext;
 
 /**
  * Indicates that a module has not been installed yet.
@@ -717,13 +718,7 @@ function st($string, array $args = array(), array $options = array()) {
       // that multiple files end with the same extension, even if unlikely.
       $files = install_find_translation_files($install_state['parameters']['langcode']);
       if (!empty($files)) {
-        // Include cross-dependent code from locale module and gettext.inc.
-        require_once DRUPAL_ROOT . '/core/modules/locale/locale.module';
-        require_once DRUPAL_ROOT . '/core/includes/gettext.inc';
-        foreach ($files as $file) {
-          _locale_import_read_po('mem-store', $file);
-        }
-        $strings = _locale_import_one_string('mem-report');
+        $strings = Gettext::filesToArray($install_state['parameters']['langcode'], $files);
       }
     }
   }
diff --git a/core/includes/update.inc b/core/includes/update.inc
index 49df15b..65cbcf4 100644
--- a/core/includes/update.inc
+++ b/core/includes/update.inc
@@ -199,55 +199,16 @@ function update_prepare_d8_language() {
     update_module_add_to_system($modules);
     update_module_enable($modules);
 
-    // Rename language column to langcode and set it again as the primary key.
-    if (db_field_exists('language', 'language')) {
-      db_drop_primary_key('language');
-      $langcode_spec = array(
-        'type' => 'varchar',
-        'length' => 12,
-        'not null' => TRUE,
-        'default' => '',
-        'description' => "Language code, e.g. 'de' or 'en-US'.",
-      );
-      db_change_field('language', 'language', 'langcode', $langcode_spec, array('primary key' => array('langcode')));
-    }
-
-    // Update the 'language_default' system variable, if configured.
-    $language_default = variable_get('language_default');
-    if (!empty($language_default) && isset($language_default->language)) {
-      $language_default->langcode = $language_default->language;
-      unset($language_default->language);
-      // In D8, the 'language_default' is not anymore an object, but an array,
-      // so make sure that the new value that is saved into this variable is an
-      // array.
-      variable_set('language_default', (array) $language_default);
-     }
-
-    // Adds the locked column and saves the special languages.
-    if (!db_field_exists('language', 'locked')) {
-      $locked_spec = array(
-        'type' => 'int',
-        'size' => 'tiny',
-        'not null' => TRUE,
-        'default' => 0,
-        'description' => 'A boolean indicating whether the administrator can edit or delete the language.',
-      );
-      db_add_field('language', 'locked', $locked_spec);
-
-      $max_language_weight = db_query('SELECT MAX(weight) FROM {language}')->fetchField();
-      $languages = language_locked_languages($max_language_weight);
-      foreach ($languages as $language) {
-        db_insert('language')
-          ->fields(array(
-            'langcode' => $language->langcode,
-            'name' => $language->name,
-            'weight' => $language->weight,
-            // These languages are locked, default to enabled.
-            'locked' => 1,
-          ))
-          ->execute();
-      }
-    }
+    // Rename 'language' column to 'langcode'.
+    db_drop_primary_key('language');
+    $langcode_spec = array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+      'description' => "Language code, e.g. 'de' or 'en-US'.",
+    );
+    db_change_field('language', 'language', 'langcode', $langcode_spec, array('primary key' => array('langcode')));
 
     // Update the 'language_default' system variable with the langcode change.
     $language_default = variable_get('language_default');
diff --git a/core/lib/Drupal/Component/Gettext/BatchStateInterface.php b/core/lib/Drupal/Component/Gettext/BatchStateInterface.php
new file mode 100644
index 0000000..7e5346c
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/BatchStateInterface.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Drupal\Component\Gettext;
+
+/**
+ * Add state to an object to manage continue after a previous batch call.
+ *
+ * The class implementing this must make sure to pass all state.
+ * It's constructor must be empty as the batch interface needs to recreate
+ * it without constructor arguments.
+ *
+ * Example:
+ * <code>
+ * class MyReader implements BatchStateInterface {
+ *   function __construct(){
+ *     // empty
+ *   }
+ *   ...
+ *   function getState() {
+ *     return array(
+ *       '__CLASS__' => __CLASS__,
+ *       'my_key' => 'my value',
+ *     );
+ *   }
+ * }
+ * </code>
+ */
+interface BatchStateInterface {
+
+  /**
+   * Returns the current state used for resetting state later on.
+   *
+   * The state is used to reconstruct the state of the object by calling
+   * setState().
+   *
+   * The Class implemeting this interface must have an empty constructor.
+   *
+   * @return array
+   *   key/value pairs of which one must be __CLASS__
+   */
+  function getState();
+
+  /**
+   * Sets the object ready to roll.
+   *
+   * After calling setState it is assumed the object is ready to do it's work.
+   */
+  function setState(array $state);
+}
diff --git a/core/lib/Drupal/Component/Gettext/Gettext.php b/core/lib/Drupal/Component/Gettext/Gettext.php
new file mode 100644
index 0000000..be7dc99
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/Gettext.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace Drupal\Component\Gettext;
+
+use Drupal\locale\PoDatabaseReader;
+use Drupal\locale\PoDatabaseWriter;
+
+
+/**
+ * The Gettext class provides for Gettext specific functionality.
+ *
+ * Most operations related to Gettext PO file handling are related to pumping
+ * data from a source to a destination:
+ * - Remote file http://*.po to memory
+ * - Database to public://*.po
+ *
+ * This class adds static methods mostly.
+ */
+class Gettext {
+
+  /**
+   * Reads the given PO files into a data structure.
+   *
+   * @param type $langcode
+   * @param array $files
+   * @return array
+   */
+  static function filesToArray($langcode, array $files) {
+    $writer = new PoMemoryWriter();
+    $writer->setLangcode($langcode);
+    foreach ($files as $file) {
+      $reader = new PoFileReader();
+      $reader->setURI($file->uri);
+      $reader->setLangcode($langcode);
+      $reader->open();
+      $writer->writeItems($reader, -1);
+    }
+    return $writer->getData();
+  }
+
+  /**
+   * Reads the given PO files into a data structure.
+   *
+   * @param type $file
+   * @param type $langcode
+   * @param array $files
+   * @return array
+   */
+  static function fileToDatabase($file, $langcode, $overwrite_options, $customized = LOCALE_NOT_CUSTOMIZED) {
+    $reader = new PoFileReader();
+    $reader->setLangcode($langcode);
+    $reader->setURI($file->uri);
+
+    try {
+      // When opening header is parsed immediately
+      $reader->open();
+    }
+    catch (Exception $exc) {
+      throw new $exc;
+    }
+
+    $header = $reader->getHeader();
+    if (!$header) {
+      throw new Exception('missing or malformed header.');
+    }
+
+    $writer = new PoDatabaseWriter();
+    $writer->setLangcode($langcode);
+    $options = array(
+      'overwrite_options' => $overwrite_options,
+      'customized' => $customized,
+    );
+    // It's vital options are set first.
+    // @TODO: this has to be fixed
+    $writer->setOptions($options);
+    $writer->setHeader($header);
+
+    try {
+      $writer->writeItems($reader, -1);
+    }
+    catch (Exception $exc) {
+      throw new $exc;
+    }
+
+    // @TODO: getReport to interface
+    $report = $writer->getReport();
+    /*
+    $additions = $report['additions'];
+    $updates = $report['updates'];
+    $deletes = $report['deletes'];
+    $skips = $report['skips'];
+    */
+    return $report;
+  }
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoFileReader.php b/core/lib/Drupal/Component/Gettext/PoFileReader.php
new file mode 100644
index 0000000..bcc12c5
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoFileReader.php
@@ -0,0 +1,558 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Gettext\PoFileReader.
+ *
+ * TODOs
+ * - constructor needs a state
+ */
+
+namespace Drupal\Component\Gettext;
+
+use Drupal\Component\Gettext\BatchStateInterface;
+use Drupal\Component\Gettext\POReader;
+use Drupal\Component\Gettext\PoHeader;
+
+/**
+ * Defines a Gettext file reader for PO format.
+ *
+ * According to http://www.gnu.org/software/gettext/manual/gettext.html#PO-Files
+ * a PO file may contain the following
+ *
+ * white-space
+ * #  translator-comments
+ * #. extracted-comments
+ * #: reference...
+ * #, flag...
+ * #| msgid previous-untranslated-string
+ * msgid untranslated-string
+ * msgstr translated-string
+ *
+ * TODOs:
+ * Current implementation has a simple white-space fall-thru. This should
+ * be improved
+ *
+ * Current implementation misses the special comments
+ * #.
+ * #:
+ * #|
+ */
+class PoFileReader implements BatchStateInterface, PoStreamInterface, PoReaderInterface {
+
+  /**
+   * Source line number being parsed.
+   *
+   * @var int
+   */
+  private $lineno = 0;
+
+  /**
+   * The context of the translation being parsed.
+   *
+   * @var string
+   */
+  private $context = 'COMMENT';
+
+  /**
+   * Current entry being read.
+   *
+   * @var array
+   */
+  private $current = array();
+
+  /**
+   * URI of the PO file that is being read.
+   *
+   * @var string
+   */
+  private $_uri = '';
+
+  /**
+   * Language code.
+   *
+   * @var string
+   */
+  private $_langcode = NULL;
+  private $_size;
+  private $_fd;
+
+  /**
+   * The PO file header.
+   *
+   * @var POHeader
+   */
+  private $_header;
+
+  private $translation;
+  private $finished;
+
+  /**
+   * @see BatchStateInterface
+   */
+  public function __construct() {
+    // empty
+  }
+
+  public function getURI() {
+    return $this->_uri;
+  }
+
+  public function setURI($uri) {
+    $this->_uri = $uri;
+  }
+
+  public function getLangcode() {
+    return $this->_langcode;
+  }
+
+  public function setLangcode($langcode) {
+    $this->_langcode = $langcode;
+  }
+
+
+  public function open() {
+    if (!empty($this->_uri)) {
+      $this->_fd = fopen($this->_uri, 'rb');
+      $this->_size = ftell($this->_fd);
+      // We immediately read the header as we are at BOF
+      $this->readHeader();
+    }
+    else {
+      throw new \Exception("Cannot open without URI set");
+    }
+  }
+
+  public function close() {
+    if ($this->_fd) {
+      fclose($this->_fd);
+    }
+  }
+
+
+  public function setState(array $state) {
+    $this->setURI($state['uri']);
+    $this->setLangcode($state['langcode']);
+    // Make sure to (re)read the PoHeader
+    $this->open();
+    // Move to last read position.
+    if (isset($state['seekpos'])) {
+      fseek($this->_fd, $state['seekpos']);
+    }
+    if (isset($state['lineno'])) {
+      $this->lineno = $state['lineno'];
+    }
+  }
+
+  public function getState() {
+    return array(
+      'class' => __CLASS__,
+      'uri' => $this->_uri,
+      'langcode' => $this->_langcode,
+      'seekpos' => ftell($this->_fd),
+      'lineno' => $this->lineno,
+    );
+  }
+
+  /**
+   * Return a translation object (singular or plural)
+   *
+   * @todo Define a translation object for this purpose?
+   *       Or use a standard class for better performance?
+   */
+  public function readItem() {
+    $this->readTranslation();
+    return $this->translation;
+  }
+
+  private function readTranslation() {
+    $this->translation = NULL;
+    while (!$this->finished && is_null($this->translation)) {
+      $this->readLine();
+    }
+    return $this->translation;
+  }
+
+  public function getHeader() {
+    return $this->_header;
+  }
+
+  public function setHeader(PoHeader $header) {
+    // TODO : throw exception?
+  }
+
+  /**
+   * Reads the header from the given input stream.
+   *
+   * We need to read the optional first COMMENT
+   * Next read a MSGID and a MSGSTR
+   *
+   * TODO: is a header required?
+   */
+  private function readHeader() {
+    $translation = $this->readTranslation();
+    $header = new PoHeader;
+    $header->setFromString(trim($translation->translation));
+    $this->_header = $header;
+  }
+
+  /**
+   * Reads a line from a PO file.
+   *
+   * While reading a line it's content is processed according to current
+   * context.
+   *
+   * The parser context. Can be:
+   *  - 'COMMENT' (#)
+   *  - 'MSGID' (msgid)
+   *  - 'MSGID_PLURAL' (msgid_plural)
+   *  - 'MSGCTXT' (msgctxt)
+   *  - 'MSGSTR' (msgstr or msgstr[])
+   *  - 'MSGSTR_ARR' (msgstr_arg)
+   *
+   * @return boolean FALSE or NULL
+   */
+  private function readLine() {
+    // a string or boolean FALSE
+    $line = fgets($this->_fd);
+    $this->finished = ($line === FALSE);
+    if (!$this->finished) {
+
+      if ($this->lineno == 0) {
+        // The first line might come with a UTF-8 BOM, which should be removed.
+        $line = str_replace("\xEF\xBB\xBF", '', $line);
+        // Current plurality for 'msgstr[]'.
+        $this->plural = 0;
+      }
+
+      $this->lineno++;
+
+      // Trim away the linefeed.
+      $line = trim(strtr($line, array("\\\n" => "")));
+
+      if (!strncmp('#', $line, 1)) {
+        // Lines starting with '#' are comments.
+
+        if ($this->context == 'COMMENT') {
+          // Already in comment token, insert the comment.
+          $this->current['#'][] = substr($line, 1);
+        }
+        elseif (($this->context == 'MSGSTR') || ($this->context == 'MSGSTR_ARR')) {
+          // We are currently in string token, close it out.
+          $this->saveOneString();
+
+          // Start a new entry for the comment.
+          $this->current = array();
+          $this->current['#'][] = substr($line, 1);
+
+          $this->context = 'COMMENT';
+          return TRUE;
+        }
+        else {
+          // A comment following any other token is a syntax error.
+          $this->log('The translation file %filename contains an error: "msgstr" was expected but not found on line %line.', $this->lineno);
+          return FALSE;
+        }
+        return;
+      }
+      elseif (!strncmp('msgid_plural', $line, 12)) {
+        // A plural form for the current message.
+
+        if ($this->context != 'MSGID') {
+          // A plural form cannot be added to anything else but the id directly.
+          $this->log('The translation file %filename contains an error: "msgid_plural" was expected but not found on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        // Remove 'msgid_plural' and trim away whitespace.
+        $line = trim(substr($line, 12));
+        // At this point, $line should now contain only the plural form.
+
+        $quoted = $this->parseQuoted($line);
+        if ($quoted === FALSE) {
+          // The plural form must be wrapped in quotes.
+          $this->log('The translation file %filename contains a syntax error on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        // Append the plural form to the current entry.
+        if (is_string($this->current['msgid'])) {
+          // The first value was stored as string. Now we know the context is
+          // plural, it is converted to array.
+          $this->current['msgid'] = array($this->current['msgid']);
+        }
+        $this->current['msgid'][] = $quoted;
+
+        $this->context = 'MSGID_PLURAL';
+        return;
+      }
+      elseif (!strncmp('msgid', $line, 5)) {
+        // Starting a new message.
+
+        if (($this->context == 'MSGSTR') || ($this->context == 'MSGSTR_ARR')) {
+          // We are currently in a message string, close it out.
+          $this->saveOneString();
+
+          // Start a new context for the id.
+          $this->current = array();
+        }
+        elseif ($this->context == 'MSGID') {
+          // We are currently already in the context, meaning we passed an id with no data.
+          $this->log('The translation file %filename contains an error: "msgid" is unexpected on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        // Remove 'msgid' and trim away whitespace.
+        $line = trim(substr($line, 5));
+        // At this point, $line should now contain only the message id.
+
+        $quoted = $this->parseQuoted($line);
+        if ($quoted === FALSE) {
+          // The message id must be wrapped in quotes.
+          $this->log('The translation file %filename contains a syntax error on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        $this->current['msgid'] = $quoted;
+        $this->context = 'MSGID';
+        return;
+      }
+      elseif (!strncmp('msgctxt', $line, 7)) {
+        // Starting a new context.
+
+        if (($this->context == 'MSGSTR') || ($this->context == 'MSGSTR_ARR')) {
+          // We are currently in a message, start a new one.
+          $this->saveOneString($this->current);
+          $this->current = array();
+        }
+        elseif (!empty($this->current['msgctxt'])) {
+          // A context cannot apply to another context.
+          $this->log('The translation file %filename contains an error: "msgctxt" is unexpected on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        // Remove 'msgctxt' and trim away whitespaces.
+        $line = trim(substr($line, 7));
+        // At this point, $line should now contain the context.
+
+        $quoted = $this->parseQuoted($line);
+        if ($quoted === FALSE) {
+          // The context string must be quoted.
+          $this->log('The translation file %filename contains a syntax error on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        $this->current['msgctxt'] = $quoted;
+
+        $this->context = 'MSGCTXT';
+        return;
+      }
+      elseif (!strncmp('msgstr[', $line, 7)) {
+        // A message string for a specific plurality.
+
+        if (($this->context != 'MSGID') && ($this->context != 'MSGCTXT') && ($this->context != 'MSGID_PLURAL') && ($this->context != 'MSGSTR_ARR')) {
+          // Message strings must come after msgid, msgxtxt, msgid_plural, or other msgstr[] entries.
+          $this->log('The translation file %filename contains an error: "msgstr[]" is unexpected on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        // Ensure the plurality is terminated.
+        if (strpos($line, ']') === FALSE) {
+          $this->log('The translation file %filename contains a syntax error on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        // Extract the plurality.
+        $frombracket = strstr($line, '[');
+        $this->plural = substr($frombracket, 1, strpos($frombracket, ']') - 1);
+
+        // Skip to the next whitespace and trim away any further whitespace, bringing $line to the message data.
+        $line = trim(strstr($line, " "));
+
+        $quoted = $this->parseQuoted($line);
+        if ($quoted === FALSE) {
+          // The string must be quoted.
+          $this->log('The translation file %filename contains a syntax error on line %line.', $this->lineno);
+          return FALSE;
+        }
+        if (!isset($this->current['msgstr']) || !is_array($this->current['msgstr'])) {
+          $this->current['msgstr'] = array();
+        }
+
+        $this->current['msgstr'][$this->plural] = $quoted;
+
+        $this->context = 'MSGSTR_ARR';
+        return;
+      }
+      elseif (!strncmp("msgstr", $line, 6)) {
+        // A string for the an id or context.
+
+        if (($this->context != 'MSGID') && ($this->context != 'MSGCTXT')) {
+          // Strings are only valid within an id or context scope.
+          $this->log('The translation file %filename contains an error: "msgstr" is unexpected on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        // Remove 'msgstr' and trim away away whitespaces.
+        $line = trim(substr($line, 6));
+        // At this point, $line should now contain the message.
+
+        $quoted = $this->parseQuoted($line);
+        if ($quoted === FALSE) {
+          // The string must be quoted.
+          $this->log('The translation file %filename contains a syntax error on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        $this->current['msgstr'] = $quoted;
+
+        $this->context = 'MSGSTR';
+        return;
+      }
+      elseif ($line != '') {
+        // Anything that is not a token may be a continuation of a previous token.
+
+        $quoted = $this->parseQuoted($line);
+        if ($quoted === FALSE) {
+          // The string must be quoted.
+          $this->log('The translation file %filename contains a syntax error on line %line.', $this->lineno);
+          return FALSE;
+        }
+
+        // Append the string to the current context.
+        if (($this->context == 'MSGID') || ($this->context == 'MSGID_PLURAL')) {
+          if (is_array($this->current['msgid'])) {
+            // Add string to last array element.
+            $last_index = count($this->current['msgid']) - 1;
+            $this->current['msgid'][$last_index] .= $quoted;
+          }
+          else {
+            $this->current['msgid'] .= $quoted;
+          }
+        }
+        elseif ($this->context == 'MSGCTXT') {
+          $this->current['msgctxt'] .= $quoted;
+        }
+        elseif ($this->context == 'MSGSTR') {
+          $this->current['msgstr'] .= $quoted;
+        }
+        elseif ($this->context == 'MSGSTR_ARR') {
+          $this->current['msgstr'][$this->plural] .= $quoted;
+        }
+        else {
+          // No valid context to append to.
+          $this->log('The translation file %filename contains an error: there is an unexpected string on line %line.', $this->lineno);
+          return FALSE;
+        }
+        return;
+      }
+    }
+
+    // Empty line read or EOF of PO file, closed out the last entry.
+    if (($this->context == 'MSGSTR') || ($this->context == 'MSGSTR_ARR')) {
+      $this->saveOneString($this->current);
+      $this->current = array();
+    }
+    elseif ($this->context != 'COMMENT') {
+      $this->log('The translation file %filename ended unexpectedly at line %line.', $this->lineno);
+      return FALSE;
+    }
+  }
+
+  /**
+   * Sets an error message if an error occurred during locale file parsing.
+   *
+   * @param $message
+   *   The message to be translated.
+   * @param $lineno
+   *   An optional line number argument.
+   */
+  protected function log($message, $lineno = NULL) {
+    if (isset($lineno)) {
+      $vars['%line'] = $lineno;
+    }
+    $t = get_t();
+    $this->errorLog[] = $t($message, $vars);
+  }
+
+  /**
+   * Store the parsed values as translation object.
+   */
+  public function saveOneString() {
+    $value = $this->current;
+    $plural = FALSE;
+
+    $comments = '';
+    if (isset($value['#'])) {
+      $comments = $this->shortenComments($value['#']);
+    }
+
+    if (is_array($value['msgstr'])) {
+      // Sort plural variants by their form index.
+      ksort($value['msgstr']);
+      $plural = TRUE;
+    }
+
+    $translation = new PoItem;
+    $translation->context = isset($value['msgctxt']) ? $value['msgctxt'] : '';
+    $translation->source = $value['msgid'];
+    $translation->translation = $value['msgstr'];
+    $translation->plural = $plural;
+    $translation->comment = $comments;
+    $translation->langcode = $this->getLangcode();
+
+    $this->translation = $translation;
+
+    $this->context = 'COMMENT';
+  }
+
+  /**
+   * Parses a string in quotes.
+   *
+   * @param $string
+   *   A string specified with enclosing quotes.
+   *
+   * @return
+   *   The string parsed from inside the quotes.
+   */
+  function parseQuoted($string) {
+    if (substr($string, 0, 1) != substr($string, -1, 1)) {
+      return FALSE;   // Start and end quotes must be the same
+    }
+    $quote = substr($string, 0, 1);
+    $string = substr($string, 1, -1);
+    if ($quote == '"') {        // Double quotes: strip slashes
+      return stripcslashes($string);
+    }
+    elseif ($quote == "'") {  // Simple quote: return as-is
+      return $string;
+    }
+    else {
+      return FALSE;             // Unrecognized quote
+    }
+  }
+
+  /**
+   * Generates a short, one-string version of the passed comment array.
+   *
+   * @param $comment
+   *   An array of strings containing a comment.
+   *
+   * @return
+   *   Short one-string version of the comment.
+   */
+  private function shortenComments($comment) {
+    $comm = '';
+    while (count($comment)) {
+      $test = $comm . substr(array_shift($comment), 1) . ', ';
+      if (strlen($comm) < 130) {
+        $comm = $test;
+      }
+      else {
+        break;
+      }
+    }
+    return trim(substr($comm, 0, -2));
+  }
+
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoFileWriter.php b/core/lib/Drupal/Component/Gettext/PoFileWriter.php
new file mode 100644
index 0000000..182fcb8
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoFileWriter.php
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Gettext\PoFileWriter.
+ */
+
+namespace Drupal\Component\Gettext;
+
+use Drupal\Component\Gettext\PoHeader;
+use Drupal\Component\Gettext\BatchStateInterface;
+
+/**
+ * Defines a Gettext writer.
+ */
+class PoFileWriter implements PoStreamInterface, PoWriterInterface, BatchStateInterface {
+
+  private $_uri;
+  private $_header;
+  private $_fd;
+  private $_seekpos;
+  private $_open = FALSE;
+
+  /**
+   * @see BatchStateInterface
+   */
+  function __construct() {
+    // empty
+  }
+
+  public function getHeader() {
+    return $this->_header;
+  }
+
+  public function setHeader(PoHeader $header) {
+    $this->_header = $header;
+  }
+
+  public function getLangcode() {
+    return $this->_langcode;
+  }
+
+  public function setLangcode($langcode) {
+    $this->_langcode = $langcode;
+  }
+
+  public function open() {
+    // Open in append mode
+    $this->_fd = fopen($this->getURI(), 'a');
+    $this->_seekpos = ftell($this->_fd);
+    if ($this->_seekpos == 0) {
+      // If file is new position == 0
+      $this->writeHeader();
+    }
+    else {
+      $reader = new PoFileReader($this->uri);
+      $this->_header = $reader->getHeader();
+    }
+  }
+
+  public function close() {
+    fclose($this->_fd);
+  }
+
+  public function setState(array $state) {
+    $this->_uri = $state['uri'];
+    $this->open();
+  }
+
+  public function getState() {
+    return array(
+      'uri' => $this->_uri,
+      'seekpos' => ftell($this->_fd),
+    );
+  }
+
+  private function write($data) {
+    $result = fputs($this->_fd, $data);
+    if ($result === FALSE) {
+      // TODO: better context for message
+      throw new \Exception("Unable to write data : " . substr($data, 0, 20));
+    }
+    $this->_seekpos = ftell($this->_fd);
+  }
+
+  private function writeHeader() {
+    $this->write($this->_header);
+  }
+
+  public function writeItem(PoItem $item) {
+    $this->write($item);
+  }
+
+  public function writeItems(PoReaderInterface $reader, $count = -1) {
+    $forever = $count == -1;
+    while (($count-- > 0 || $forever) && ($item = $reader->readItem())) {
+      $this->writeItem($item);
+    }
+  }
+
+  public function getURI() {
+    if (empty($this->_uri)) {
+      throw new \Exception("Empty URI");
+    }
+    return $this->_uri;
+  }
+
+  public function setURI($uri) {
+    $this->_uri = $uri;
+  }
+
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoHeader.php b/core/lib/Drupal/Component/Gettext/PoHeader.php
new file mode 100644
index 0000000..26f0a37
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoHeader.php
@@ -0,0 +1,391 @@
+<?php
+
+namespace Drupal\Component\Gettext;
+
+/**
+ * Description of PoHeader
+ *
+ * http://www.gnu.org/software/gettext/manual/gettext.html#Header-Entry
+ *
+ * Project-Id-Version
+ * Report-Msgid-Bugs-To
+ * Project-Id-Version
+ * POT-Creation-Date
+ * PO-Revision-Date
+ * Last-Translator
+ * Language-Team
+ * Language
+ * Content-Type
+ * Content-Transfer-Encoding
+ * Plural-Forms
+ *
+ * TODOs
+ * - There is no MIME-version in the specs
+ *
+ *  Example header
+ *
+ * "Project-Id-Version: Drupal core (7.11)\n"
+ * "POT-Creation-Date: 2012-02-12 22:59+0000\n"
+ * "PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
+ * "Language-Team: Catalan\n"
+ * "MIME-Version: 1.0\n"
+ * "Content-Type: text/plain; charset=utf-8\n"
+ * "Content-Transfer-Encoding: 8bit\n"
+ * "Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+ * @author clemens
+ */
+class PoHeader {
+
+  private $_langcode;
+  private $_projectIdVersion;
+  private $_potCreationDate;
+  private $_poRevisionDate;
+  private $_languageTeam;
+  private $_mimeVersion;
+  private $_contentType;
+  private $_contentTransferEncoding;
+  private $_pluralForms;
+  private $_authors;
+  private $_po_date;
+
+  /**
+   * Creates a PoHeader with default values set.
+   *
+   * @param type $langcode
+   */
+  public function __construct($langcode = NULL) {
+    $this->_langcode = $langcode;
+    $this->setDefaults();
+  }
+
+  static public function mapping() {
+    return array(
+      'Project-Id-Version' => '_projectIdVersion',
+      // * Report-Msgid-Bugs-To
+      'POT-Creation-Date' => '_potCreationDate',
+      'PO-Revision-Date' => '_poRevisionDate',
+      // * Last-Translator
+      'Language-Team' => '_languageTeam',
+      'MIME-Version' => '_mimeVersion',
+      // * Language
+      'Content-Type' => '_contentType',
+      'Content-Transfer-Encoding' => '_contentTransferEncoding',
+      'Plural-Forms' => '_pluralForms',
+    );
+  }
+
+  function getPlural() {
+    return $this->_pluralForms;
+  }
+
+  /**
+   * Compile the PO header.
+   */
+  private function compileHeader() {
+    $output = '';
+
+    // Add language description and author as comment.
+    $languages = language_list();
+    $language_name = isset($languages[$this->_langcode]) ? $languages[$this->_langcode]->name : '';
+
+    $isTemplate = $language_name == '';
+
+    $output .= '# ' . ($isTemplate ? 'LANGUAGE' : $language_name) . ' translation of ' . ($isTemplate ? 'PROJECT' : variable_get('site_name', 'Drupal')) . "\n";
+    if (!empty($this->_authors)) {
+      $output .= '# Generated by ' . implode("\n# ", $this->_authors) . "\n";
+    }
+    $output .= "#\n";
+
+    // Add the actual header information.
+    $output .= "msgid \"\"\n";
+    $output .= "msgstr \"\"\n";
+    $output .= "\"Project-Id-Version: PROJECT VERSION\\n\"\n";
+    $output .= "\"POT-Creation-Date: " . $this->_po_date . "\\n\"\n";
+    $output .= "\"PO-Revision-Date: " . $this->_po_date . "\\n\"\n";
+    $output .= "\"Last-Translator: NAME <EMAIL@ADDRESS>\\n\"\n";
+    $output .= "\"Language-Team: LANGUAGE <EMAIL@ADDRESS>\\n\"\n";
+    $output .= "\"MIME-Version: 1.0\\n\"\n";
+    $output .= "\"Content-Type: text/plain; charset=utf-8\\n\"\n";
+    $output .= "\"Content-Transfer-Encoding: 8bit\\n\"\n";
+    $output .= "\"Plural-Forms: " . $this->_pluralForms . "\\n\"\n";
+    $output .= "\n";
+
+    return $output;
+  }
+
+  /**
+   * Stores a given PO Header string
+   *
+   * TODO: the header string is cleaned by the parser :(
+   *   we need to accept unclean version too
+   *
+   * @param type $header
+   */
+  public function setFromString($header) {
+    $values = $this->parseHeader($header);
+
+    $this->setDefaults($values);
+  }
+
+  /**
+   * TODO: compare with Symfony::setDefaults()
+   *
+   * @param type $values
+   */
+  public function setDefaults($values = array()) {
+    $defaults = array(
+      'POT-Creation-Date' => date("Y-m-d H:iO"),
+      'Plural-Forms' => 'nplurals=2; plural=(n > 1);',
+    );
+    foreach ($defaults as $key => $value) {
+      if (empty($values[$key])) {
+        $values[$key] = $value;
+      }
+    }
+    $mapping = self::mapping();
+    foreach ($mapping as $key => $var) {
+      if (isset($values[$key])) {
+        $this->{$var} = $values[$key];
+      }
+    }
+  }
+
+  public function __toString() {
+    $result = $this->compileHeader() . "\n";
+    return $result;
+  }
+
+  /**
+   * Parses a Plural-Forms entry from a Gettext Portable Object file header.
+   *
+   * @param $pluralforms
+   *   A string containing the Plural-Forms entry.
+   * @param $filepath
+   *   A string containing the filepath.
+   *
+   * @return
+   *   An array containing the number of plurals and a
+   *   formula in PHP for computing the plural form.
+   */
+  function parsePluralForms($pluralforms, $filepath) {
+    // First, delete all whitespace
+    $pluralforms = strtr($pluralforms, array(" " => "", "\t" => ""));
+
+    // Select the parts that define nplurals and plural
+    $nplurals = strstr($pluralforms, "nplurals=");
+    if (strpos($nplurals, ";")) {
+      $nplurals = substr($nplurals, 9, strpos($nplurals, ";") - 9);
+    }
+    else {
+      return FALSE;
+    }
+    $plural = strstr($pluralforms, "plural=");
+    if (strpos($plural, ";")) {
+      $plural = substr($plural, 7, strpos($plural, ";") - 7);
+    }
+    else {
+      return FALSE;
+    }
+
+    // Get PHP version of the plural formula
+    $plural = $this->parseArithmetic($plural);
+
+    if ($plural !== FALSE) {
+      return array($nplurals, $plural);
+    }
+    else {
+      throw new Exception("The plural formula could not be parsed.");
+    }
+  }
+
+  /**
+   * Parses a Gettext Portable Object file header.
+   *
+   * @param $header
+   *   A string containing the complete header.
+   *
+   * @return
+   *   An associative array of key-value pairs.
+   */
+  private function parseHeader($header) {
+    $header_parsed = array();
+    $lines = array_map('trim', explode("\n", $header));
+    foreach ($lines as $line) {
+      if ($line) {
+        list($tag, $contents) = explode(":", $line, 2);
+        $header_parsed[trim($tag)] = trim($contents);
+      }
+    }
+    return $header_parsed;
+  }
+
+  /**
+   * Parses and sanitizes an arithmetic formula into a PHP expression.
+   *
+   * While parsing, we ensure, that the operators have the right
+   * precedence and associativity.
+   *
+   * @param $string
+   *   A string containing the arithmetic formula.
+   *
+   * @return
+   *   The PHP version of the formula.
+   */
+  private function parseArithmetic($string) {
+    // Operator precedence table
+    $precedence = array("(" => -1, ")" => -1, "?" => 1, ":" => 1, "||" => 3, "&&" => 4, "==" => 5, "!=" => 5, "<" => 6, ">" => 6, "<=" => 6, ">=" => 6, "+" => 7, "-" => 7, "*" => 8, "/" => 8, "%" => 8);
+    // Right associativity
+    $right_associativity = array("?" => 1, ":" => 1);
+
+    $tokens = $this->tokenizeFormula($string);
+
+    // Parse by converting into infix notation then back into postfix
+    // Operator stack - holds math operators and symbols
+    $operator_stack = array();
+    // Element Stack - holds data to be operated on
+    $element_stack = array();
+
+    foreach ($tokens as $token) {
+      $current_token = $token;
+
+      // Numbers and the $n variable are simply pushed into $element_stack
+      if (is_numeric($token)) {
+        $element_stack[] = $current_token;
+      }
+      elseif ($current_token == "n") {
+        $element_stack[] = '$n';
+      }
+      elseif ($current_token == "(") {
+        $operator_stack[] = $current_token;
+      }
+      elseif ($current_token == ")") {
+        $topop = array_pop($operator_stack);
+        while (isset($topop) && ($topop != "(")) {
+          $element_stack[] = $topop;
+          $topop = array_pop($operator_stack);
+        }
+      }
+      elseif (!empty($precedence[$current_token])) {
+        // If it's an operator, then pop from $operator_stack into $element_stack until the
+        // precedence in $operator_stack is less than current, then push into $operator_stack
+        $topop = array_pop($operator_stack);
+        while (isset($topop) && ($precedence[$topop] >= $precedence[$current_token]) && !(($precedence[$topop] == $precedence[$current_token]) && !empty($right_associativity[$topop]) && !empty($right_associativity[$current_token]))) {
+          $element_stack[] = $topop;
+          $topop = array_pop($operator_stack);
+        }
+        if ($topop) {
+          $operator_stack[] = $topop;   // Return element to top
+        }
+        $operator_stack[] = $current_token;      // Parentheses are not needed
+      }
+      else {
+        return FALSE;
+      }
+    }
+
+    // Flush operator stack
+    $topop = array_pop($operator_stack);
+    while ($topop != NULL) {
+      $element_stack[] = $topop;
+      $topop = array_pop($operator_stack);
+    }
+
+    // Now extract formula from stack
+    $previous_size = count($element_stack) + 1;
+    while (count($element_stack) < $previous_size) {
+      $previous_size = count($element_stack);
+      for ($i = 2; $i < count($element_stack); $i++) {
+        $op = $element_stack[$i];
+        if (!empty($precedence[$op])) {
+          $f = "";
+          if ($op == ":") {
+            $f = $element_stack[$i - 2] . "):" . $element_stack[$i - 1] . ")";
+          }
+          elseif ($op == "?") {
+            $f = "(" . $element_stack[$i - 2] . "?(" . $element_stack[$i - 1];
+          }
+          else {
+            $f = "(" . $element_stack[$i - 2] . $op . $element_stack[$i - 1] . ")";
+          }
+          array_splice($element_stack, $i - 2, 3, $f);
+          break;
+        }
+      }
+    }
+
+    // If only one element is left, the number of operators is appropriate
+    if (count($element_stack) == 1) {
+      return $element_stack[0];
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Provides backward-compatible formula parsing for token_get_all().
+   *
+   * @param $string
+   *   A string containing the arithmetic formula.
+   *
+   * @return
+   *   The PHP version of the formula.
+   */
+  private function tokenizeFormula($formula) {
+    $formula = str_replace(" ", "", $formula);
+    $tokens = array();
+    for ($i = 0; $i < strlen($formula); $i++) {
+      if (is_numeric($formula[$i])) {
+        $num = $formula[$i];
+        $j = $i + 1;
+        while ($j < strlen($formula) && is_numeric($formula[$j])) {
+          $num .= $formula[$j];
+          $j++;
+        }
+        $i = $j - 1;
+        $tokens[] = $num;
+      }
+      elseif ($pos = strpos(" =<>!&|", $formula[$i])) { // We won't have a space
+        $next = $formula[$i + 1];
+        switch ($pos) {
+          case 1:
+          case 2:
+          case 3:
+          case 4:
+            if ($next == '=') {
+              $tokens[] = $formula[$i] . '=';
+              $i++;
+            }
+            else {
+              $tokens[] = $formula[$i];
+            }
+            break;
+          case 5:
+            if ($next == '&') {
+              $tokens[] = '&&';
+              $i++;
+            }
+            else {
+              $tokens[] = $formula[$i];
+            }
+            break;
+          case 6:
+            if ($next == '|') {
+              $tokens[] = '||';
+              $i++;
+            }
+            else {
+              $tokens[] = $formula[$i];
+            }
+            break;
+        }
+      }
+      else {
+        $tokens[] = $formula[$i];
+      }
+    }
+    return $tokens;
+  }
+
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoInterface.php b/core/lib/Drupal/Component/Gettext/PoInterface.php
new file mode 100644
index 0000000..8c01ee7
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Gettext\PoReader.
+ *
+ * TODOs
+ * - constructor needs a state
+ * - add getState
+ * - gettextInterface should have a readLine method
+ */
+
+namespace Drupal\Component\Gettext;
+
+use Drupal\Component\Gettext\Reader;
+use Drupal\Component\Gettext\PoHeader;
+
+/**
+ * Defines PO / gettext related must haves.
+ *
+ * @see PoReaderInterface
+ * @see PoWriterInterface
+ */
+interface PoInterface {
+  function setLangcode($langcode);
+  function getLangcode();
+
+  function getHeader();
+  function setHeader(PoHeader $header);
+
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoItem.php b/core/lib/Drupal/Component/Gettext/PoItem.php
new file mode 100644
index 0000000..e53418e
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoItem.php
@@ -0,0 +1,147 @@
+<?php
+
+namespace Drupal\Component\Gettext;
+
+/**
+ * PoItem allows for some transformation on it's data.
+ *
+ * TODO: we need to check memory constraints for using PoItem versus plain array
+ * structure. A possible structure could be
+ *   array(
+ *     'source' => 'home',
+ *     'translation' => 'thuis',
+ *     'plural' => 0,
+ *     'context' => '',
+ *     'comment' => '',
+ *   ),
+ * In case we want using just arrays we can make these methods static.
+ *
+ * @author clemens
+ * @see \Drupal\Component\Gettext\Gettext
+ */
+class PoItem {
+
+  /**
+   * The context this translation belongs to.
+   *
+   * The default context should be an empty string
+   * @see PoMemoryWriter.writeItem()
+   * @var string
+   */
+  public $context = '';
+  public $source;
+  public $plural;
+  public $comment;
+  public $translation;
+
+  static public function mapping() {
+    return array(
+      'msgctxt' => 'context',
+      'msgid' => 'source',
+      'msgstr' => 'translation',
+      '#' => 'comment',
+    );
+  }
+
+  public function fromArray(array $values = array()) {
+    foreach ($values as $key => $value) {
+      $this->{$key} = $value;
+    }
+    if (isset($this->source) && strpos($this->source, LOCALE_PLURAL_DELIMITER) !== FALSE) {
+      $this->source = explode(LOCALE_PLURAL_DELIMITER, $this->source);
+      $this->translation = explode(LOCALE_PLURAL_DELIMITER, $this->translation);
+      $this->plural = count($this->translation);
+    }
+  }
+
+  public function __toString() {
+    return $this->compileTranslation();
+  }
+
+  /**
+   * Compile PO translations strings from a translation object.
+   *
+   * Translation object consists of:
+   *   source       string (singular) or array of strings (plural)
+   *   translation  string (singular) or array of strings (plural)
+   *   plural       TRUE: source and translation are plurals
+   *   context      source context string
+   */
+  private function compileTranslation() {
+    $output = '';
+
+    // Format string context.
+    if (!empty($this->context)) {
+      $output .= 'msgctxt ' . $this->formatString($this->context);
+    }
+
+    // Format translation
+    if ($this->plural) {
+      $output .= $this->formatPlural();
+    }
+    else {
+      $output .= $this->formatSingular();
+    }
+
+    // Add one empty line to separate the translations.
+    $output .= "\n";
+
+    return $output;
+  }
+
+  /**
+   * Formats a plural translation.
+   */
+  private function formatPlural() {
+    $output = '';
+
+    // Format source strings.
+    $output .= 'msgid ' . $this->formatString($this->source[0]);
+    $output .= 'msgid_plural ' . $this->formatString($this->source[1]);
+
+    foreach ($this->translation as $i => $trans) {
+      if (isset($this->translation[$i])) {
+        $output .= 'msgstr[' . $i . '] ' . $this->formatString($trans);
+      }
+      else {
+        $output .= 'msgstr[' . $i . '] ""' . "\n";
+      }
+    }
+
+    return $output;
+  }
+
+  /**
+   * Formats a singular translation.
+   */
+  private function formatSingular() {
+    $output = '';
+    $output .= 'msgid ' . $this->formatString($this->source);
+    $output .= 'msgstr ' . (isset($this->translation) ? $this->formatString($this->translation) : '');
+    return $output;
+  }
+
+  /**
+   * Formats a string for output on multiple lines.
+   */
+  private function formatString($string) {
+    // Escape characters for processing.
+    $string = addcslashes($string, "\0..\37\\\"");
+
+    // Always include a line break after the explicit \n line breaks from
+    // the source string. Otherwise wrap at 70 chars to accommodate the extra
+    // format overhead too.
+    $parts = explode("\n", wordwrap(str_replace('\n', "\\n\n", $string), 70, " \n"));
+
+    // Multiline string should be exported starting with a "" and newline to
+    // have all lines aligned on the same column.
+    if (count($parts) > 1) {
+      return "\"\"\n\"" . implode("\"\n\"", $parts) . "\"\n";
+    }
+    // Single line strings are output on the same line.
+    else {
+      return "\"$parts[0]\"\n";
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoMemoryWriter.php b/core/lib/Drupal/Component/Gettext/PoMemoryWriter.php
new file mode 100644
index 0000000..32995f0
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoMemoryWriter.php
@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Gettext\PoMemoryWriter.
+ */
+
+namespace Drupal\Component\Gettext;
+
+use Drupal\Component\Gettext\PoHeader;
+use Drupal\Component\Gettext\BatchStateInterface;
+
+/**
+ * Defines a Gettext memory writer.
+ *
+ * This writer is used by the installer.
+ *
+ * TODO: do we need a BatchStateInterface?
+ */
+class PoMemoryWriter implements PoWriterInterface, BatchStateInterface {
+
+  private $_header;
+  private $_items;
+
+  function __construct() {
+    $this->_items = array();
+  }
+
+  public function setState(array $state) {
+    // nothing to do?
+  }
+
+  public function getState() {
+    return array();
+  }
+
+  /**
+   * Stores values into memory.
+   *
+   * The structure is context dependent.
+   * TODO: where is this structure documented?
+   * - array[context][source] = translation
+   *
+   * @param PoItem $item
+   */
+  public function writeItem(PoItem $item) {
+    if (is_array($item->source)) {
+      $item->source = implode(LOCALE_PLURAL_DELIMITER, $item->source);
+      $item->translation = implode(LOCALE_PLURAL_DELIMITER, $item->translation);
+    }
+    $this->_items[isset($item->context) ? $item->context : ''][$item->source] = $item->translation;
+  }
+
+  public function writeItems(PoReaderInterface $reader, $count = -1) {
+    $forever = $count == -1;
+    while (($count-- > 0 || $forever) && ($item = $reader->readItem())) {
+      $this->writeItem($item);
+    }
+  }
+
+  public function getHeader() {
+    // TODO: what
+  }
+
+  public function getLangcode() {
+    // TODO: what
+  }
+
+  public function setHeader(PoHeader $header) {
+    // TODO: what
+  }
+
+  public function setLangcode($langcode) {
+    // TODO: what
+  }
+
+  public function getData() {
+    return $this->_items;
+  }
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoReaderInterface.php b/core/lib/Drupal/Component/Gettext/PoReaderInterface.php
new file mode 100644
index 0000000..9977767
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoReaderInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Gettext\PoReader.
+ *
+ * TODOs
+ * - constructor needs a state
+ * - add getState
+ * - gettextInterface should have a readLine method
+ */
+
+namespace Drupal\Component\Gettext;
+
+use Drupal\Component\Gettext\PoInterface;
+
+/**
+ * Defines a Gettext reader for PO format.
+ */
+interface PoReaderInterface extends PoInterface {
+  function readItem();
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoStreamInterface.php b/core/lib/Drupal/Component/Gettext/PoStreamInterface.php
new file mode 100644
index 0000000..af0b909
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoStreamInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Gettext\PoReader.
+ *
+ * TODOs
+ * - constructor needs a state
+ * - add getState
+ * - gettextInterface should have a readLine method
+ */
+
+namespace Drupal\Component\Gettext;
+
+/**
+ * Defines PO / gettext related must haves.
+ *
+ * @see PoReaderInterface
+ * @see PoWriterInterface
+ */
+interface PoStreamInterface {
+  function open();
+  function close();
+
+  function getURI();
+  function setURI($uri);
+}
diff --git a/core/lib/Drupal/Component/Gettext/PoWriterInterface.php b/core/lib/Drupal/Component/Gettext/PoWriterInterface.php
new file mode 100644
index 0000000..f3cbee0
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/PoWriterInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Gettext\PoWriterInterface.
+ */
+
+namespace Drupal\Component\Gettext;
+
+use Drupal\Component\Gettext\PoInterface;
+use Drupal\Component\Gettext\PoItem;
+
+/**
+ * Defines a Gettext writer.
+ */
+interface PoWriterInterface extends PoInterface {
+  /**
+   * Writes the given item.
+   *
+   * @param PoItem $item
+   */
+  function writeItem(PoItem $item);
+
+  /**
+   * Writes all or the given amout of items.
+   *
+   * @param PoReaderInterface $reader
+   * @param $count
+   *   When $count == -1 all items are read from the $reader.
+   */
+  function writeItems(PoReaderInterface $reader, $count = -1);
+}
diff --git a/core/lib/Drupal/Component/Gettext/testGettext.php b/core/lib/Drupal/Component/Gettext/testGettext.php
new file mode 100644
index 0000000..3cf236e
--- /dev/null
+++ b/core/lib/Drupal/Component/Gettext/testGettext.php
@@ -0,0 +1,692 @@
+<?php
+
+$cmd = __FILE__;
+$_SERVER['HTTP_HOST'] = 'default';
+$_SERVER['PHP_SELF'] = '/index.php';
+$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+$_SERVER['SERVER_SOFTWARE'] = NULL;
+$_SERVER['REQUEST_METHOD'] = 'GET';
+$_SERVER['QUERY_STRING'] = '';
+$_SERVER['PHP_SELF'] = $_SERVER['REQUEST_URI'] = '/';
+$_SERVER['HTTP_USER_AGENT'] = 'console';
+
+define('DRUPAL_ROOT', getcwd());
+
+include_once DRUPAL_ROOT . '/core/includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+/**
+ * Run this like:
+ * drush @drupal.d8 php-script core/lib/Drupal/Component/Gettext/testGettext.php
+ */
+use Drupal\Component\Gettext\PoHeader;
+use Drupal\Component\Gettext\PoItem;
+use Drupal\Component\Gettext\PoFileReader;
+use Drupal\Component\Gettext\PoFileWriter;
+use Drupal\Component\Gettext\PoMemoryWriter;
+use Drupal\locale\PoDatabaseWriter;
+use Drupal\locale\PoDatabaseReader;
+
+function logLine($string, $type = '-') {
+  echo str_repeat($type, 50) . "\n";
+  echo str_repeat(" ", 0) . $string . "\n";
+  if ($type != '-') {
+    echo str_repeat('-', 50) . "\n";
+  }
+}
+
+/**
+ * Creates a test PO stucture
+ *
+ * TODO: the object structure is for .po so we miss the .pot format
+ *
+ * @param type $langcode
+ * @return array of objects
+ */
+function gettext_struct($langcode = 'nl') {
+  $src = array(
+    array(
+      'source' => 'home',
+      'translation' => 'thuis',
+      'plural' => 0,
+      'context' => '',
+    ),
+    array(
+      'source' => 'delete',
+      'translation' => 'verwijderen',
+      'plural' => 0,
+      'context' => '',
+    ),
+    array(
+      'source' => array('1 day', '@count days'),
+      'translation' => array('1 dag', '@count dagen'),
+      'plural' => 1,
+      'context' => '',
+    ),
+  );
+  $items = array();
+  foreach ($src as $values) {
+    $item = new PoItem();
+    $item->fromArray($values);
+    $items[] = $item;
+  }
+  $result = array(
+    'langcode' => $langcode,
+    'items' => $items,
+  );
+
+  return $result;
+}
+
+function testWriter($uri = '') {
+  if (empty($uri)) {
+    $uri = getPublicUri(__FUNCTION__, $langcode);
+  }
+  zapUri($uri);
+  logLine(__FUNCTION__);
+  $po = gettext_struct();
+  $langcode = $po['langcode'];
+  $items = $po['items'];
+
+  $writer = new PoFileWriter();
+
+  $writer->setLangcode($langcode);
+  $writer->setHeader(new PoHeader($langcode));
+  $writer->setURI($uri);
+  $writer->open();
+  foreach ($items as $item) {
+    $writer->writeItem($item);
+  }
+  $writer->close();
+  return $uri;
+}
+
+function testBatchState() {
+  logLine(__FUNCTION__, '=');
+  $langcode = 'nl';
+  $uri = remoteToPublic($langcode);
+
+  $reader = new PoFileReader();
+  $reader->setLangcode($langcode);
+  $reader->setURI($uri);
+
+  echo "Not yet opened $uri\n";
+  dumpState($reader->getState());
+
+  echo "Opening stream $uri\n";
+  $reader->open();
+  dumpState($reader->getState());
+
+  echo "Reading 1 items\n";
+  $reader->readItem();
+  dumpState($reader->getState());
+
+  echo "Saving state\n";
+  $state = $reader->getState();
+
+  $item = $reader->readItem();
+  echo "Item read after state $item";
+
+  echo "Dropping \$reader\n";
+  $reader = NULL;
+
+  $reader = new PoFileReader();
+  $reader->setLangcode($langcode);
+  $reader->setURI($uri);
+
+  // This is an implicit open!
+  echo "Setting state simulating Batch\n";
+  $reader->setState($state);
+  dumpState($reader->getState());
+  $sameItem = $reader->readItem();
+  echo "These should be the same\n\n$item\n$sameItem\n";
+}
+
+function getReadStream($uri) {
+  logLine(__FUNCTION__, '=');
+  $s = new GettextFileInterface($uri);
+  return $s;
+}
+
+function testPoReader() {
+  logLine(__FUNCTION__, '=');
+
+  $uri = 'public://test.po.txt';
+
+  logLine("Reading : $uri", '=');
+  logLine("File contents first 500 bytes");
+  $contents = file_get_contents($uri);
+  echo substr($contents, 0, 500) . "\n";
+
+  logLine("Using PoFileReader");
+  $reader = new PoFileReader($uri);
+  echo $reader->getHeader();
+
+  $i = 0;
+  while (($item = $reader->readItem()) && $i++ < 4) {
+    printItem($item, $i);
+  }
+}
+
+function testHeader() {
+  logLine(__FUNCTION__, '=');
+  $h = new PoHeader();
+
+  echo "----------------\n";
+  $h->setFromString('');
+  echo "empty header\n";
+  echo $h;
+
+  echo "----------------\n";
+  $h->setFromString('"Project-Id-Version: ' . __FILE__ . '\n"');
+  echo "-- one item -- \n";
+  echo $h;
+}
+
+function testFileToDb() {
+  logLine(__FUNCTION__, '=');
+  $uri = getPublicUri(__FUNCTION__, 'nl');
+  testWriter($uri);
+  logLine("Reading : $uri");
+  logLine("File contents first 500 bytes");
+  $contents = file_get_contents($uri);
+  echo substr($contents, 0, 500) . "\n";
+
+  logLine("POFileReader");
+  $reader = new PoFileReader();
+  $reader->setURI($uri);
+  $reader->open();
+  $header = $reader->getHeader();
+  logLine("Header read");
+  logLine($header);
+
+  $langcode = 'ca';
+  logLine("PoDatabaseWriter");
+  $writer = new PoDatabaseWriter();
+  $writer->setLangcode($langcode);
+  $writer->setHeader($header);
+
+  $i = 0;
+  while (($item = $reader->readItem()) && $i < 4) {
+    logLine($item);
+    $writer->writeItem($item);
+    $i++;
+  }
+  logLine(__FUNCTION__ . " #$i items written.");
+}
+
+function testDbDump() {
+  logLine(__FUNCTION__, '=');
+  $reader = new PoDatabaseReader('en');
+  echo $reader->getHeader() . "\n";
+
+  $i = 0;
+  while (($item = $reader->readItem()) && $i < 4) {
+    printItem($item, $i++);
+  }
+
+  echo "Saving state to simulate a batch\n";
+  $state = $reader->getState();
+
+  echo "Create a new PoDatabaseReader so simulate a batch\n";
+  $reader = new PoDatabaseReader('en');
+
+  // Set the state
+  $reader->setState($state);
+  $i = 0;
+  while (($item = $reader->readItem()) && $i < 4) {
+    printItem($item, $i++);
+  }
+}
+
+function printItem($item, $context = 0) {
+  logLine(__FUNCTION__, '=');
+  if ($item) {
+    logLine("$context : $item->lid");
+    print_r($item);
+  }
+}
+
+function readItem($reader, $context = 0) {
+  $item = $reader->readItem();
+  if ($item) {
+    printItem($item);
+  }
+}
+
+function dumpState($state) {
+  logLine(__FUNCTION__, '=');
+  print_r($state);
+}
+
+function testPOFileReader() {
+  logLine(__FUNCTION__, '=');
+  $uri = 'public://nl-nl.po';
+
+  $reader = new PoFileReader($uri);
+  dumpState($reader->getState());
+  echo $reader->getHeader() . "\n";
+  dumpState($reader->getState());
+  $i = 0;
+  while (($item = readItem($reader)) && $i < 4) {
+    printItem($item, $i++);
+  }
+  dumpState($reader->getState());
+}
+
+function getLanguages($langcode = NULL) {
+  logLine(__FUNCTION__, '=');
+  if (!is_null($langcode)) {
+    return array($langcode);
+  }
+  return array(
+    'nl',
+    'ar',
+    'ca',
+    'en', // does not exists on d.o (should it be?)
+    'NOP', // does really not exists on d.o
+  );
+}
+
+function getRemoteUris($langcode = NULL) {
+  logLine(__FUNCTION__, '=');
+  $langcodes = getLanguages($langcode);
+  $uris = array();
+  foreach ($langcodes as $langcode) {
+    $uri = "http://ftp.drupal.org/files/translations/7.x/drupal/drupal-7.11.$langcode.po";
+    $uris[$langcode] = $uri;
+  }
+  return $uris;
+}
+
+function getPublicUri($name, $langcode) {
+  $result = "public://$name-$langcode.po";
+  logLine($result);
+  return $result;
+}
+
+function getRemoteUri($langcode) {
+  $uris = getRemoteUris($langcode);
+  return $uris[$langcode];
+}
+
+function testRemotePOPumper() {
+  logLine(__FUNCTION__, '=');
+  $uris = getRemoteUris();
+  foreach ($uris as $langcode => $uri) {
+    logLine("langcode: $langcode");
+    $reader = new PoFileReader($uri);
+    $writer = new PoDatabaseWriter($langcode);
+    $writer->writeItems($reader, 10);
+  }
+}
+
+function testPOFileWriter() {
+  logLine(__FUNCTION__, '=');
+  $src = "http://ftp.drupal.org/files/translations/7.x/drupal/drupal-7.11.ar.po";
+
+  $reader = new PoFileReader();
+  $reader->setURI($src);
+  $reader->open();
+  $header = $reader->getHeader();
+
+  $dst = 'public://drupal-7.11.ar.po';
+  zapUri($dst);
+  $writer = new PoFileWriter();
+  $writer->setURI($dst);
+  $writer->setHeader($header);
+  $writer->open();
+
+  $i = 0;
+  while (($item = $reader->readItem()) && $i < 4) {
+    printItem($item, $i);
+    $i++;
+    $writer->writeItem($item);
+    dumpState($writer->getState());
+  }
+
+  $writer->close();
+}
+
+function testDbToFile() {
+  logLine(__FUNCTION__, '=');
+  $langcode = 'ca';
+  $reader = new PoDatabaseReader();
+  $reader->setLangcode($langcode);
+
+  $dst = 'public://drupal-7.11.dummy.po';
+  $header = $reader->getHeader();
+
+  $writer = new PoFileWriter();
+  $writer->setURI($dst);
+  $writer->setHeader($header);
+  $writer->open();
+
+  $i = 0;
+  while (($item = $reader->readItem()) && $i < 4) {
+    printItem($item, $i);
+    $i++;
+    $writer->writeItem($item);
+    dumpState($writer->getState());
+  }
+
+  $writer->writeItems($reader, 10);
+
+  $writer->close();
+}
+
+function testBatchSimulation() {
+  logLine(__FUNCTION__, '=');
+
+  // Grab first langcode
+  $uris = getRemoteUris();
+  $langcode = key($uris);
+  $src = current($uris);
+
+  logLine("Opening $langcode : $src");
+  $reader = new PoFileReader();
+  $reader->setURI($src);
+  $reader->open();
+
+  $header = $reader->getHeader();
+  logLine($header);
+
+  $dst = getPublicUri(__FUNCTION__, $langcode);
+
+  zapUri($dst);
+  logLine("Writing $langcode : $dst");
+  $writer = new PoFileWriter();
+  $writer->setURI($dst);
+  $writer->setHeader($header);
+  $writer->open();
+
+  logLine('Written header only', '=');
+  echo file_get_contents($dst);
+
+  processN($writer, $reader, 2);
+
+  dumpFileContents($dst);
+
+  $state = $reader->getState();
+  dumpState($state);
+
+  logLine('Replacing reader', '=');
+  $reader = new PoFileReader($src);
+
+  logLine('setting state back');
+  $reader->setState($state);
+  dumpState($state);
+
+  processN($writer, $reader, 3);
+  $reader->setState($state);
+  dumpState($state);
+
+  dumpFileContents($dst);
+}
+
+function testDBReaderState() {
+  logLine(__FUNCTION__);
+  $langcode = 'nl';
+  $reader = new PoDatabaseReader();
+  $reader->setLangcode($langcode);
+
+  logLine("Init PoDatabaseReader", '=');
+  $state = $reader->getState();
+  dumpState($state);
+
+  $header = $reader->getHeader();
+
+  $uri = getPublicUri(__FUNCTION__, $langcode);
+  zapUri($uri);
+  $writer = new PoFileWriter($uri, $header);
+  $writer->setHeader($header);
+  $writer->setURI($uri);
+  $writer->open();
+
+  processN($writer, $reader, 4);
+
+  logLine("Read some", '=');
+  $state = $reader->getState();
+  dumpState($state);
+
+  $reader = new PoDatabaseReader($langcode);
+  $reader->setState($state);
+  processN($writer, $reader, 4);
+  $state = $reader->getState();
+  dumpState($state);
+
+  logLine("File contents from $uri", '=');
+  echo file_get_contents($uri);
+}
+
+function zapUri($uri) {
+  logLine("Truncate $uri", '=');
+  ftruncate(fopen($uri, 'w'));
+}
+
+function processN($writer, $reader, $count = 10) {
+  if ($count == -1) {
+    logLine("processing items: __ALL__");
+  }
+  else {
+    logLine("processing items: $count");
+  }
+  $writer->writeItems($reader, $count);
+}
+
+function dumpFileContents($uri) {
+  logLine("Written: $uri", '=');
+  echo file_get_contents($uri);
+}
+
+function newPOFileReader($uri, $langcode = NULL) {
+  logLine("Reading from $uri using langcode: '$langcode'");
+  $reader = new PoFileReader();
+  $reader->setURI($uri);
+  $reader->setLangcode($langcode);
+  $reader->open();
+  return $reader;
+}
+
+function remoteToPublic($langcode) {
+  logLine(__FUNCTION__, '=');
+  $uri = getRemoteUri($langcode);
+
+  logLine("Reading from $uri");
+  $reader = newPoFileReader($uri, $langcode);
+  $header = $reader->getHeader();
+
+  $uri = getPublicUri($langcode, $langcode);
+  zapUri($uri);
+  logLine("Writing to $uri");
+  $writer = new PoFileWriter();
+  $writer->setURI($uri);
+  $writer->setHeader($header);
+  $writer->open();
+
+  processN($writer, $reader, -1);
+
+  return $uri;
+}
+
+function publicToDb($langcode) {
+  $uri = getPublicUri($langcode, $langcode);
+
+  logLine("Reading from $uri using langcode: '$langcode'");
+  $reader = new PoFileReader();
+  $reader->setURI($uri);
+  $reader->setLangcode($langcode);
+  $reader->open();
+
+  logLine("Writing to DB");
+  $writer = new PoDatabaseWriter();
+  $writer->setLangcode($langcode);
+  $writer->setHeader($reader->getHeader());
+
+  $locale_plurals = variable_get('locale_translation_plurals', array());
+  print_r(array("Should have $langcode" => $locale_plurals));
+
+  $options = $writer->getOptions();
+  print_r($writer->getOptions());
+  //$options['overwrite_options']['not_customized'] = TRUE;
+  $writer->setOptions($options);
+  print_r($writer->getOptions());
+  print_r($options);
+  processN($writer, $reader, -1);
+
+  print_r($writer->getReport());
+}
+
+function publicToMemory($langcode) {
+  $uri = getPublicUri($langcode, $langcode);
+
+  logLine("Reading from $uri using langcode: '$langcode'");
+  $reader = new PoFileReader();
+  $reader->setURI($uri);
+  $reader->open();
+
+  logLine("Writing to Memory");
+  $writer = new PoMemoryWriter();
+  $writer->setLangcode($langcode);
+  $writer->setHeader($reader->getHeader());
+
+  $locale_plurals = variable_get('locale_translation_plurals', array());
+  print_r(array("Should have $langcode" => $locale_plurals));
+
+  processN($writer, $reader, 5);
+
+  var_dump($writer);
+}
+
+function pumpAround($langcode) {
+  $uri = remoteToPublic($langcode);
+  publicToMemory($langcode);
+  publicToDb($langcode);
+
+  $reader = newPoFileReader($uri, $langcode);
+
+  logLine("Writing to DB");
+  $writer = new PoDatabaseWriter();
+  $writer->setLangcode($langcode);
+
+  processN($writer, $reader);
+
+  logLine("Reading from DB");
+  $reader = new PoDatabaseReader();
+  $reader->setLangcode($langcode);
+  $reader->setOptions(array());
+
+  var_dump($reader->getOptions());
+
+  $header = $reader->getHeader();
+
+  $uri = getPublicUri(__FUNCTION__ . '-db', $langcode);
+  zapUri($uri);
+  logLine("Writing to $uri");
+  $writer = new PoFileWriter();
+  $writer->setURI($uri);
+  $writer->setHeader($header);
+  $writer->open();
+  processN($writer, $reader, -1);
+}
+
+function runAll() {
+  // Make sure all test languages are around
+  testLanguages();
+  testWriter();
+  testDBReaderState();
+  testBatchSimulation();
+  testBatchState();
+  testPoReader();
+  testHeader();
+  testFileToDb();
+  testDbDump();
+  testPOFileReader();
+  testPOFileWriter();
+  testDbToFile();
+  testRemotePOPumper();
+
+  pumpAll();
+
+  testFileToDb();
+
+  testT();
+  testFormatPlural();
+}
+
+function pumpAll() {
+  $uris = getRemoteUris();
+  foreach ($uris as $langcode => $uri) {
+    pumpAround($langcode);
+  }
+}
+
+function testT() {
+  logLine(__FUNCTION__, '=');
+  $uris = getRemoteUris();
+  foreach ($uris as $langcode => $uri) {
+    // TODO create a DBReader with filter like plural / context / etc
+    $sentences = array(
+      'Home',
+      'May',
+      'Website',
+      'Drupal',
+      'One',
+      'Two',
+    );
+
+    foreach ($sentences as $sentence) {
+      $result = t($sentence, array(), array('langcode' => $langcode));
+      echo "$langcode: $sentence => $result\n";
+    }
+  }
+}
+
+function testFormatPlural() {
+  $uris = getRemoteUris();
+  foreach ($uris as $langcode => $uri) {
+    $plurals = array();
+    $plurals[] = array('1 day', '@count days');
+    $plurals[] = array('1 pending update', '@count pending updates');
+    foreach ($plurals as $plural) {
+      for ($i = 0; $i < 200; $i++) {
+        $result = format_plural($i, $plural[0], $plural[1], array('@count' => $i), array('langcode' => $langcode));
+        echo "$langcode: $plural[0] | $plural[1] => $result\n";
+        if ($i > 0) {
+          $i = $i * 3;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Make sure languages are added to the Drupal install.
+ */
+function testLanguages() {
+  $uris = (getRemoteUris());
+  unset($uris['NOP']);
+  $needed = array_keys($uris);
+  $list = language_list();
+  $missing = array_diff($needed, array_keys($list));
+  foreach ($missing as $langcode) {
+    $language = (object) array(
+      'langcode' => $langcode,
+      'default' => FALSE,
+    );
+    language_save($language);
+  }
+  if (count($missing)) {
+    echo "The following languages were added to your Drupal install: " . implode(", ", $missing) . "\n";
+  }
+}
+
+//testT();
+//testFormatPlural();
+//$langs = language_list();
+//var_dump($langs);
+//pumpAround('nl');
+runAll();
+//pumpAll();
+
+//testBatchState();
diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php
index e774fa9..9b9223d 100644
--- a/core/lib/Drupal/Core/Language/Language.php
+++ b/core/lib/Drupal/Core/Language/Language.php
@@ -21,10 +21,10 @@ class Language {
   public $name = 'English';
   public $langcode = 'en';
   public $direction = 0;
+  public $enabled = 1;
   public $weight = 0;
   public $default = FALSE;
   public $method_id = NULL;
-  public $locked = FALSE;
 
   /**
    * Language constructor builds the default language object.
diff --git a/core/modules/block/block.admin.inc b/core/modules/block/block.admin.inc
index aa018da..5d4ce72 100644
--- a/core/modules/block/block.admin.inc
+++ b/core/modules/block/block.admin.inc
@@ -418,9 +418,9 @@ function block_admin_configure($form, &$form_state, $module, $delta) {
       $default_language_type = $setting->type;
     }
 
-    // Fetch languages.
-    $languages = language_list(LANGUAGE_ALL);
-    foreach ($languages as $language) {
+    // Fetch the enabled languages.
+    $enabled_languages = language_list(TRUE);
+    foreach ($enabled_languages as $language) {
       // @TODO $language->name is not wrapped with t(), it should be replaced
       // by CMI translation implementation.
       $langcodes_options[$language->langcode] = $language->name;
diff --git a/core/modules/comment/comment.api.php b/core/modules/comment/comment.api.php
index fded934..5374586 100644
--- a/core/modules/comment/comment.api.php
+++ b/core/modules/comment/comment.api.php
@@ -1,7 +1,5 @@
 <?php
 
-use Drupal\entity\EntityInterface;
-
 /**
  * @file
  * Hooks provided by the Comment module.
@@ -93,13 +91,11 @@ function hook_comment_view(Drupal\comment\Comment $comment, $view_mode, $langcod
  *
  * @param $build
  *   A renderable array representing the comment.
- * @param Drupal\comment\Comment $comment
- *   The comment being rendered.
  *
  * @see comment_view()
  * @see hook_entity_view_alter()
  */
-function hook_comment_view_alter(&$build, Drupal\comment\Comment $comment) {
+function hook_comment_view_alter(&$build) {
   // Check for the existence of a field added by another module.
   if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
     // Change its weight.
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index a6230f2..7c96247 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -994,7 +994,8 @@ function comment_view(Comment $comment, Node $node, $view_mode = 'full', $langco
   }
 
   // Allow modules to modify the structured comment.
-  drupal_alter(array('comment_view', 'entity_view'), $build, $comment);
+  $type = 'comment';
+  drupal_alter(array('comment_view', 'entity_view'), $build, $type);
 
   return $build;
 }
@@ -1043,7 +1044,7 @@ function comment_build_content(Comment $comment, Node $node, $view_mode = 'full'
 
   // Allow modules to make their own additions to the comment.
   module_invoke_all('comment_view', $comment, $view_mode, $langcode);
-  module_invoke_all('entity_view', $comment, $view_mode, $langcode);
+  module_invoke_all('entity_view', $comment, 'comment', $view_mode, $langcode);
 }
 
 /**
@@ -1836,13 +1837,12 @@ function comment_form($form, &$form_state, Comment $comment) {
   }
   $form['node_type'] = array('#type' => 'value', '#value' => 'comment_node_' . $node->type);
 
-  // Make the comment inherit the node language unless specifically set.
+  // If a content type has multilingual support we set the comment to inherit the
+  // content language. Otherwise mark the comment as language neutral.
   $comment_langcode = $comment->langcode;
-  if ($comment_langcode == LANGUAGE_NOT_SPECIFIED) {
+  if (($comment_langcode == LANGUAGE_NOT_SPECIFIED) && variable_get('node_type_language_' . $node->type, 0)) {
     $comment_langcode = $language_content->langcode;
   }
-
-  // Uses the language of the content as comment language.
   $form['langcode'] = array(
     '#type' => 'value',
     '#value' => $comment_langcode,
diff --git a/core/modules/entity/entity.api.php b/core/modules/entity/entity.api.php
index 02d8754..37263a6 100644
--- a/core/modules/entity/entity.api.php
+++ b/core/modules/entity/entity.api.php
@@ -36,21 +36,22 @@
  *     to disable Field API's persistent cache of field data. Only recommended
  *     if a higher level persistent cache is available for the entity type.
  *     Defaults to TRUE.
+ *   - load hook: The name of the hook which should be invoked by
+ *     Drupal\entity\DatabaseStorageController::attachLoad(), for example
+ *     'node_load'.
  *   - uri callback: A function taking an entity as argument and returning the
  *     uri elements of the entity, e.g. 'path' and 'options'. The actual entity
  *     uri can be constructed by passing these elements to url().
- *   - label callback: (optional) A function taking an entity and optional langcode
- *     argument, and returning the label of the entity. If langcode is omitted, the
- *     entity's default language is used.
- *
- *     The entity label is the main string associated with an entity; for
- *     example, the title of a node or the subject of a comment. If there is an
- *     entity object property that defines the label, use the 'label' element
- *     of the 'entity keys' return value component to provide this information
- *     (see below). If more complex logic is needed to determine the label of
- *     an entity, you can instead specify a callback function here, which will
- *     be called to determine the entity label. See also the
- *     Drupal\entity\Entity::label() method, which implements this logic.
+ *   - label callback: (optional) A function taking an entity as argument and
+ *     returning the label of the entity. The entity label is the main string
+ *     associated with an entity; for example, the title of a node or the
+ *     subject of a comment. If there is an entity object property that defines
+ *     the label, use the 'label' element of the 'entity keys' return
+ *     value component to provide this information (see below). If more complex
+ *     logic is needed to determine the label of an entity, you can instead
+ *     specify a callback function here, which will be called to determine the
+ *     entity label. See also the entity_label() function, which implements this
+ *     logic.
  *   - fieldable: Set to TRUE if you want your entity type to be fieldable.
  *   - translation: An associative array of modules registered as field
  *     translation handlers. Array keys are the module names, array values
@@ -225,39 +226,45 @@ function hook_entity_info_alter(&$entity_info) {
  * This is a generic load hook called for all entity types loaded via the
  * entity API.
  *
- * @param array $entities
+ * @param $entities
  *   The entities keyed by entity ID.
- * @param string $entity_type
+ * @param $type
  *   The type of entities being loaded (i.e. node, user, comment).
  */
-function hook_entity_load($entities, $entity_type) {
+function hook_entity_load($entities, $type) {
   foreach ($entities as $entity) {
-    $entity->foo = mymodule_add_something($entity);
+    $entity->foo = mymodule_add_something($entity, $type);
   }
 }
 
 /**
  * Act on an entity before it is about to be created or updated.
  *
- * @param Drupal\entity\EntityInterface $entity
+ * @param $entity
  *   The entity object.
+ * @param $type
+ *   The type of entity being saved (i.e. node, user, comment).
  */
-function hook_entity_presave(Drupal\entity\EntityInterface $entity) {
+function hook_entity_presave($entity, $type) {
   $entity->changed = REQUEST_TIME;
 }
 
 /**
  * Act on entities when inserted.
  *
- * @param Drupal\entity\EntityInterface $entity
+ * @param $entity
  *   The entity object.
+ * @param $type
+ *   The type of entity being inserted (i.e. node, user, comment).
  */
-function hook_entity_insert(Drupal\entity\EntityInterface $entity) {
+function hook_entity_insert($entity, $type) {
   // Insert the new entity into a fictional table of all entities.
+  $info = entity_get_info($type);
+  list($id) = entity_extract_ids($type, $entity);
   db_insert('example_entity')
     ->fields(array(
-      'type' => $entity->entityType(),
-      'id' => $entity->id(),
+      'type' => $type,
+      'id' => $id,
       'created' => REQUEST_TIME,
       'updated' => REQUEST_TIME,
     ))
@@ -267,17 +274,21 @@ function hook_entity_insert(Drupal\entity\EntityInterface $entity) {
 /**
  * Act on entities when updated.
  *
- * @param Drupal\entity\EntityInterface $entity
+ * @param $entity
  *   The entity object.
+ * @param $type
+ *   The type of entity being updated (e.g. node, user, comment).
  */
-function hook_entity_update(Drupal\entity\EntityInterface $entity) {
+function hook_entity_update($entity, $type) {
   // Update the entity's entry in a fictional table of all entities.
+  $info = entity_get_info($type);
+  list($id) = entity_extract_ids($type, $entity);
   db_update('example_entity')
     ->fields(array(
       'updated' => REQUEST_TIME,
     ))
-    ->condition('type', $entity->entityType())
-    ->condition('id', $entity->id())
+    ->condition('type', $type)
+    ->condition('id', $id)
     ->execute();
 }
 
@@ -286,14 +297,15 @@ function hook_entity_update(Drupal\entity\EntityInterface $entity) {
  *
  * This hook runs after the entity type-specific predelete hook.
  *
- * @param Drupal\entity\EntityInterface $entity
+ * @param $entity
  *   The entity object for the entity that is about to be deleted.
+ * @param $type
+ *   The type of entity being deleted (e.g. node, user, comment).
  */
-function hook_entity_predelete(Drupal\entity\EntityInterface $entity) {
+function hook_entity_predelete($entity, $type) {
   // Count references to this entity in a custom table before they are removed
   // upon entity deletion.
-  $id = $entity->id();
-  $type = $entity->entityType();
+  list($id) = entity_extract_ids($type, $entity);
   $count = db_select('example_entity_data')
     ->condition('type', $type)
     ->condition('id', $id)
@@ -315,14 +327,18 @@ function hook_entity_predelete(Drupal\entity\EntityInterface $entity) {
  *
  * This hook runs after the entity type-specific delete hook.
  *
- * @param Drupal\entity\EntityInterface $entity
+ * @param $entity
  *   The entity object for the entity that has been deleted.
+ * @param $type
+ *   The type of entity being deleted (i.e. node, user, comment).
  */
-function hook_entity_delete(Drupal\entity\EntityInterface $entity) {
+function hook_entity_delete($entity, $type) {
   // Delete the entity's entry from a fictional table of all entities.
+  $info = entity_get_info($type);
+  list($id) = entity_extract_ids($type, $entity);
   db_delete('example_entity')
-    ->condition('type', $entity->entityType())
-    ->condition('id', $entity->id())
+    ->condition('type', $type)
+    ->condition('id', $id)
     ->execute();
 }
 
@@ -348,15 +364,17 @@ function hook_entity_delete(Drupal\entity\EntityInterface $entity) {
  *   ($query->pager && $query->count), allowing the driver to return 0 from
  *   the count query and disable the pager.
  */
-function hook_entity_query_alter(Drupal\entity\EntityFieldQuery $query) {
+function hook_entity_query_alter($query) {
   $query->executeCallback = 'my_module_query_callback';
 }
 
 /**
  * Act on entities being assembled before rendering.
  *
- * @param Drupal\entity\EntityInterface $entity
+ * @param $entity
  *   The entity object.
+ * @param $type
+ *   The type of entity being rendered (i.e. node, user, comment).
  * @param $view_mode
  *   The view mode the entity is rendered in.
  * @param $langcode
@@ -371,7 +389,7 @@ function hook_entity_query_alter(Drupal\entity\EntityFieldQuery $query) {
  * @see hook_node_view()
  * @see hook_user_view()
  */
-function hook_entity_view(Drupal\entity\EntityInterface $entity, $view_mode, $langcode) {
+function hook_entity_view($entity, $type, $view_mode, $langcode) {
   $entity->content['my_additional_field'] = array(
     '#markup' => $additional_field,
     '#weight' => 10,
@@ -394,8 +412,8 @@ function hook_entity_view(Drupal\entity\EntityInterface $entity, $view_mode, $la
  *
  * @param $build
  *   A renderable array representing the entity content.
- * @param Drupal\entity\EntityInterface $entity
- *   The entity object being rendered.
+ * @param $type
+ *   The type of entity being rendered (i.e. node, user, comment).
  *
  * @see hook_entity_view()
  * @see hook_comment_view_alter()
@@ -403,7 +421,7 @@ function hook_entity_view(Drupal\entity\EntityInterface $entity, $view_mode, $la
  * @see hook_taxonomy_term_view_alter()
  * @see hook_user_view_alter()
  */
-function hook_entity_view_alter(&$build, Drupal\entity\EntityInterface $entity) {
+function hook_entity_view_alter(&$build, $type) {
   if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
     // Change its weight.
     $build['an_additional_field']['#weight'] = -10;
@@ -420,14 +438,14 @@ function hook_entity_view_alter(&$build, Drupal\entity\EntityInterface $entity)
  * view. Only use this if attaching the data during the entity loading phase
  * is not appropriate, for example when attaching other 'entity' style objects.
  *
- * @param array $entities
+ * @param $entities
  *   The entities keyed by entity ID.
- * @param string $entity_type
- *   The type of entities being viewed (i.e. node, user, comment).
+ * @param $type
+ *   The type of entities being loaded (i.e. node, user, comment).
  */
-function hook_entity_prepare_view($entities, $entity_type) {
+function hook_entity_prepare_view($entities, $type) {
   // Load a specific node into the user object for later theming.
-  if (!empty($entities) && $entity_type == 'user') {
+  if ($type == 'user') {
     $nodes = mymodule_get_user_nodes(array_keys($entities));
     foreach ($entities as $uid => $entity) {
       $entity->user_node = $nodes[$uid];
diff --git a/core/modules/entity/entity.module b/core/modules/entity/entity.module
index a66b1e8..daaa9f6 100644
--- a/core/modules/entity/entity.module
+++ b/core/modules/entity/entity.module
@@ -6,7 +6,6 @@
  */
 
 use Drupal\entity\EntityMalformedException;
-use Drupal\entity\EntityInterface;
 
 /**
  * Implements hook_help().
@@ -73,6 +72,7 @@ function entity_get_info($entity_type = NULL) {
           'controller class' => 'Drupal\entity\DatabaseStorageController',
           'static cache' => TRUE,
           'field cache' => TRUE,
+          'load hook' => $name . '_load',
           'bundles' => array(),
           'view modes' => array(),
           'entity keys' => array(),
@@ -414,23 +414,31 @@ function entity_uri($entity_type, $entity) {
 /**
  * Returns the label of an entity.
  *
- * This is a wrapper for Drupal\entity\EntityInterface::label(). This function
- * should only be used as a callback, e.g. for menu title callbacks.
+ * See the 'label callback' component of the hook_entity_info() return value
+ * for more information.
  *
- * @param Drupal\entity\EntityInterface $entity
+ * @param $entity_type
+ *   The entity type; e.g., 'node' or 'user'.
+ * @param $entity
  *   The entity for which to generate the label.
- * @param $langcode
- *   (optional) The language code of the language that should be used for
- *   getting the label. If set to NULL, the entity's default language is
- *   used.
  *
  * @return
- *   The label of the entity, or NULL if there is no label defined.
+ *   The entity label, or FALSE if not found.
  *
- * @see Drupal\entity\EntityInterface::label()
+ * @todo
+ *   Remove once all entity types are implementing the EntityInterface.
  */
-function entity_page_label(EntityInterface $entity, $langcode = NULL) {
-  return $entity->label($langcode);
+function entity_label($entity_type, $entity) {
+  $label = FALSE;
+  $info = entity_get_info($entity_type);
+  if (isset($info['label callback'])) {
+    $label = $info['label callback']($entity_type, $entity);
+  }
+  elseif (!empty($info['entity keys']['label']) && isset($entity->{$info['entity keys']['label']})) {
+    $label = $entity->{$info['entity keys']['label']};
+  }
+
+  return $label;
 }
 
 /**
diff --git a/core/modules/entity/lib/Drupal/entity/DatabaseStorageController.php b/core/modules/entity/lib/Drupal/entity/DatabaseStorageController.php
index 77834a1..c71eadb 100644
--- a/core/modules/entity/lib/Drupal/entity/DatabaseStorageController.php
+++ b/core/modules/entity/lib/Drupal/entity/DatabaseStorageController.php
@@ -304,8 +304,8 @@ class DatabaseStorageController implements EntityStorageControllerInterface {
     // always the queried entities, followed by additional arguments set in
     // $this->hookLoadArguments.
     $args = array_merge(array($queried_entities), $this->hookLoadArguments);
-    foreach (module_implements($this->entityType . '_load') as $module) {
-      call_user_func_array($module . '_' . $this->entityType . '_load', $args);
+    foreach (module_implements($this->entityInfo['load hook']) as $module) {
+      call_user_func_array($module . '_' . $this->entityInfo['load hook'], $args);
     }
   }
 
diff --git a/core/modules/entity/lib/Drupal/entity/Entity.php b/core/modules/entity/lib/Drupal/entity/Entity.php
index d17e57d..f0f5a76 100644
--- a/core/modules/entity/lib/Drupal/entity/Entity.php
+++ b/core/modules/entity/lib/Drupal/entity/Entity.php
@@ -86,12 +86,14 @@ class Entity implements EntityInterface {
 
   /**
    * Implements EntityInterface::label().
+   *
+   * @see entity_label()
    */
-  public function label($langcode = NULL) {
+  public function label() {
     $label = FALSE;
     $entity_info = $this->entityInfo();
     if (isset($entity_info['label callback']) && function_exists($entity_info['label callback'])) {
-      $label = $entity_info['label callback']($this->entityType, $this, $langcode);
+      $label = $entity_info['label callback']($this->entityType, $this);
     }
     elseif (!empty($entity_info['entity keys']['label']) && isset($this->{$entity_info['entity keys']['label']})) {
       $label = $this->{$entity_info['entity keys']['label']};
@@ -205,15 +207,14 @@ class Entity implements EntityInterface {
   protected function getFieldLangcode($field, $langcode = NULL) {
     // Only apply the given langcode if the entity is language-specific.
     // Otherwise translatable fields are handled as non-translatable fields.
-    if (field_is_translatable($this->entityType, $field) && ($default_language = $this->language()) && !language_is_locked($this->langcode)) {
+    if (field_is_translatable($this->entityType, $field) && ($default_language = $this->language())) {
       // For translatable fields the values in default language are stored using
       // the language code of the default language.
       return isset($langcode) ? $langcode : $default_language->langcode;
     }
     else {
-      // If there is a langcode defined for this field, just return it. Otherwise
-      // return LANGUAGE_NOT_SPECIFIED.
-      return (isset($this->langcode) ? $this->langcode : LANGUAGE_NOT_SPECIFIED);
+      // Non-translatable fields always use LANGUAGE_NOT_SPECIFIED.
+      return LANGUAGE_NOT_SPECIFIED;
     }
   }
 
diff --git a/core/modules/entity/lib/Drupal/entity/EntityInterface.php b/core/modules/entity/lib/Drupal/entity/EntityInterface.php
index f720181..c4c44c2 100644
--- a/core/modules/entity/lib/Drupal/entity/EntityInterface.php
+++ b/core/modules/entity/lib/Drupal/entity/EntityInterface.php
@@ -79,15 +79,10 @@ interface EntityInterface {
   /**
    * Returns the label of the entity.
    *
-   * @param $langcode
-   *   (optional) The language code of the language that should be used for
-   *   getting the label. If set to NULL, the entity's default language is
-   *   used.
-   *
    * @return
    *   The label of the entity, or NULL if there is no label defined.
    */
-  public function label($langcode = NULL);
+  public function label();
 
   /**
    * Returns the URI elements of the entity.
diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
index 99842e5..5e59c45 100644
--- a/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
@@ -66,7 +66,7 @@ class EntityTranslationTest extends WebTestBase {
       'name' => 'test',
       'uid' => $GLOBALS['user']->uid,
     ));
-    $this->assertEqual($entity->language()->langcode, LANGUAGE_NOT_SPECIFIED, 'Entity language not specified.');
+    $this->assertFalse($entity->language(), 'No entity language has been specified.');
     $this->assertFalse($entity->translations(), 'No translations are available');
 
     // Set the value in default language.
diff --git a/core/modules/entity/tests/modules/entity_crud_hook_test/entity_crud_hook_test.module b/core/modules/entity/tests/modules/entity_crud_hook_test/entity_crud_hook_test.module
index 48a2876..378c7b6 100644
--- a/core/modules/entity/tests/modules/entity_crud_hook_test/entity_crud_hook_test.module
+++ b/core/modules/entity/tests/modules/entity_crud_hook_test/entity_crud_hook_test.module
@@ -5,13 +5,11 @@
  * Test module for the Entity CRUD API.
  */
 
-use Drupal\entity\EntityInterface;
-
 /**
  * Implements hook_entity_presave().
  */
-function entity_crud_hook_test_entity_presave(EntityInterface $entity) {
-  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $entity->entityType());
+function entity_crud_hook_test_entity_presave($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
 }
 
 /**
@@ -59,8 +57,8 @@ function entity_crud_hook_test_user_presave() {
 /**
  * Implements hook_entity_insert().
  */
-function entity_crud_hook_test_entity_insert(EntityInterface $entity) {
-  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $entity->entityType());
+function entity_crud_hook_test_entity_insert($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
 }
 
 /**
@@ -157,8 +155,8 @@ function entity_crud_hook_test_user_load() {
 /**
  * Implements hook_entity_update().
  */
-function entity_crud_hook_test_entity_update(EntityInterface $entity) {
-  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $entity->entityType());
+function entity_crud_hook_test_entity_update($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
 }
 
 /**
@@ -206,8 +204,8 @@ function entity_crud_hook_test_user_update() {
 /**
  * Implements hook_entity_predelete().
  */
-function entity_crud_hook_test_entity_predelete(EntityInterface $entity) {
-  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $entity->entityType());
+function entity_crud_hook_test_entity_predelete($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
 }
 
 /**
@@ -255,8 +253,8 @@ function entity_crud_hook_test_user_predelete() {
 /**
  * Implements hook_entity_delete().
  */
-function entity_crud_hook_test_entity_delete(EntityInterface $entity) {
-  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $entity->entityType());
+function entity_crud_hook_test_entity_delete($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
 }
 
 /**
diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 455ecc2..a99c275 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -1473,8 +1473,8 @@ function hook_field_attach_prepare_translation_alter(&$entity, $context) {
 function hook_field_language_alter(&$display_langcode, $context) {
   // Do not apply core language fallback rules if they are disabled or if Locale
   // is not registered as a translation handler.
-  if (variable_get('field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'])) {
-    field_language_fallback($display_langcode, $context['entity'], $context['langcode']);
+  if (variable_get('locale_field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'], 'locale')) {
+    locale_field_language_fallback($display_langcode, $context['entity'], $context['langcode']);
   }
 }
 
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 822e802..e0229a6 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -369,49 +369,6 @@ function field_system_info_alter(&$info, $file, $type) {
 }
 
 /**
- * Applies language fallback rules to the fields attached to the given entity.
- *
- * Core language fallback rules simply check if fields have a field translation
- * for the requested language code. If so, the requested language is returned,
- * otherwise all the fallback candidates are inspected to see if there is a
- * field translation available in another language.
- * By default this is called by field_field_language_alter(), but this
- * behavior can be disabled by setting the 'field_language_fallback'
- * variable to FALSE.
- *
- * @param $field_langcodes
- *   A reference to an array of language codes keyed by field name.
- * @param $entity
- *   The entity to be displayed.
- * @param $langcode
- *   The language code $entity has to be displayed in.
- */
-function field_language_fallback(&$field_langcodes, $entity, $langcode) {
-  // Lazily init fallback candidates to avoid unnecessary calls.
-  $fallback_candidates = NULL;
-
-  foreach ($field_langcodes as $field_name => $field_langcode) {
-    // If the requested language is defined for the current field use it,
-    // otherwise search for a fallback value among the fallback candidates.
-    if (isset($entity->{$field_name}[$langcode])) {
-      $field_langcodes[$field_name] = $langcode;
-    }
-    elseif (!empty($entity->{$field_name})) {
-      if (!isset($fallback_candidates)) {
-        require_once DRUPAL_ROOT . '/core/includes/language.inc';
-        $fallback_candidates = language_fallback_get_candidates();
-      }
-      foreach ($fallback_candidates as $fallback_langcode) {
-        if (isset($entity->{$field_name}[$fallback_langcode])) {
-          $field_langcodes[$field_name] = $fallback_langcode;
-          break;
-        }
-      }
-    }
-  }
-}
-
-/**
  * Implements hook_cache_flush().
  */
 function field_cache_flush() {
diff --git a/core/modules/field/field.multilingual.inc b/core/modules/field/field.multilingual.inc
index 30c1e41..0420168 100644
--- a/core/modules/field/field.multilingual.inc
+++ b/core/modules/field/field.multilingual.inc
@@ -46,7 +46,7 @@
  *   language, the translation handler is responsible for performing one of the
  *   following actions:
  *   - Ignore missing translations, i.e. do not show any field values for the
- *     requested language. For example, see field_field_language_alter().
+ *     requested language. For example, see locale_field_language_alter().
  *   - Provide a value in a different language as fallback. By default, the
  *     fallback logic is applied separately to each field to ensure that there
  *     is a value for each field to display.
@@ -68,13 +68,6 @@
  */
 function field_language_insert() {
   field_info_cache_clear();
-  // If the number of languages is bigger than 1, enable the core language
-  // fallback rules.
-  // Because the language_count is updated only after the hook is invoked, we
-  // check if the language_count is bigger or equal with 1 at the current time.
-  if (variable_get('language_count', 1) >= 1) {
-    variable_set('field_language_fallback', TRUE);
-  }
 }
 
 /**
@@ -89,13 +82,6 @@ function field_language_update() {
  */
 function field_language_delete() {
   field_info_cache_clear();
-  // If the number of languages is less than 2, disable the core language
-  // fallback rules.
-  // Because the language_count is updated after the hook is invoked, we check
-  // if the language_count is less or equal with 2 at the current time.
-  if (variable_get('language_count', 1) <= 2) {
-    variable_set('field_language_fallback', FALSE);
-  }
 }
 
 /**
@@ -179,11 +165,14 @@ function _field_language_suggestion($available_langcodes, $langcode_suggestion,
 /**
  * Returns available content language codes.
  *
+ * The language codes that may be associated to fields include
+ * LANGUAGE_NOT_SPECIFIED.
+ *
  * @return
  *   An array of language codes.
  */
 function field_content_languages() {
-  return array_keys(language_list(LANGUAGE_ALL));
+  return array_keys(language_list() + array(LANGUAGE_NOT_SPECIFIED => NULL));
 }
 
 /**
@@ -254,8 +243,8 @@ function field_has_translation_handler($entity_type, $handler = NULL) {
  *   A valid language code.
  */
 function field_valid_language($langcode, $default = TRUE) {
-  $languages = field_content_languages();
-  if (in_array($langcode, $languages)) {
+  $enabled_languages = field_content_languages();
+  if (in_array($langcode, $enabled_languages)) {
     return $langcode;
   }
   return $default ? language_default()->langcode : drupal_container()->get(LANGUAGE_TYPE_CONTENT)->langcode;
@@ -274,8 +263,8 @@ function field_valid_language($langcode, $default = TRUE) {
  *
  * If translation handlers are found, we let modules provide alternative display
  * language codes for fields not having the requested language code available.
- * Core language fallback rules are provided by field_language_fallback()
- * which is called by field_field_language_alter().
+ * Core language fallback rules are provided by locale_field_language_fallback()
+ * which is called by locale_field_language_alter().
  *
  * @param $entity_type
  *   The type of $entity.
@@ -301,25 +290,11 @@ function field_language($entity_type, $entity, $field_name = NULL, $langcode = N
   if (!isset($display_langcodes[$entity_type][$id][$langcode])) {
     $display_langcode = array();
 
-    // By default, display language is set to one of the locked languages
-    // if the field translation is not available. It is up to translation
-    // handlers to implement language fallback rules.
+    // By default display language is set to LANGUAGE_NOT_SPECIFIED if the field
+    // translation is not available. It is up to translation handlers to
+    // implement language fallback rules.
     foreach (field_info_instances($entity_type, $bundle) as $instance) {
-      if (isset($entity->{$instance['field_name']}[$langcode])) {
-        $display_langcode[$instance['field_name']] = $langcode;
-      }
-      else {
-        // If the field has a value for one of the locked languages, then use
-        // that language for display. If not, the default one will be
-        // LANGUAGE_NOT_SPECIFIED.
-        $display_langcode[$instance['field_name']] = LANGUAGE_NOT_SPECIFIED;
-        foreach (language_locked_languages() as $language_locked) {
-          if (isset($entity->{$instance['field_name']}[$language_locked->langcode])) {
-            $display_langcode[$instance['field_name']] = $language_locked->langcode;
-            break;
-          }
-        }
-      }
+      $display_langcode[$instance['field_name']] = isset($entity->{$instance['field_name']}[$langcode]) ? $langcode : LANGUAGE_NOT_SPECIFIED;
     }
 
     if (field_has_translation_handler($entity_type)) {
@@ -328,11 +303,6 @@ function field_language($entity_type, $entity, $field_name = NULL, $langcode = N
         'entity' => $entity,
         'langcode' => $langcode,
       );
-      // Do not apply core language fallback rules if they are disabled or if
-      // the entity does not have a translation handler registered.
-      if (variable_get('field_language_fallback', FALSE) && field_has_translation_handler($context['entity_type'])) {
-        field_language_fallback($display_langcode, $context['entity'], $context['langcode']);
-      }
       drupal_alter('field_language', $display_langcode, $context);
     }
 
diff --git a/core/modules/field/lib/Drupal/field/Tests/EntityPropertiesTest.php b/core/modules/field/lib/Drupal/field/Tests/EntityPropertiesTest.php
index 7a2712f..00a4430 100644
--- a/core/modules/field/lib/Drupal/field/Tests/EntityPropertiesTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/EntityPropertiesTest.php
@@ -36,7 +36,7 @@ class EntityPropertiesTest extends FieldTestBase {
     $entity = field_test_create_stub_entity();
 
     foreach ($entity_types as $entity_type) {
-      $label = entity_create($entity_type, (array) $entity)->label();
+      $label = entity_label($entity_type, $entity);
 
       switch ($entity_type) {
         case 'test_entity_no_label':
diff --git a/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php b/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
index ce76545..fe9e9fc 100644
--- a/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
@@ -23,7 +23,7 @@ class TranslationTest extends FieldTestBase {
   }
 
   function setUp() {
-    parent::setUp('language', 'field_test');
+    parent::setUp('locale', 'field_test');
 
     $this->field_name = drupal_strtolower($this->randomName() . '_field_name');
 
@@ -69,11 +69,11 @@ class TranslationTest extends FieldTestBase {
 
     // Test hook_field_languages() invocation on a translatable field.
     variable_set('field_test_field_available_languages_alter', TRUE);
-    $langcodes = field_content_languages();
+    $enabled_langcodes = field_content_languages();
     $available_langcodes = field_available_languages($this->entity_type, $this->field);
     foreach ($available_langcodes as $delta => $langcode) {
       if ($langcode != 'xx' && $langcode != 'en') {
-        $this->assertTrue(in_array($langcode, $langcodes), t('%language is an enabled language.', array('%language' => $langcode)));
+        $this->assertTrue(in_array($langcode, $enabled_langcodes), t('%language is an enabled language.', array('%language' => $langcode)));
       }
     }
     $this->assertTrue(in_array('xx', $available_langcodes), t('%language was made available.', array('%language' => 'xx')));
@@ -263,9 +263,6 @@ class TranslationTest extends FieldTestBase {
 
     $enabled_langcodes = field_content_languages();
     $langcodes = array();
-    // This array is used to store, for each field name, which one of the locked
-    // languages will be used for display.
-    $locked_languages = array();
 
     // Generate field translations for languages different from the first
     // enabled.
@@ -280,15 +277,6 @@ class TranslationTest extends FieldTestBase {
       while (isset($langcodes[$langcode]));
       $langcodes[$langcode] = TRUE;
       $entity->{$field_name}[$langcode] = $this->_generateTestFieldValues($field['cardinality']);
-      // If the langcode is one of the locked languages, then that one
-      // will also be used for display. Otherwise, the default one should be
-      // used, which is LANGUAGE_NOT_SPECIFIED.
-      if (language_is_locked($langcode)) {
-        $locked_languages[$field_name] = $langcode;
-      }
-      else {
-        $locked_languages[$field_name] = LANGUAGE_NOT_SPECIFIED;
-      }
     }
 
     // Test multiple-fields display languages for untranslatable entities.
@@ -298,13 +286,14 @@ class TranslationTest extends FieldTestBase {
     $display_langcodes = field_language($entity_type, $entity, NULL, $requested_langcode);
     foreach ($instances as $instance) {
       $field_name = $instance['field_name'];
-      $this->assertTrue($display_langcodes[$field_name] == $locked_languages[$field_name], t('The display language for field %field_name is %language.', array('%field_name' => $field_name, '%language' => $locked_languages[$field_name])));
+      $this->assertTrue($display_langcodes[$field_name] == LANGUAGE_NOT_SPECIFIED, t('The display language for field %field_name is %language.', array('%field_name' => $field_name, '%language' => LANGUAGE_NOT_SPECIFIED)));
     }
 
     // Test multiple-fields display languages for translatable entities.
     field_test_entity_info_translatable($entity_type, TRUE);
     drupal_static_reset('field_language');
     $display_langcodes = field_language($entity_type, $entity, NULL, $requested_langcode);
+
     foreach ($instances as $instance) {
       $field_name = $instance['field_name'];
       $langcode = $display_langcodes[$field_name];
diff --git a/core/modules/field/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php b/core/modules/field/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
index 0d3739f..2432d15 100644
--- a/core/modules/field/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
+++ b/core/modules/field/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
@@ -43,7 +43,7 @@ class TextTranslationTest extends WebTestBase {
     $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
 
     // Set "Article" content type to use multilingual support with translation.
-    $edit = array('node_type_language_hidden' => FALSE, 'node_type_language_translation_enabled' => TRUE);
+    $edit = array('node_type_language' => TRANSLATION_ENABLED);
     $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
     $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Article')), t('Article content type has been updated.'));
   }
diff --git a/core/modules/field/tests/modules/field_test/field_test.entity.inc b/core/modules/field/tests/modules/field_test/field_test.entity.inc
index 456fe99..9185b85 100644
--- a/core/modules/field/tests/modules/field_test/field_test.entity.inc
+++ b/core/modules/field/tests/modules/field_test/field_test.entity.inc
@@ -81,7 +81,6 @@ function field_test_entity_info() {
       'fieldable' => TRUE,
       'field cache' => FALSE,
       'base table' => 'test_entity',
-      'revision table' => 'test_entity_revision',
       'entity keys' => array(
         'id' => 'ftid',
         'revision' => 'ftvid',
@@ -95,7 +94,6 @@ function field_test_entity_info() {
       'fieldable' => TRUE,
       'field cache' => FALSE,
       'base table' => 'test_entity',
-      'revision table' => 'test_entity_revision',
       'entity keys' => array(
         'id' => 'ftid',
         'revision' => 'ftvid',
@@ -110,7 +108,6 @@ function field_test_entity_info() {
       'fieldable' => TRUE,
       'field cache' => FALSE,
       'base table' => 'test_entity',
-      'revision table' => 'test_entity_revision',
       'label callback' => 'field_test_entity_label_callback',
       'entity keys' => array(
         'id' => 'ftid',
@@ -131,9 +128,9 @@ function field_test_entity_info_alter(&$entity_info) {
   foreach (field_test_entity_info_translatable() as $entity_type => $translatable) {
     $entity_info[$entity_type]['translation']['field_test'] = $translatable;
   }
-  // Disable the entity type translation handler.
+  // Disable locale as a translation handler.
   foreach ($entity_info as $entity_type => $info) {
-    $entity_info[$entity_type]['translation'][$entity_type] = FALSE;
+    $entity_info[$entity_type]['translation']['locale'] = FALSE;
   }
 }
 
diff --git a/core/modules/field/tests/modules/field_test/field_test.module b/core/modules/field/tests/modules/field_test/field_test.module
index 9b4a3aa..8a4c7cd 100644
--- a/core/modules/field/tests/modules/field_test/field_test.module
+++ b/core/modules/field/tests/modules/field_test/field_test.module
@@ -117,7 +117,7 @@ function field_test_field_available_languages_alter(&$langcodes, $context) {
  */
 function field_test_field_language_alter(&$display_langcode, $context) {
   if (variable_get('field_test_language_fallback', TRUE)) {
-    field_language_fallback($display_langcode, $context['entity'], $context['langcode']);
+    locale_field_language_fallback($display_langcode, $context['entity'], $context['langcode']);
   }
 }
 
@@ -211,13 +211,11 @@ function field_test_dummy_field_storage_query(EntityFieldQuery $query) {
  *   The entity type.
  * @param $entity
  *   The entity object.
- * @param $langcocde
- *   (optional) The langcode.
  *
  * @return
  *   The label of the entity prefixed with "label callback".
  */
-function field_test_entity_label_callback($entity_type, $entity, $langcode = NULL) {
+function field_test_entity_label_callback($entity_type, $entity) {
   return 'label callback ' . $entity->ftlabel;
 }
 
diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc
index a601d00..168821e 100644
--- a/core/modules/language/language.admin.inc
+++ b/core/modules/language/language.admin.inc
@@ -12,7 +12,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  */
 function language_admin_overview_form($form, &$form_state) {
   drupal_static_reset('language_list');
-  $languages = language_list(LANGUAGE_ALL);
+  $languages = language_list();
   $default = language_default();
 
   $form['languages'] = array(
@@ -30,24 +30,8 @@ function language_admin_overview_form($form, &$form_state) {
 
   foreach ($languages as $langcode => $language) {
     $form['languages'][$langcode]['#weight'] = $language->weight;
-    $title = check_plain($language->name);
-    $description = '';
-    switch ($langcode) {
-      case LANGUAGE_NOT_APPLICABLE:
-        $description = t('For language independent content.');
-        break;
-      case LANGUAGE_NOT_SPECIFIED:
-        $description = t('Use this when the language is not (yet) known.');
-        break;
-      case LANGUAGE_MULTIPLE:
-        $description = t('Use this when multiple languages can be assigned, such as a multilingual PDF.');
-        break;
-    }
-    if (!empty($description)) {
-      $title .= '<div class="description">' . $description . '</div>';
-    }
     $form['languages'][$langcode]['name'] = array(
-      '#markup' => $title,
+      '#markup' => check_plain($language->name),
     );
     $form['languages'][$langcode]['default'] = array(
       '#type' => 'radio',
@@ -66,28 +50,22 @@ function language_admin_overview_form($form, &$form_state) {
       '#attributes' => array(
         'class' => array('language-order-weight'),
       ),
-      '#delta' => 30,
     );
     $form['languages'][$langcode]['operations'] = array(
       '#theme_wrappers' => array('language_admin_operations'),
       '#weight' => 100,
     );
-    if (empty($language->locked)) {
-      $form['languages'][$langcode]['operations']['edit'] = array(
-        '#type' => 'link',
-        '#title' => t('edit'),
-        '#href' => 'admin/config/regional/language/edit/' . $langcode,
-      );
-      $form['languages'][$langcode]['operations']['delete'] = array(
-        '#type' => 'link',
-        '#title' => t('delete'),
-        '#href' => 'admin/config/regional/language/delete/' . $langcode,
-        '#access' => $langcode != $default->langcode,
-      );
-    }
-    else {
-      $form['languages'][$langcode]['default']['#attributes']['disabled'] = 'disabled';
-    }
+    $form['languages'][$langcode]['operations']['edit'] = array(
+      '#type' => 'link',
+      '#title' => t('edit'),
+      '#href' => 'admin/config/regional/language/edit/' . $langcode,
+    );
+    $form['languages'][$langcode]['operations']['delete'] = array(
+      '#type' => 'link',
+      '#title' => t('delete'),
+      '#href' => 'admin/config/regional/language/delete/' . $langcode,
+      '#access' => $langcode != $default->langcode,
+    );
   }
 
   $form['actions'] = array('#type' => 'actions');
@@ -164,7 +142,7 @@ function theme_language_admin_overview_form_table($variables) {
  * Process language overview form submissions, updating existing languages.
  */
 function language_admin_overview_form_submit($form, &$form_state) {
-  $languages = language_list(LANGUAGE_ALL);
+  $languages = language_list();
   $old_default = language_default();
 
   foreach ($languages as $langcode => $language) {
diff --git a/core/modules/language/language.install b/core/modules/language/language.install
index b07753b..5a962fa 100644
--- a/core/modules/language/language.install
+++ b/core/modules/language/language.install
@@ -12,13 +12,8 @@
  * system on multilingual sites without needing any preliminary configuration.
  */
 function language_install() {
-  // Add the default language at first so that language_list() returns this in
-  // language_special_languages().
-  $default_language = language_save(language_default());
-  $languages = language_locked_languages($default_language->weight);
-  foreach ($languages as $language) {
-    language_save($language);
-  }
+  // Add the default language to the database too.
+  language_save(language_default());
 
   // Enable URL language detection for each configurable language type.
   require_once DRUPAL_ROOT . '/core/includes/language.inc';
@@ -87,13 +82,6 @@ function language_schema() {
         'default' => 0,
         'description' => 'Weight, used in lists of languages.',
       ),
-      'locked' => array(
-        'type' => 'int',
-        'size' => 'tiny',
-        'not null' => TRUE,
-        'default' => 0,
-        'description' => 'A boolean indicating whether the administrator can edit or delete the language.',
-      ),
     ),
     'primary key' => array('langcode'),
     'indexes' => array(
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 46ba812..2474943 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -39,7 +39,7 @@ function language_help($path, $arg) {
 
     case 'admin/structure/block/manage/%/%':
       if ($arg[4] == 'language' && $arg[5] == 'language_interface') {
-        return '<p>' . t('With multiple languages enabled, registered users can select their preferred language and authors can assign a specific language to content.') . '</p>';
+        return '<p>' . t('This block is only shown if <a href="@languages">at least two languages are enabled</a> and <a href="@configuration">language negotiation</a> is set to <em>URL</em> or <em>Session</em>.', array('@languages' => url('admin/config/regional/language'), '@configuration' => url('admin/config/regional/language/detection'))) . '</p>';
       }
       break;
   }
@@ -77,16 +77,14 @@ function language_menu() {
     'title' => 'Edit language',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('language_admin_edit_form', 5),
-    'access callback' => 'language_access_language_edit_or_delete',
-    'access arguments' => array(5),
+    'access arguments' => array('administer languages'),
     'file' => 'language.admin.inc',
   );
   $items['admin/config/regional/language/delete/%language'] = array(
     'title' => 'Confirm delete',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('language_admin_delete_form', 5),
-    'access callback' => 'language_access_language_edit_or_delete',
-    'access arguments' => array(5),
+    'access arguments' => array('administer languages'),
     'file' => 'language.admin.inc',
   );
 
@@ -121,13 +119,6 @@ function language_menu() {
 }
 
 /**
- * Editing or deleting locked languages should not be possible.
- */
-function language_access_language_edit_or_delete($language) {
-  return !$language->locked && user_access('administer languages');
-}
-
-/**
  * Implements hook_permission().
  */
 function language_permission() {
@@ -196,8 +187,8 @@ function language_save($language) {
     variable_set('language_default', (array) $language);
   }
 
-  // Update language count based on unlocked language count.
-  variable_set('language_count', db_query('SELECT COUNT(langcode) FROM {language} WHERE locked = 0')->fetchField());
+  // Update language count based on enabled language count.
+  variable_set('language_count', db_query('SELECT COUNT(langcode) FROM {language}')->fetchField());
 
   // Kill the static cache in language_list().
   drupal_static_reset('language_list');
@@ -214,8 +205,8 @@ function language_save($language) {
  *   TRUE if language is successfully deleted. Otherwise FALSE.
  */
 function language_delete($langcode) {
-  $languages = language_list(LANGUAGE_ALL);
-  if (isset($languages[$langcode]) && !$languages[$langcode]->locked) {
+  $languages = language_list();
+  if (isset($languages[$langcode])) {
     $language = $languages[$langcode];
 
     module_invoke_all('language_delete', $language);
@@ -397,10 +388,6 @@ function language_modules_disabled($modules) {
  * Implements hook_language_insert().
  */
 function language_language_insert($language) {
-  if (!empty($language->locked)) {
-    return;
-  }
-
   language_negotiation_include();
 
   // Add new language to the list of language prefixes.
@@ -418,10 +405,6 @@ function language_language_insert($language) {
  * Implements hook_language_update().
  */
 function language_language_update($language) {
-  if (!empty($language->locked)) {
-    return;
-  }
-
   language_negotiation_include();
 
   // If the language is the default, then ensure that no other languages have
@@ -538,16 +521,15 @@ function language_url_outbound_alter(&$path, &$options, $original_path) {
       $callbacks = array_keys($callbacks);
     }
 
-    // No language dependent path allowed in this mode.
-    if (empty($callbacks)) {
-      unset($options['language']);
-      return;
-    }
-
     foreach ($callbacks as $callback) {
       if (function_exists($callback)) {
         $callback($path, $options);
       }
     }
+
+    // No language dependent path allowed in this mode.
+    if (empty($callbacks)) {
+      unset($options['language']);
+    }
   }
 }
diff --git a/core/modules/language/language.negotiation.inc b/core/modules/language/language.negotiation.inc
index d573413..0d6dd94 100644
--- a/core/modules/language/language.negotiation.inc
+++ b/core/modules/language/language.negotiation.inc
@@ -368,7 +368,7 @@ function language_url_rewrite_url(&$path, &$options) {
     $options['language'] = $language_url;
   }
   // We allow only enabled languages here.
-  elseif (is_object($options['language']) && !isset($languages[$options['language']->langcode])) {
+  elseif (!isset($languages[$options['language']->langcode])) {
     unset($options['language']);
     return;
   }
@@ -377,7 +377,7 @@ function language_url_rewrite_url(&$path, &$options) {
     switch (variable_get('language_negotiation_url_part', LANGUAGE_NEGOTIATION_URL_PREFIX)) {
       case LANGUAGE_NEGOTIATION_URL_DOMAIN:
         $domains = language_negotiation_url_domains();
-        if (is_object($options['language']) && !empty($domains[$options['language']->langcode])) {
+        if (!empty($domains[$options['language']->langcode])) {
           // Ask for an absolute URL with our modified base_url.
           global $is_https;
           $url_scheme = ($is_https) ? 'https://' : 'http://';
@@ -396,7 +396,7 @@ function language_url_rewrite_url(&$path, &$options) {
 
       case LANGUAGE_NEGOTIATION_URL_PREFIX:
         $prefixes = language_negotiation_url_prefixes();
-        if (is_object($options['language']) &&!empty($prefixes[$options['language']->langcode])) {
+        if (!empty($prefixes[$options['language']->langcode])) {
           $options['prefix'] = $prefixes[$options['language']->langcode] . '/';
         }
         break;
diff --git a/core/modules/locale/lib/Drupal/locale/PoDatabaseReader.php b/core/modules/locale/lib/Drupal/locale/PoDatabaseReader.php
new file mode 100644
index 0000000..e2cfbe2
--- /dev/null
+++ b/core/modules/locale/lib/Drupal/locale/PoDatabaseReader.php
@@ -0,0 +1,185 @@
+<?php
+
+namespace Drupal\locale;
+
+use Drupal\Component\Gettext\BatchStateInterface;
+use Drupal\Component\Gettext\PoHeader;
+use Drupal\Component\Gettext\PoItem;
+use Drupal\Component\Gettext\PoReaderInterface;
+
+class PoDatabaseReader implements BatchStateInterface, PoReaderInterface {
+  /*
+   * @param $overwrite_options
+   *   An associative array indicating what data should be overwritten, if any.
+   *   - not_customized: not customized strings should be overwritten.
+   *   - customized: customized strings should be overwritten.
+   * @param $customized
+   *   (optional) Whether the strings being imported should be saved as customized.
+   *   Use LOCALE_CUSTOMIZED or LOCALE_NOT_CUSTOMIZED.
+   */
+
+  private $_options;
+  private $_langcode;
+  private $_result;
+
+  /**
+   * lid of last read record
+   *
+   * This is used to manage state.
+   * TODO: state is not working yet ... see prepared statement
+   *
+   * @see PODatabaseReader::readItem()
+   * @see PODatabaseReader::buildQuery()
+   */
+  private $_lid = -1;
+
+  /**
+   * @see BatchStateInterface
+   */
+  function __construct() {
+    $this->setOptions(array());
+  }
+
+  public function getLangcode() {
+    return $this->_langcode;
+  }
+
+  public function setLangcode($langcode) {
+    $this->_langcode = $langcode;
+  }
+
+  function getOptions() {
+    return $this->_options;
+  }
+
+  function setOptions(array $options) {
+    if (!isset($options['override_options'])) {
+      $options['override_options'] = array();
+    }
+    if (!isset($options['customized'])) {
+      $options['customized'] = LOCALE_NOT_CUSTOMIZED;
+    }
+    $this->_options = array(
+      'override_options' => $options['override_options'],
+    );
+    $this->_options += $options;
+  }
+
+  function setState(array $state) {
+    $this->_lid = $state['lid'];
+    $this->setOptions($state['options']);
+    $this->buildQuery();
+  }
+
+  function getState() {
+    return array(
+      '__CLASS__' => __CLASS__,
+      'lid' => $this->_lid,
+      'options' => $this->_options,
+    );
+  }
+
+  function getHeader() {
+    return new PoHeader($this->getLangcode());
+  }
+
+  public function setHeader(PoHeader $header) {
+    // empty on purpose
+  }
+
+  /**
+   * Generates a structured array of all translated strings for the language.
+   *
+   * @param $language
+   *   Language object to generate the output for, or NULL if generating
+   *   translation template.
+   * @param $options
+   *   (optional) An associative array specifying what to include in the output:
+   *   - customized: include customized strings (if TRUE)
+   *   - uncustomized: include non-customized string (if TRUE)
+   *   - untranslated: include untranslated source strings (if TRUE)
+   *   Ignored if $language is NULL.
+   *
+   * @return
+   *   An array of translated strings that can be used to generate an export.
+   */
+  private function buildQuery() {
+    $langcode = $this->_langcode;
+    $options = $this->_options;
+
+    // Assume FALSE for all options if not provided by the API.
+    $options += array(
+      'customized' => FALSE,
+      'not_customized' => FALSE,
+      'not_translated' => FALSE,
+    );
+    if (array_sum($options) == 0) {
+      // If user asked to not include anything in the translation files,
+      // that would not make sense, so just fall back on providing a template.
+      $langcode = NULL;
+    }
+
+    // Build and execute query to collect source strings and translations.
+    $query = db_select('locales_source', 's');
+    if (!empty($langcode)) {
+      if ($options['not_translated']) {
+        // Left join to keep untranslated strings in.
+        $query->leftJoin('locales_target', 't', 's.lid = t.lid AND t.language = :language', array(':language' => $langcode));
+      }
+      else {
+        // Inner join to filter for only translations.
+        $query->innerJoin('locales_target', 't', 's.lid = t.lid AND t.language = :language', array(':language' => $langcode));
+      }
+      if ($options['customized']) {
+        if (!$options['not_customized']) {
+          // Filter for customized strings only.
+          $query->condition('t.customized', LOCALE_CUSTOMIZED);
+        }
+        // Else no filtering needed in this case.
+      }
+      else {
+        if ($options['not_customized']) {
+          // Filter for non-customized strings only.
+          $query->condition('t.customized', LOCALE_NOT_CUSTOMIZED);
+        }
+        else {
+          // Filter for strings without translation.
+          $query->isNull('t.translation');
+        }
+      }
+      $query->fields('t', array('translation'));
+    }
+    else {
+      $query->leftJoin('locales_target', 't', 's.lid = t.lid');
+    }
+    $query->fields('s', array('lid', 'source', 'context', 'location'));
+
+    // TODO: we need to order by lid
+    // This does not seem to work
+    $query->orderBy('s.lid');
+    $query->condition('s.lid', $this->_lid, '>');
+
+    $this->_result = $query->execute();
+    //echo "Executing: (lid = $this->_lid) : \n" . $this->_result->getQueryString() . "\n";
+  }
+
+  private function getResult() {
+    if (!isset($this->_result)) {
+      $this->buildQuery();
+    }
+    return $this->_result;
+  }
+
+  function readItem() {
+    $result = $this->getResult();
+    $values = $result->fetchAssoc();
+    if ($values) {
+      $poItem = new PoItem();
+      $poItem->fromArray($values);
+      // Manage state
+      $this->_lid = $values['lid'];
+      return $poItem;
+    }
+  }
+
+}
diff --git a/core/modules/locale/lib/Drupal/locale/PoDatabaseWriter.php b/core/modules/locale/lib/Drupal/locale/PoDatabaseWriter.php
new file mode 100644
index 0000000..6386e46
--- /dev/null
+++ b/core/modules/locale/lib/Drupal/locale/PoDatabaseWriter.php
@@ -0,0 +1,302 @@
+<?php
+
+namespace Drupal\locale;
+
+use Drupal\Component\Gettext\BatchStateInterface;
+use Drupal\Component\Gettext\PoHeader;
+use Drupal\Component\Gettext\PoItem;
+use Drupal\Component\Gettext\PoReaderInterface;
+use Drupal\Component\Gettext\PoWriterInterface;
+
+
+class PoDatabaseWriter implements PoWriterInterface, BatchStateInterface {
+  /*
+   * @param $overwrite_options
+   *   An associative array indicating what data should be overwritten, if any.
+   *   - not_customized: not customized strings should be overwritten.
+   *   - customized: customized strings should be overwritten.
+   * @param $customized
+   *   (optional) Whether the strings being imported should be saved as customized.
+   *   Use LOCALE_CUSTOMIZED or LOCALE_NOT_CUSTOMIZED.
+   */
+
+  private $_options;
+  private $_langcode;
+  private $_header;
+
+  static function getDefaultState() {
+    return array(
+      'langcode' => NULL,
+      'report' => array(
+        'additions' => 0,
+        'updates' => 0,
+        'deletes' => 0,
+        'skips' => 0,
+        'ignored' => 0,
+      ),
+      'options' => array(
+        'overwrite_options' => array(
+          'not_customized' => FALSE,
+          'customized' => FALSE,
+        ),
+        'customized' => LOCALE_NOT_CUSTOMIZED,
+      ),
+    );
+  }
+
+  /**
+   * Report array summarizing the number of changes done in the form:
+   * array(additions, updates, deletes, skips, ignored).
+   *
+   * @var array
+   */
+  private $_report;
+
+  /**
+   * @see BatchStateInterface
+   */
+  function __construct() {
+    $this->setState(array());
+  }
+
+  public function getLangcode() {
+    return $this->_langcode;
+  }
+
+  public function setLangcode($langcode) {
+    $this->_langcode = $langcode;
+  }
+
+  public function getReport() {
+    return $this->_report;
+  }
+
+  function setReport($report) {
+    $report += array(
+      'additions' => 0,
+      'updates' => 0,
+      'deletes' => 0,
+      'skips' => 0,
+      'ignored' => 0,
+    );
+    $this->_report = $report;
+  }
+
+  function getOptions() {
+    return $this->_options;
+  }
+
+  function setOptions(array $options) {
+    $options['overwrite_options'] += array(
+      'not_customized' => FALSE,
+      'customized' => FALSE,
+    );
+    $options += array(
+      'customized' => LOCALE_NOT_CUSTOMIZED,
+    );
+    $this->_options = $options;
+  }
+
+  /**
+   * Implementation of BatchInterface::setState
+   *
+   * @param array $state
+   */
+  public function setState(array $state) {
+    $state += self::getDefaultState();
+    $this->_report = $state['report'];
+    $this->setLangcode($state['langcode']);
+    $this->setOptions($state['options']);
+  }
+
+  public function getState() {
+    return array(
+      'class' => __CLASS__,
+      'report' => $this->getReport(),
+      'langcode' => $this->getLangcode(),
+      'options' => $this->getOptions(),
+    );
+  }
+
+  function getHeader() {
+    return $this->_header;
+  }
+
+  /**
+   * Sets the header and configure drupal accordingly.
+   *
+   * Before being able to process the given header we need to know in what
+   * context this database write is done. For this the options must be set.
+   *
+   * A langcode is required to set the current headers PluralForm.
+   *
+   * @param PoHeader $header
+   * @throws Exception
+   */
+  function setHeader(PoHeader $header) {
+    $this->_header = $header;
+    $locale_plurals = variable_get('locale_translation_plurals', array());
+    // Check for options
+    $options = $this->getOptions();
+    if (empty($options)) {
+      throw new Exception("Options should be set before assigning a PoHeader");
+    }
+    $overwrite_options = $options['overwrite_options'];
+    // Check for langcode
+    $lang = $this->_langcode;
+    if (empty($lang)) {
+      throw new Exception("Langcode should be set before assigning a PoHeader");
+    }
+    if (array_sum($overwrite_options) || empty($locale_plurals[$lang]['plurals'])) {
+      // Get and store the plural formula if available.
+      $plural = $header->getPlural();
+      // TODO: this is a sloppy way to create a file name
+      // but parsePluralForms is also weird to me still
+      $filepath = __CLASS__ . "::" . __METHOD__;
+      if (isset($plural) && $p = $header->parsePluralForms($plural, $filepath)) {
+        list($nplurals, $formula) = $p;
+        $locale_plurals[$lang] = array(
+          'plurals' => $nplurals,
+          'formula' => $formula,
+        );
+        variable_set('locale_translation_plurals', $locale_plurals);
+      }
+    }
+  }
+
+  /**
+   * Write an item to the database.
+   *
+   * @param PoItem $item
+   */
+  function writeItem(PoItem $item) {
+    if ($item->plural) {
+      $item->source = join(LOCALE_PLURAL_DELIMITER, $item->source);
+      $item->translation = join(LOCALE_PLURAL_DELIMITER, $item->translation);
+    }
+    $this->importString($item, 'location');
+  }
+
+  /**
+   * Write next items from a reader to the database.
+   * If no number of items is specified, all of theme are being written.
+   *
+   * @param PoReaderInterface $reader
+   * @param $count
+   *  The number of items that will be wrote.
+   */
+  public function writeItems(PoReaderInterface $reader, $count = -1) {
+    $forever = $count == -1;
+    while (($count-- > 0 || $forever) && ($item = $reader->readItem())) {
+      $this->writeItem($item);
+    }
+  }
+
+  /**
+   * Imports one string into the database.
+   *
+   * @param PoItem $item
+   *  The item being imported.
+   * @param $location
+   *   Location value to save with source string.
+   *
+   * @return
+   *   The string ID of the existing string modified or the new string added.
+   */
+  private function importString($item, $location) {
+    // Initialize overwrite options if not set.
+    $this->_options['overwrite_options'] += array(
+      'not_customized' => FALSE,
+      'customized' => FALSE,
+    );
+    $overwrite_options = $this->_options['overwrite_options'];
+    $customized = $this->_options['customized'];
+
+    // Look up the source string and any existing translation.
+    $string = db_query("SELECT s.lid, t.customized FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.source = :source AND s.context = :context", array(
+      ':source' => $item->source,
+      ':context' => $item->context,
+      ':language' => $this->_langcode,
+        ))
+        ->fetchObject();
+
+    if (!empty($item->translation)) {
+      // Skip this string unless it passes a check for dangerous code.
+      if (!locale_string_is_safe($item->translation)) {
+        watchdog('locale', 'Import of string "%string" was skipped because of disallowed or malformed HTML.', array('%string' => $item->translation), WATCHDOG_ERROR);
+        $this->_report['skips']++;
+        return 0;
+      }
+      elseif (isset($string->lid)) {
+        // We have this source string saved already.
+        db_update('locales_source')
+            ->fields(array(
+              'location' => $location,
+            ))
+            ->condition('lid', $string->lid)
+            ->execute();
+
+        if (!isset($string->customized)) {
+          // No translation in this language.
+          db_insert('locales_target')
+              ->fields(array(
+                'lid' => $string->lid,
+                'language' => $this->_langcode,
+                'translation' => $item->translation,
+                'customized' => $customized,
+              ))
+              ->execute();
+
+          $this->_report['additions']++;
+        }
+        elseif ($overwrite_options[$string->customized ? 'customized' : 'not_customized']) {
+          // Translation exists, only overwrite if instructed.
+          db_update('locales_target')
+              ->fields(array(
+                'translation' => $item->translation,
+                'customized' => $customized,
+              ))
+              ->condition('language', $this->_langcode)
+              ->condition('lid', $string->lid)
+              ->execute();
+
+          $this->_report['updates']++;
+        }
+        return $string->lid;
+      }
+      else {
+        // No such source string in the database yet.
+        $lid = db_insert('locales_source')
+            ->fields(array(
+              'location' => $location,
+              'source' => $item->source,
+              'context' => (string) $item->context,
+            ))
+            ->execute();
+
+        db_insert('locales_target')
+            ->fields(array(
+              'lid' => $lid,
+              'language' => $this->_langcode,
+              'translation' => $item->translation,
+              'customized' => $customized,
+            ))
+            ->execute();
+
+        $this->_report['additions']++;
+        return $lid;
+      }
+    }
+    elseif (isset($string->lid) && isset($string->customized) && $overwrite_options[$string->customized ? 'customized' : 'not_customized']) {
+      // Empty translation, remove existing if instructed.
+      db_delete('locales_target')
+          ->condition('language', $this->_langcode)
+          ->condition('lid', $string->lid)
+          ->execute();
+
+      $this->_report['deletes']++;
+      return $string->lid;
+    }
+  }
+
+}
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleCommentLanguageTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleCommentLanguageTest.php
index 9bb8bc0..16fc83f 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleCommentLanguageTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleCommentLanguageTest.php
@@ -38,7 +38,7 @@ class LocaleCommentLanguageTest extends WebTestBase {
     $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
 
     // Set "Article" content type to use multilingual support.
-    $edit = array('node_type_language_hidden' => FALSE);
+    $edit = array('node_type_language' => 1);
     $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
 
     // Enable content language negotiation UI.
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
index fbedc33..0c5cea3 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
@@ -82,9 +82,9 @@ class LocaleContentTest extends WebTestBase {
 
     // Set "Basic page" content type to use multilingual support.
     $this->drupalGet('admin/structure/types/manage/page');
-    $this->assertText(t('Language settings'), t('Multilingual support fieldset present on content type configuration form.'));
+    $this->assertText(t('Multilingual support'), t('Multilingual support fieldset present on content type configuration form.'));
     $edit = array(
-      'node_type_language_hidden' => FALSE,
+      'node_type_language' => 1,
     );
     $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
     $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.'));
@@ -152,7 +152,7 @@ class LocaleContentTest extends WebTestBase {
     // Set "Article" content type to use multilingual support.
     $this->drupalGet('admin/structure/types/manage/article');
     $edit = array(
-      'node_type_language_hidden' => FALSE,
+      'node_type_language' => 1,
     );
     $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
     $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Article')), t('Article content type has been updated.'));
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleDateFormatsTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleDateFormatsTest.php
new file mode 100644
index 0000000..e5514b8
--- /dev/null
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleDateFormatsTest.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\locale\Tests\LocaleDateFormatsTest.
+ */
+
+namespace Drupal\locale\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Functional tests for localizing date formats.
+ */
+class LocaleDateFormatsTest extends WebTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Localize date formats',
+      'description' => 'Tests for the localization of date formats.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('node', 'locale'));
+
+    // Create Article node type.
+    $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
+
+    // Create and login user.
+    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'create article content'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Functional tests for localizing date formats.
+   */
+  function testLocalizeDateFormats() {
+    // Add language.
+    $edit = array(
+      'predefined_langcode' => 'fr',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Set language negotiation.
+    $language_type = LANGUAGE_TYPE_INTERFACE;
+    $edit = array(
+      "{$language_type}[enabled][language-url]" => TRUE,
+    );
+    $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));
+
+    // Configure date formats.
+    $this->drupalGet('admin/config/regional/date-time/locale');
+    $this->assertText('French', 'Configured languages appear.');
+    $edit = array(
+      'date_format_long' => 'd.m.Y - H:i',
+      'date_format_medium' => 'd.m.Y - H:i',
+      'date_format_short' => 'd.m.Y - H:i',
+    );
+    $this->drupalPost('admin/config/regional/date-time/locale/fr/edit', $edit, t('Save configuration'));
+    $this->assertText(t('Configuration saved.'), 'French date formats updated.');
+    $edit = array(
+      'date_format_long' => 'j M Y - g:ia',
+      'date_format_medium' => 'j M Y - g:ia',
+      'date_format_short' => 'j M Y - g:ia',
+    );
+    $this->drupalPost('admin/config/regional/date-time/locale/en/edit', $edit, t('Save configuration'));
+    $this->assertText(t('Configuration saved.'), 'English date formats updated.');
+
+    // Create node content.
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+
+    // Configure format for the node posted date changes with the language.
+    $this->drupalGet('node/' . $node->nid);
+    $english_date = format_date($node->created, 'custom', 'j M Y');
+    $this->assertText($english_date, t('English date format appears'));
+    $this->drupalGet('fr/node/' . $node->nid);
+    $french_date = format_date($node->created, 'custom', 'd.m.Y');
+    $this->assertText($french_date, t('French date format appears'));
+  }
+}
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleFileImportStatus.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleFileImportStatus.php
deleted file mode 100644
index 9726ef8..0000000
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleFileImportStatus.php
+++ /dev/null
@@ -1,181 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\locale\Tests\LocaleFileImportStatus.
- */
-
-namespace Drupal\locale\Tests;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Functional tests for the import of translation files.
- */
-class LocaleFileImportStatus extends WebTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Translation file import status',
-      'description' => 'Tests the status of imported translation files.',
-      'group' => 'Locale',
-    );
-  }
-
-  function setUp() {
-    parent::setUp('locale');
-
-    // Create and login user.
-    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages'));
-    $this->drupalLogin($admin_user);
-
-    // Set the translation file directory.
-    variable_set('locale_translate_file_directory', drupal_get_path('module', 'locale') . '/tests');
-  }
-
-  /**
-   * Add a language.
-   *
-   * @param $langcode
-   *   The language of the langcode to add.
-   */
-  function addLanguage($langcode) {
-    // Add language.
-    $edit = array('predefined_langcode' => $langcode);
-    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
-    drupal_static_reset('language_list');
-    $this->assertTrue(language_load($langcode), t('Language %langcode added.', array('%langcode' => $langcode)));
-  }
-
-  /**
-   * Get translations for a array of strings.
-   *
-   * @param $strings
-   *   A array of strings to translate.
-   * @param $langcode
-   *   The language code of the language to translate to.
-   */
-  function checkTranslations($strings, $langcode) {
-    foreach ($strings as $source => $translation) {
-      $db_translation = db_query('SELECT translation FROM {locales_target} lt INNER JOIN {locales_source} ls ON ls.lid = lt.lid WHERE ls.source = :source AND lt.language = :langcode', array(':source' => $source, ':langcode' => $langcode))->fetchField();
-      $this->assertEqual((string) $translation, (string) $db_translation);
-    }
-  }
-
-  /**
-   * Import a single interface translation file.
-   *
-   * @param $langcode
-   *   Langcode of the po file and language to import.
-   * @param int $timestamp_difference
-   *  (optional) Timestamp offset, used to mock older or newer files.
-   *
-   * @return stdClass
-   *   A file object of type stdClass.
-   */
-  function mockImportedPoFile($langcode, $timestamp_difference = 0) {
-    $dir = variable_get('locale_translate_file_directory', drupal_get_path('module', 'locale') . '/tests');
-    $testfile_uri = $dir . '/test.' . $langcode . '.po';
-
-    $file = locale_translate_file_create($testfile_uri);
-    $file->original_timestamp = $file->timestamp;
-    $file->timestamp = $file->timestamp + $timestamp_difference;
-    $file->langcode = $langcode;
-
-    // Fill the {locale_file} with a custom timestamp.
-    if ($timestamp_difference != 0) {
-      locale_translate_update_file_history($file);
-    }
-
-    $count = db_query('SELECT COUNT(*) FROM {locale_file} WHERE langcode = :langcode', array(':langcode' => $langcode))->fetchField();
-    $this->assertEqual(1, $count, format_plural($count, '@count file registered in {locale_file}.', '@count files registered in {locale_file}.'));
-
-    $result = db_query('SELECT langcode, uri FROM {locale_file}')->fetchAssoc();
-    $this->assertEqual($result['uri'], $testfile_uri, t('%uri is in {locale_file}.', array('%uri' => $result['uri'])));
-    $this->assertEqual($result['langcode'], $langcode, t('Langcode is %langcode.', array('%langcode' => $langcode)));
-    return $file;
-  }
-
-  /**
-   * Test the basic bulk import functionality.
-   */
-  function testBulkImport() {
-    $langcode = 'de';
-
-    // Translations should not exist.
-    $strings = array(
-      'Monday' => '',
-      'Tuesday' => '',
-    );
-    $this->checkTranslations($strings, $langcode);
-
-    // Add language.
-    $this->addLanguage($langcode);
-
-    // The file was imported, translations should exist.
-    $strings = array(
-      'Monday' => 'Montag',
-      'Tuesday' => 'Dienstag',
-    );
-    $this->checkTranslations($strings, $langcode);
-  }
-
-  /**
-   * Update a pre-existing file.
-   */
-  function testBulkImportUpdateExisting() {
-    $langcode = 'de';
-
-    // Translations should not exist.
-    $strings = array(
-      'Monday' => '',
-      'Tuesday' => '',
-    );
-    $this->checkTranslations($strings, $langcode);
-
-    // Fill the {locale_file} table with a older file.
-    $file = $this->mockImportedPoFile($langcode, -1);
-
-    // Add language.
-    $this->addLanguage($langcode);
-
-    // The file was imported, translations should exist.
-    $strings = array(
-      'Monday' => 'Montag',
-      'Tuesday' => 'Dienstag',
-    );
-    $this->checkTranslations($strings, $langcode);
-
-    $timestamp = db_query('SELECT timestamp FROM {locale_file} WHERE uri = :uri', array(':uri' => $file->uri))->fetchField();
-    $this->assertEqual($timestamp, $file->original_timestamp, t('File is updated.'));
-  }
-
-  /**
-   * Don't update a pre-existing file.
-   */
-  function testBulkImportNotUpdateExisting() {
-    $langcode = 'de';
-
-    // Translations should not exist.
-    $strings = array(
-      'Monday' => '',
-      'Tuesday' => '',
-    );
-    $this->checkTranslations($strings, $langcode);
-
-    // Fill the {locale_file} table with a newer file.
-    $file = $this->mockImportedPoFile($langcode, 1);
-
-    // Add language.
-    $this->addLanguage($langcode);
-
-    // The file was not imported, the translation should not exist.
-    $strings = array(
-      'Monday' => '',
-      'Tuesday' => '',
-    );
-    $this->checkTranslations($strings, $langcode);
-
-    $timestamp = db_query('SELECT timestamp FROM {locale_file} WHERE uri = :uri', array(':uri' => $file->uri))->fetchField();
-    $this->assertEqual($timestamp, $file->timestamp);
-  }
-}
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleImportFunctionalTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleImportFunctionalTest.php
index 6fe77c2..538aebf 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleImportFunctionalTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleImportFunctionalTest.php
@@ -196,7 +196,8 @@ class LocaleImportFunctionalTest extends WebTestBase {
 
     // Ensure the translation file was automatically imported when language was
     // added.
-    $this->assertText(t('One translation file imported.'), t('Language file automatically imported.'));
+    $this->assertText(t('3 translation files imported.'), t('Language file automatically imported.'));
+    $this->assertText(t('A translation string was skipped because of disallowed or malformed HTML'), t('Language file automatically imported.'));
 
     // Ensure strings were successfully imported.
     $search = array(
@@ -206,6 +207,25 @@ class LocaleImportFunctionalTest extends WebTestBase {
     );
     $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
     $this->assertNoText(t('No strings available.'), t('String successfully imported.'));
+
+    // Ensure multiline string was imported.
+    $search = array(
+      'string' => 'HTTP Result Code: !status',
+      'language' => $langcode,
+      'translation' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText(t('No strings available.'), t('String successfully imported.'));
+
+    // Ensure xyzzy was imported and xyzzy not.
+    $search = array(
+      'string' => 'xyzzy',
+      'language' => $langcode,
+      'translation' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText(t('No strings available.'), t('String successfully imported.'));
+    $this->assertNoText('xyzzy2', t('String successfully imported.'));
   }
 
   /**
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleMultilingualFieldsTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleMultilingualFieldsTest.php
new file mode 100644
index 0000000..2a8299a
--- /dev/null
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleMultilingualFieldsTest.php
@@ -0,0 +1,137 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\locale\Tests\LocaleMultilingualFieldsTest.
+ */
+
+namespace Drupal\locale\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Functional test for multilingual fields.
+ */
+class LocaleMultilingualFieldsTest extends WebTestBase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Multilingual fields',
+      'description' => 'Test multilingual support for fields.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('node', 'locale'));
+
+    // Create Basic page node type.
+    $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
+
+    // Setup users.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages', 'create page content', 'edit own page content'));
+    $this->drupalLogin($admin_user);
+
+    // Add a new language.
+    $language = (object) array(
+      'langcode' => 'it',
+      'name' => 'Italian',
+    );
+    language_save($language);
+
+    // Enable URL language detection and selection.
+    $edit = array('language_interface[enabled][language-url]' => '1');
+    $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));
+
+    // Set "Basic page" content type to use multilingual support.
+    $edit = array(
+      'node_type_language' => 1,
+    );
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.'));
+
+    // Make node body translatable.
+    $field = field_info_field('body');
+    $field['translatable'] = TRUE;
+    field_update_field($field);
+  }
+
+  /**
+   * Test if field languages are correctly set through the node form.
+   */
+  function testMultilingualNodeForm() {
+    // Create "Basic page" content.
+    $langcode = LANGUAGE_NOT_SPECIFIED;
+    $title_key = "title";
+    $title_value = $this->randomName(8);
+    $body_key = "body[$langcode][0][value]";
+    $body_value = $this->randomName(16);
+
+    // Create node to edit.
+    $edit = array();
+    $edit[$title_key] = $title_value;
+    $edit[$body_key] = $body_value;
+    $edit['langcode'] = 'en';
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the node exists in the database.
+    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
+    $this->assertTrue($node, t('Node found in database.'));
+
+    $assert = isset($node->body['en']) && !isset($node->body[LANGUAGE_NOT_SPECIFIED]) && $node->body['en'][0]['value'] == $body_value;
+    $this->assertTrue($assert, t('Field language correctly set.'));
+
+    // Change node language.
+    $this->drupalGet("node/$node->nid/edit");
+    $edit = array(
+      $title_key => $this->randomName(8),
+      'langcode' => 'it'
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
+    $this->assertTrue($node, t('Node found in database.'));
+
+    $assert = isset($node->body['it']) && !isset($node->body['en']) && $node->body['it'][0]['value'] == $body_value;
+    $this->assertTrue($assert, t('Field language correctly changed.'));
+
+    // Enable content language URL detection.
+    language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LANGUAGE_NEGOTIATION_URL => 0));
+
+    // Test multilingual field language fallback logic.
+    $this->drupalGet("it/node/$node->nid");
+    $this->assertRaw($body_value, t('Body correctly displayed using Italian as requested language'));
+
+    $this->drupalGet("node/$node->nid");
+    $this->assertRaw($body_value, t('Body correctly displayed using English as requested language'));
+  }
+
+  /*
+   * Test multilingual field display settings.
+   */
+  function testMultilingualDisplaySettings() {
+    // Create "Basic page" content.
+    $langcode = LANGUAGE_NOT_SPECIFIED;
+    $title_key = "title";
+    $title_value = $this->randomName(8);
+    $body_key = "body[$langcode][0][value]";
+    $body_value = $this->randomName(16);
+
+    // Create node to edit.
+    $edit = array();
+    $edit[$title_key] = $title_value;
+    $edit[$body_key] = $body_value;
+    $edit['langcode'] = 'en';
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the node exists in the database.
+    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
+    $this->assertTrue($node, t('Node found in database.'));
+
+    // Check if node body is showed.
+    $this->drupalGet("node/$node->nid");
+    $body = $this->xpath('//article[@id=:id]//div[@class=:class]/descendant::p', array(
+      ':id' => 'node-' . $node->nid,
+      ':class' => 'content',
+    ));
+    $this->assertEqual(current($body), $node->body['en'][0]['value'], 'Node body found.');
+  }
+}
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
index 30595dd..71aff68 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
@@ -52,9 +52,11 @@ class LocaleUninstallTest extends WebTestBase {
     $this->assertEqual(drupal_container()->get(LANGUAGE_TYPE_INTERFACE)->langcode, $this->langcode, t('Current language: %lang', array('%lang' => drupal_container()->get(LANGUAGE_TYPE_INTERFACE)->langcode)));
 
     // Enable multilingual workflow option for articles.
-    variable_set('node_type_language_hidden_article',FALSE);
+    variable_set('node_type_language_article', 1);
+
     // Change JavaScript translations directory.
     variable_set('locale_js_directory', 'js_translations');
+
     // Build the JavaScript translation file for French.
     $user = $this->drupalCreateUser(array('translate interface', 'access administration pages'));
     $this->drupalLogin($user);
diff --git a/core/modules/locale/locale.admin.inc b/core/modules/locale/locale.admin.inc
new file mode 100644
index 0000000..4a4867c
--- /dev/null
+++ b/core/modules/locale/locale.admin.inc
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * @file
+ * Administration functions for locale.module.
+ */
+
+/**
+ * Returns HTML for a locale date format form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_locale_date_format_form($variables) {
+  $form = $variables['form'];
+  $header = array(
+    t('Date type'),
+    t('Format'),
+  );
+
+  foreach (element_children($form['date_formats']) as $key) {
+    $row = array();
+    $row[] = $form['date_formats'][$key]['#title'];
+    unset($form['date_formats'][$key]['#title']);
+    $row[] = array('data' => drupal_render($form['date_formats'][$key]));
+    $rows[] = $row;
+  }
+
+  $output = drupal_render($form['language']);
+  $output .= theme('table', array('header' => $header, 'rows' => $rows));
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
+
+/**
+ * Display edit date format links for each language.
+ */
+function locale_date_format_language_overview_page() {
+  $header = array(
+    t('Language'),
+    array('data' => t('Operations'), 'colspan' => '2'),
+  );
+
+  $languages = language_list();
+  foreach ($languages as $langcode => $language) {
+    $row = array();
+    $row[] = $language->name;
+    $row[] = l(t('edit'), 'admin/config/regional/date-time/locale/' . $langcode . '/edit');
+    $row[] = l(t('reset'), 'admin/config/regional/date-time/locale/' . $langcode . '/reset');
+    $rows[] = $row;
+  }
+
+  return theme('table', array('header' => $header, 'rows' => $rows));
+}
+
+/**
+ * Provide date localization configuration options to users.
+ */
+function locale_date_format_form($form, &$form_state, $langcode) {
+  // Display the current language name.
+  $form['language'] = array(
+    '#type' => 'item',
+    '#title' => t('Language'),
+    '#markup' => language_load($langcode)->name,
+    '#weight' => -10,
+  );
+  $form['langcode'] = array(
+    '#type' => 'value',
+    '#value' => $langcode,
+  );
+
+  // Get list of date format types.
+  $types = system_get_date_types();
+
+  // Get list of available formats.
+  $formats = system_get_date_formats();
+  $choices = array();
+  foreach ($formats as $type => $list) {
+    foreach ($list as $f => $format) {
+      $choices[$f] = format_date(REQUEST_TIME, 'custom', $f);
+    }
+  }
+  reset($formats);
+
+  // Get configured formats for each language.
+  $locale_formats = system_date_format_locale($langcode);
+  // Display a form field for each format type.
+  foreach ($types as $type => $type_info) {
+    if (!empty($locale_formats) && in_array($type, array_keys($locale_formats))) {
+      $default = $locale_formats[$type];
+    }
+    else {
+      $default = variable_get('date_format_' . $type, key($formats));
+    }
+
+    // Show date format select list.
+    $form['date_formats']['date_format_' . $type] = array(
+      '#type' => 'select',
+      '#title' => check_plain($type_info['title']),
+      '#attributes' => array('class' => array('date-format')),
+      '#default_value' => (isset($choices[$default]) ? $default : 'custom'),
+      '#options' => $choices,
+    );
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save configuration'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for configuring localized date formats on the locale_date_format_form.
+ */
+function locale_date_format_form_submit($form, &$form_state) {
+  $langcode = $form_state['values']['langcode'];
+
+  // Get list of date format types.
+  $types = system_get_date_types();
+  foreach ($types as $type => $type_info) {
+    $format = $form_state['values']['date_format_' . $type];
+    if ($format == 'custom') {
+      $format = $form_state['values']['date_format_' . $type . '_custom'];
+    }
+    locale_date_format_save($langcode, $type, $format);
+  }
+  drupal_set_message(t('Configuration saved.'));
+  $form_state['redirect'] = 'admin/config/regional/date-time/locale';
+}
+
+/**
+ * Reset locale specific date formats to the global defaults.
+ *
+ * @param $langcode
+ *   Language code, e.g. 'en'.
+ */
+function locale_date_format_reset_form($form, &$form_state, $langcode) {
+  $form['langcode'] = array('#type' => 'value', '#value' => $langcode);
+  return confirm_form($form,
+    t('Are you sure you want to reset the date formats for %language to the global defaults?', array('%language' => language_load($langcode)->name)),
+    'admin/config/regional/date-time/locale',
+    t('Resetting will remove all localized date formats for this language. This action cannot be undone.'),
+    t('Reset'), t('Cancel'));
+}
+
+/**
+ * Reset date formats for a specific language to global defaults.
+ */
+function locale_date_format_reset_form_submit($form, &$form_state) {
+  db_delete('date_format_locale')
+    ->condition('language', $form_state['values']['langcode'])
+    ->execute();
+  $form_state['redirect'] = 'admin/config/regional/date-time/locale';
+}
diff --git a/core/modules/locale/locale.bulk.inc b/core/modules/locale/locale.bulk.inc
index 1844473..b229acf 100644
--- a/core/modules/locale/locale.bulk.inc
+++ b/core/modules/locale/locale.bulk.inc
@@ -5,7 +5,10 @@
  * Mass import-export and batch import functionality for Gettext .po files.
  */
 
-include_once DRUPAL_ROOT . '/core/includes/gettext.inc';
+use Drupal\Component\Gettext\Gettext;
+use Drupal\Component\Gettext\PoFileWriter;
+use Drupal\locale\PoDatabaseReader;
+
 
 /**
  * User interface for the translation import screen.
@@ -95,6 +98,7 @@ function locale_translate_import_form_submit($form, &$form_state) {
 
     // Add language, if not yet supported.
     $language = language_load($form_state['values']['langcode']);
+    // @TODO: What if language is empty?
     if (empty($language)) {
       include_once DRUPAL_ROOT . '/core/includes/standard.inc';
       $predefined = standard_language_list();
@@ -107,7 +111,41 @@ function locale_translate_import_form_submit($form, &$form_state) {
     $customized = $form_state['values']['customized'] ? LOCALE_CUSTOMIZED : LOCALE_NOT_CUSTOMIZED;
 
     // Now import strings into the language
-    if ($return = _locale_import_po($file, $language->langcode, $form_state['values']['overwrite_options'], $customized) == FALSE) {
+    try {
+      // Try to allocate enough time to parse and import the data.
+      drupal_set_time_limit(240);
+
+      $report = getText::fileToDatabase($file, $language->langcode, $form_state['values']['overwrite_options'], $customized);
+      $additions = $report['additions'];
+      $updates = $report['updates'];
+      $deletes = $report['deletes'];
+      $skips = $report['skips'];
+
+      // @TODO: what is still needed
+      // @TODO: move to locale module
+      menu_router_rebuild();
+      // Clear cache and force refresh of JavaScript translations.
+      _locale_invalidate_js($language->langcode);
+      cache()->deletePrefix('locale:');
+
+      drupal_set_message(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => $additions, '%update' => $updates, '%delete' => $deletes)));
+      watchdog('locale', 'Imported %file into %locale: %number new strings added, %update updated and %delete removed.', array('%file' => $file->filename, '%locale' => $language->langcode, '%number' => $additions, '%update' => $updates, '%delete' => $deletes));
+      if ($skips) {
+        if (module_exists('dblog')) {
+          $skip_message = format_plural($skips, 'A translation string was skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', '@count translation strings were skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', array('@url' => url('admin/reports/dblog')));
+        }
+        else {
+          $skip_message = format_plural($skips, 'A translation string was skipped because of disallowed or malformed HTML. See the log for details.', '@count translation strings were skipped because of disallowed or malformed HTML. See the log for details.');
+        }
+        drupal_set_message($skip_message, 'error');
+        watchdog('locale', '@count disallowed HTML string(s) in %file', array('@count' => $skips, '%file' => $file->uri), WATCHDOG_WARNING);
+      }
+      $variables = array('%filename' => $file->filename);
+      drupal_set_message(t('The translation import of %filename is done.', $variables));
+      watchdog('locale', 'The translation import of %filename is done.', $variables);
+
+    } catch (Exception $exc) {
+      drupal_set_message(print_r($exc, TRUE));
       $variables = array('%filename' => $file->filename);
       drupal_set_message(t('The translation import of %filename failed.', $variables), 'error');
       watchdog('locale', 'The translation import of %filename failed.', $variables, WATCHDOG_ERROR);
@@ -207,7 +245,36 @@ function locale_translate_export_form_submit($form, &$form_state) {
     $language = NULL;
   }
   $content_options = isset($form_state['values']['content_options']) ? $form_state['values']['content_options'] : array();
-  _locale_export_po($language, _locale_export_po_generate($language, _locale_export_get_strings($language, $content_options)));
+  $reader = new PoDatabaseReader();
+  if ($language != NULL) {
+    $reader->setLangcode($language->langcode);
+    $reader->setOptions($content_options);
+    $filename = $language->langcode .'.po';
+  } else {
+    // Template required.
+    $filename = 'drupal.pot';
+  }
+  $item = $reader->readItem();
+  if (!empty($item)) {
+    $uri = tempnam('temporary://', 'po_');
+    $header = $reader->getHeader();
+    $writer = new PoFileWriter;
+    $writer->setUri($uri);
+    $writer->setHeader($header);
+
+    $writer->open();
+    $writer->writeItem($item);
+    $writer->writeItems($reader);
+    $writer->close();
+
+    header("Content-Disposition: attachment; filename=$filename");
+    header("Content-Type: text/plain; charset=utf-8");
+    print file_get_contents($uri);
+    drupal_exit();
+  }
+  else {
+    drupal_set_message('Nothing to export.');
+  }
 }
 
 /**
@@ -228,15 +295,14 @@ function locale_translate_add_language_set_batch($langcode) {
  *   (optional) Language code to limit files being imported.
  * @param $finish_feedback
  *   (optional) Whether to give feedback to the user when finished.
- * @param $force
- *   (optional) Import all available files, even if they were imported before.
  *
  * @todo
  *   Integrate with update status to identify projects needed and integrate
  *   l10n_update functionality to feed in translation files alike.
  *   See http://drupal.org/node/1191488.
  */
-function locale_translate_batch_import_files($langcode = NULL, $finish_feedback = FALSE, $force = FALSE) {
+function locale_translate_batch_import_files($langcode = NULL, $finish_feedback = FALSE) {
+  $directory = variable_get('locale_translate_file_directory', conf_path() . '/files/translations');
   $files = array();
   if (!empty($langcode)) {
     $langcodes = array($langcode);
@@ -247,41 +313,12 @@ function locale_translate_batch_import_files($langcode = NULL, $finish_feedback
     $langcodes = array_keys(language_list());
   }
   foreach ($langcodes as $langcode) {
-    $files = array_merge($files, locale_translate_get_interface_translation_files($langcode));
-  }
-  if (!$force) {
-    $result = db_select('locale_file', 'lf')
-      ->fields('lf', array('langcode', 'uri', 'timestamp'))
-      ->condition('langcode', $langcodes)
-      ->execute()
-      ->fetchAllAssoc('uri');
-    foreach ($result as $uri => $info) {
-      if (isset($files[$uri]) && filemtime($uri) <= $info->timestamp) {
-        // The file is already imported and it did not change since the import.
-        // Remove it from file list and don't import it again.
-        unset($files[$uri]);
-      }
-    }
+    $files = array_merge($files, file_scan_directory($directory, '!' . (!empty($langcode) ? '\.' . preg_quote($langcode, '!') : '') . '\.po$!', array('recurse' => FALSE)));
   }
   return locale_translate_batch_build($files, $finish_feedback);
 }
 
 /**
- * Get an array of available interface translation file.
- *
- * @param $langcode
- *   The langcode for the interface translation files. Pass NULL to get all
- *   available interface translation files.
- *
- * @return array
- *   An array of interface translation files.
- */
-function locale_translate_get_interface_translation_files($langcode = NULL) {
-  $directory = variable_get('locale_translate_file_directory', conf_path() . '/files/translations');
-  return file_scan_directory($directory, '!' . (!empty($langcode) ? '\.' . preg_quote($langcode, '!') : '') . '\.po$!', array('recurse' => FALSE));
-}
-
-/**
  * Build a locale batch from an array of files.
  *
  * @param $files
@@ -318,22 +355,28 @@ function locale_translate_batch_build($files, $finish_feedback = FALSE) {
 /**
  * Perform interface translation import as a batch step.
  *
+ * The given filepath is matched against ending with '{langcode}.po'. When
+ * matched the filepath is added to batch context.
+ *
  * @param $filepath
  *   Path to a file to import.
- * @param $results
+ * @param $context
  *   Contains a list of files imported.
  */
 function locale_translate_batch_import($filepath, &$context) {
   // The filename is either {langcode}.po or {prefix}.{langcode}.po, so
   // we can extract the language code to use for the import from the end.
   if (preg_match('!(/|\.)([^\./]+)\.po$!', $filepath, $langcode)) {
-    $file = locale_translate_file_create($filepath, $langcode[2]);
-    $success = _locale_import_read_po('db-store', $file, array(), $langcode[2]);
-    if ($success == NULL) {
-      $file->langcode = $langcode[2];
-      locale_translate_update_file_history($file);
+    $file = entity_create('file', array('filename' => drupal_basename($filepath), 'uri' => $filepath));
+    // We need only the last match
+    $langcode = array_pop($langcode);
+    try {
+      $report = getText::fileToDatabase($file, $langcode, array(), LOCALE_NOT_CUSTOMIZED);
+      $context['results']['files'][$filepath] = $filepath;
+      $context['results']['stats'][$filepath] = $report;
+    } catch (Exception $exc) {
+      drupal_set_message(print_r($exc, TRUE));
     }
-    $context['results'][] = $filepath;
   }
 }
 
@@ -342,69 +385,29 @@ function locale_translate_batch_import($filepath, &$context) {
  */
 function locale_translate_batch_finished($success, $results) {
   if ($success) {
-    drupal_set_message(format_plural(count($results), 'One translation file imported.', '@count translation files imported.'));
-  }
-}
-
-/**
- * Creates a file object and populates the timestamp property.
- *
- * @param $filepath
- *   The filepath of a file to import.
- *
- * @return
- *   An object representing the file.
- */
-function locale_translate_file_create($filepath) {
-  $file = new stdClass();
-  $file->filename = drupal_basename($filepath);
-  $file->uri = $filepath;
-  $file->timestamp = filemtime($file->uri);
-  return $file;
-}
-
-/**
- * Update the {locale_file} table.
- *
- * @param $file
- *   Object representing the file just imported.
- *
- * @return integer
- *   FALSE on failure. Otherwise SAVED_NEW or SAVED_UPDATED.
- *
- * @see drupal_write_record()
- */
-function locale_translate_update_file_history($file) {
-  // Update or write new record.
-  if (db_query("SELECT uri FROM {locale_file} WHERE uri = :uri AND langcode = :langcode", array(':uri' => $file->uri, ':langcode' => $file->langcode))->fetchField()) {
-    $update = array('uri', 'langcode');
-  }
-  else {
-    $update = array();
-  }
-  return drupal_write_record('locale_file', $file, $update);
-}
-
-/**
- * Deletes all interface translation files depending on the langcode.
- *
- * @param $langcode
- *   A langcode or NULL. Pass NULL to delete all interface translation files.
- */
-function locale_translate_delete_translation_files($langcode) {
-  $files = locale_translate_get_interface_translation_files($langcode);
-  if (!empty($files)) {
-    foreach ($files as $file) {
-      $success = file_unmanaged_delete($file->uri);
-      if (!$success) {
-        return FALSE;
+    $additions = $updates = $deletes = $skips = 0;
+    drupal_set_message(format_plural(count($results['files']), 'One translation file imported.', '@count translation files imported.'));
+    $skipped_files = array();
+    foreach ($results['stats'] as $filepath => $report) {
+      $additions += $report['additions'];
+      $updates += $report['updates'];
+      $deletes += $report['deletes'];
+      $skips += $report['skips'];
+      if ($report['skips'] > 0) {
+        $skipped_files[] = $filepath;
+      }
+    }
+    drupal_set_message(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => $additions, '%update' => $updates, '%delete' => $deletes)));
+    watchdog('locale', 'The translation was succesfully imported. %number new strings added, %update updated and %delete removed.', array('%number' => $additions, '%update' => $updates, '%delete' => $deletes));
+    if ($skips) {
+      if (module_exists('dblog')) {
+        $skip_message = format_plural($skips, 'A translation string was skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', '@count translation strings were skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', array('@url' => url('admin/reports/dblog')));
+      }
+      else {
+        $skip_message = format_plural($skips, 'A translation string was skipped because of disallowed or malformed HTML. See the log for details.', '@count translation strings were skipped because of disallowed or malformed HTML. See the log for details.');
       }
-      // Remove the registered translation file if any.
-      db_delete('locale_file')
-        ->condition('langcode', $langcode)
-        ->coddition('uri', $file->uri)
-        ->execute();
+      drupal_set_message($skip_message, 'error');
+      watchdog('locale', '@count disallowed HTML string(s) in files: @files.', array('@count' => $skips, '@files' => implode(',', $skipped_files)), WATCHDOG_WARNING);
     }
   }
-  return TRUE;
 }
diff --git a/core/modules/locale/locale.install b/core/modules/locale/locale.install
index 35106ae..ac03baa 100644
--- a/core/modules/locale/locale.install
+++ b/core/modules/locale/locale.install
@@ -29,6 +29,7 @@ function locale_uninstall() {
   variable_del('locale_cache_strings');
   variable_del('locale_js_directory');
   variable_del('javascript_parsed');
+  variable_del('locale_field_language_fallback');
   variable_del('locale_cache_length');
   variable_del('locale_translation_plurals');
   variable_del('locale_translation_javascript');
@@ -126,39 +127,6 @@ function locale_schema() {
     ),
   );
 
-  $schema['locale_file'] = array(
-    'description' => 'File import status information for interface translation files.',
-    'fields' => array(
-      'langcode' => array(
-        'description' => 'Reference to the {languages}.langcode for this translation.',
-        'type' => 'varchar',
-        'length' => '12',
-        'not null' => TRUE,
-      ),
-      'filename' => array(
-        'description' => 'Filename for importing the file.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'default' => '',
-      ),
-      'uri' => array(
-        'description' => 'File system path for importing the file.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'default' => '',
-      ),
-      'timestamp' => array(
-        'description' => 'Unix timestamp of the file itself from the point when it was last imported.',
-        'type' => 'int',
-        'not null' => FALSE,
-        'default' => 0,
-      ),
-    ),
-    'primary key' => array('uri', 'langcode'),
-  );
-
   return $schema;
 }
 
@@ -584,45 +552,6 @@ function locale_update_8009() {
 }
 
 /**
- * Add {locale_file} table.
- */
-function locale_update_8010() {
-  $table = array(
-    'description' => 'File import status information for interface translation files.',
-    'fields' => array(
-      'langcode' => array(
-        'description' => 'Reference to the {languages}.langcode for this translation.',
-        'type' => 'varchar',
-        'length' => '12',
-        'not null' => TRUE,
-      ),
-      'filename' => array(
-        'description' => 'Filename for importing the file.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'default' => '',
-      ),
-      'uri' => array(
-        'description' => 'File system path for importing the file.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'default' => '',
-      ),
-      'timestamp' => array(
-        'description' => 'Unix timestamp of the file itself from the point when it was last imported.',
-        'type' => 'int',
-        'not null' => FALSE,
-        'default' => 0,
-      ),
-    ),
-    'primary key' => array('uri', 'langcode'),
-  );
-  db_create_table('locale_file', $table);
-}
-
-/**
  * @} End of "addtogroup updates-7.x-to-8.x".
  * The next series of updates should start at 9000.
  */
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index f153e93..c034ab3 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -142,10 +142,61 @@ function locale_menu() {
     'file' => 'locale.bulk.inc',
   );
 
+  // Localize date formats.
+  $items['admin/config/regional/date-time/locale'] = array(
+    'title' => 'Localize',
+    'description' => 'Configure date formats for each locale',
+    'page callback' => 'locale_date_format_language_overview_page',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -8,
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/date-time/locale/%/edit'] = array(
+    'title' => 'Localize date formats',
+    'description' => 'Configure date formats for each locale',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_date_format_form', 5),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/date-time/locale/%/reset'] = array(
+    'title' => 'Reset date formats',
+    'description' => 'Reset localized date formats to global defaults',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_date_format_reset_form', 5),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'locale.admin.inc',
+  );
+
   return $items;
 }
 
 /**
+ * Implements hook_init().
+ *
+ * Initialize date formats according to the user's current locale.
+ */
+function locale_init() {
+  global $conf;
+  $language_interface = drupal_container()->get(LANGUAGE_TYPE_INTERFACE);
+  // For each date type (e.g. long, short), get the localized date format
+  // for the user's current language and override the default setting for it
+  // in $conf. This should happen on all pages except the date and time formats
+  // settings page, where we want to display the site default and not the
+  // localized version.
+  if (strpos(current_path(), 'admin/config/regional/date-time/formats') !== 0) {
+    $languages = array($language_interface->langcode);
+
+    // Setup appropriate date formats for this locale.
+    $formats = locale_get_localized_date_format($languages);
+    foreach ($formats as $format_type => $format) {
+      $conf[$format_type] = $format;
+    }
+  }
+}
+
+/**
  * Implements hook_permission().
  */
 function locale_permission() {
@@ -158,10 +209,50 @@ function locale_permission() {
 }
 
 /**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ */
+function locale_form_node_form_alter(&$form, &$form_state) {
+  $form['#submit'][] = 'locale_field_node_form_submit';
+}
+
+/**
+ * Form submit handler for node_form().
+ *
+ * Checks if Locale is registered as a translation handler and handle possible
+ * node language changes.
+ *
+ * This submit handler needs to run before entity_form_submit_build_entity()
+ * is invoked by node_form_submit_build_node(), because it alters the values of
+ * attached fields. Therefore, it cannot be a hook_node_submit() implementation.
+ */
+function locale_field_node_form_submit($form, &$form_state) {
+  if (field_has_translation_handler('node', 'locale')) {
+    $bundle = $form_state['values']['type'];
+    $node_language = $form_state['values']['langcode'];
+
+    foreach (field_info_instances('node', $bundle) as $instance) {
+      $field_name = $instance['field_name'];
+      $field = field_info_field($field_name);
+      $previous_langcode = $form[$field_name]['#language'];
+
+      // Handle a possible language change: new language values are inserted,
+      // previous ones are deleted.
+      if ($field['translatable'] && $previous_langcode != $node_language) {
+        $form_state['values'][$field_name][$node_language] = $form_state['values'][$field_name][$previous_langcode];
+        $form_state['values'][$field_name][$previous_langcode] = array();
+      }
+    }
+  }
+}
+
+/**
  * Implements hook_theme().
  */
 function locale_theme() {
   return array(
+    'locale_date_format_form' => array(
+      'render element' => 'form',
+    ),
     'locale_translate_edit_form_strings' => array(
       'render element' => 'form',
       'file' => 'locale.pages.inc',
@@ -170,6 +261,68 @@ function locale_theme() {
 }
 
 /**
+ * Implements hook_field_language_alter().
+ */
+function locale_field_language_alter(&$display_langcode, $context) {
+  // Do not apply core language fallback rules if they are disabled or if Locale
+  // is not registered as a translation handler.
+  if (variable_get('locale_field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'], 'locale')) {
+    locale_field_language_fallback($display_langcode, $context['entity'], $context['langcode']);
+  }
+}
+
+/**
+ * Applies language fallback rules to the fields attached to the given entity.
+ *
+ * Core language fallback rules simply check if fields have a field translation
+ * for the requested language code. If so the requested language is returned,
+ * otherwise all the fallback candidates are inspected to see if there is a
+ * field translation available in another language.
+ * By default this is called by locale_field_language_alter(), but this
+ * behavior can be disabled by setting the 'locale_field_language_fallback'
+ * variable to FALSE.
+ *
+ * @param $field_langcodes
+ *   A reference to an array of language codes keyed by field name.
+ * @param $entity
+ *   The entity to be displayed.
+ * @param $langcode
+ *   The language code $entity has to be displayed in.
+ */
+function locale_field_language_fallback(&$field_langcodes, $entity, $langcode) {
+  // Lazily init fallback candidates to avoid unnecessary calls.
+  $fallback_candidates = NULL;
+  $field_languages = array();
+
+  foreach ($field_langcodes as $field_name => $field_langcode) {
+    // If the requested language is defined for the current field use it,
+    // otherwise search for a fallback value among the fallback candidates.
+    if (isset($entity->{$field_name}[$langcode])) {
+      $field_langcodes[$field_name] = $langcode;
+    }
+    elseif (!empty($entity->{$field_name})) {
+      if (!isset($fallback_candidates)) {
+        require_once DRUPAL_ROOT . '/core/includes/language.inc';
+        $fallback_candidates = language_fallback_get_candidates();
+      }
+      foreach ($fallback_candidates as $fallback_langcode) {
+        if (isset($entity->{$field_name}[$fallback_langcode])) {
+          $field_langcodes[$field_name] = $fallback_langcode;
+          break;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function locale_entity_info_alter(&$entity_info) {
+  $entity_info['node']['translation']['locale'] = TRUE;
+}
+
+/**
  * Implements hook_language_insert().
  */
 function locale_language_insert($language) {
@@ -200,10 +353,6 @@ function locale_language_delete($language) {
     ->condition('language', $language->langcode)
     ->execute();
 
-  // Remove interface translation files.
-  module_load_include('inc', 'locale', 'locale.bulk');
-  locale_translate_delete_translation_files($language->langcode);
-
   _locale_invalidate_js($language->langcode);
 
   // Changing the language settings impacts the interface:
@@ -475,7 +624,7 @@ function locale_form_language_admin_overview_form_alter(&$form, &$form_state) {
       'translated' => 0,
       'ratio' => 0,
     );
-    if (!$language->locked && ($langcode != 'en' || locale_translate_english())) {
+    if ($langcode != 'en' || locale_translate_english()) {
       $form['languages'][$langcode]['locale_statistics'] = array(
         '#markup' => l(
           t('@translated/@total (@ratio%)', array(
@@ -879,3 +1028,88 @@ function _locale_rebuild_js($langcode = NULL) {
       return TRUE;
   }
 }
+
+/**
+ * Save locale specific date formats to the database.
+ *
+ * @param $langcode
+ *   Language code, can be 2 characters, e.g. 'en' or 5 characters, e.g.
+ *   'en-CA'.
+ * @param $type
+ *   Date format type, e.g. 'short', 'medium'.
+ * @param $format
+ *   The date format string.
+ */
+function locale_date_format_save($langcode, $type, $format) {
+  $locale_format = array();
+  $locale_format['language'] = $langcode;
+  $locale_format['type'] = $type;
+  $locale_format['format'] = $format;
+
+  $is_existing = (bool) db_query_range('SELECT 1 FROM {date_format_locale} WHERE language = :langcode AND type = :type', 0, 1, array(':langcode' => $langcode, ':type' => $type))->fetchField();
+  if ($is_existing) {
+    $keys = array('type', 'language');
+    drupal_write_record('date_format_locale', $locale_format, $keys);
+  }
+  else {
+    drupal_write_record('date_format_locale', $locale_format);
+  }
+}
+
+/**
+ * Select locale date format details from database.
+ *
+ * @param $languages
+ *   An array of language codes.
+ *
+ * @return
+ *   An array of date formats.
+ */
+function locale_get_localized_date_format($languages) {
+  $formats = array();
+
+  // Get list of different format types.
+  $format_types = system_get_date_types();
+  $short_default = variable_get('date_format_short', 'm/d/Y - H:i');
+
+  // Loop through each language until we find one with some date formats
+  // configured.
+  foreach ($languages as $language) {
+    $date_formats = system_date_format_locale($language);
+    if (!empty($date_formats)) {
+      // We have locale-specific date formats, so check for their types. If
+      // we're missing a type, use the default setting instead.
+      foreach ($format_types as $type => $type_info) {
+        // If format exists for this language, use it.
+        if (!empty($date_formats[$type])) {
+          $formats['date_format_' . $type] = $date_formats[$type];
+        }
+        // Otherwise get default variable setting. If this is not set, default
+        // to the short format.
+        else {
+          $formats['date_format_' . $type] = variable_get('date_format_' . $type, $short_default);
+        }
+      }
+
+      // Return on the first match.
+      return $formats;
+    }
+  }
+
+  // No locale specific formats found, so use defaults.
+  $system_types = array('short', 'medium', 'long');
+  // Handle system types separately as they have defaults if no variable exists.
+  $formats['date_format_short'] = $short_default;
+  $formats['date_format_medium'] = variable_get('date_format_medium', 'D, m/d/Y - H:i');
+  $formats['date_format_long'] = variable_get('date_format_long', 'l, F j, Y - H:i');
+
+  // For non-system types, get the default setting, otherwise use the short
+  // format.
+  foreach ($format_types as $type => $type_info) {
+    if (!in_array($type, $system_types)) {
+      $formats['date_format_' . $type] = variable_get('date_format_' . $type, $short_default);
+    }
+  }
+
+  return $formats;
+}
diff --git a/core/modules/locale/tests/test.de.po b/core/modules/locale/tests/test.de.po
deleted file mode 100644
index 85e2841..0000000
--- a/core/modules/locale/tests/test.de.po
+++ /dev/null
@@ -1,28 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: Drupal 7\\n"
-"MIME-Version: 1.0\\n"
-"Content-Type: text/plain; charset=UTF-8\\n"
-"Content-Transfer-Encoding: 8bit\\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
-
-msgid "Monday"
-msgstr "Montag"
-
-msgid "Tuesday"
-msgstr "Dienstag"
-
-msgid "Wednesday"
-msgstr "Mittwoch"
-
-msgid "Thursday"
-msgstr "Donnerstag"
-
-msgid "Friday"
-msgstr "Freitag"
-
-msgid "Saturday"
-msgstr "Samstag"
-
-msgid "Sunday"
-msgstr "Sonntag"
diff --git a/core/modules/locale/tests/test2.xx.po b/core/modules/locale/tests/test2.xx.po
new file mode 100755
index 0000000..1733f69
--- /dev/null
+++ b/core/modules/locale/tests/test2.xx.po
@@ -0,0 +1,15 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+msgid "xyzzy"
+msgstr "<strong>html</strong>"
+
+msgid "xyzzy2"
+msgstr "<script>html</script>"
+
+
diff --git a/core/modules/locale/tests/test3.xx.po b/core/modules/locale/tests/test3.xx.po
new file mode 100755
index 0000000..3840a0a
--- /dev/null
+++ b/core/modules/locale/tests/test3.xx.po
@@ -0,0 +1,16 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+msgid "HTTP Result Code: !status"
+msgstr ""
+"a multiline test"
+"second\r\n"
+"third"
+
+
+
diff --git a/core/modules/node/content_types.inc b/core/modules/node/content_types.inc
index 82bf9a2..6bb7969 100644
--- a/core/modules/node/content_types.inc
+++ b/core/modules/node/content_types.inc
@@ -185,37 +185,11 @@ function node_type_form($form, &$form_state, $type = NULL) {
     '#description' => t('Users with the <em>Administer content</em> permission will be able to override these options.'),
   );
   if (module_exists('language')) {
-    $lang_options = array();
-
-    $languages = language_list(LANGUAGE_ALL);
-    foreach ($languages as $langcode => $language) {
-      $lang_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name;
-    }
-
-    $lang_options += array(
-      'site_default' => t("Site's default language"),
-      'current_interface' => t('Current interface language'),
-      'authors_default' => t("Author's preferred language"),
-    );
-
-    $form['language'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Language settings'),
-      '#collapsible' => TRUE,
-      '#collapsed' => TRUE,
-      '#group' => 'additional_settings',
-    );
-    $form['language']['node_type_language_default'] = array(
-      '#type' => 'select',
-      '#title' => t('Default language'),
-      '#options' => $lang_options,
-      '#default_value' => variable_get('node_type_language_default_' . $type->type, 'site_default'),
-      '#description' => t('Explanation of the language options is found on the <a href="@languages_list_page">languages list page</a>.', array('@languages_list_page' => url('admin/config/regional/language'))),
-    );
-    $form['language']['node_type_language_hidden'] = array(
+    $form['workflow']['node_type_language'] = array(
       '#type' => 'checkbox',
-      '#title' => t('Hide language selector'),
-      '#default_value' => variable_get('node_type_language_hidden_' . $type->type, TRUE),
+      '#title' => t('Multilingual support'),
+      '#default_value' => variable_get('node_type_language_' . $type->type, 0),
+      '#description' => t('Add a language selection field to the editing form, allowing you to select from one of the <a href="!languages">enabled languages</a>. If disabled, new posts are saved with the default language. Existing content will not be affected by changing this option.', array('!languages' => url('admin/config/regional/language'))),
     );
   }
   $form['display'] = array(
diff --git a/core/modules/node/content_types.js b/core/modules/node/content_types.js
index 87fc460..5c1c44e 100644
--- a/core/modules/node/content_types.js
+++ b/core/modules/node/content_types.js
@@ -21,17 +21,6 @@ Drupal.behaviors.contentTypes = {
       }
       return vals.join(', ');
     });
-    $('fieldset#edit-language', context).drupalSetSummary(function(context) {
-      var vals = [];
-
-      vals.push($(".form-item-node-type-language-default select option:selected", context).text());
-
-      $('input:checked', context).next('label').each(function() {
-        vals.push(Drupal.checkPlain($(this).text()));
-      });
-
-      return vals.join(', ');
-    });
     $context.find('fieldset#edit-display').drupalSetSummary(function(context) {
       var vals = [];
       var $context = $(context);
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php b/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php
deleted file mode 100644
index df1ce3e..0000000
--- a/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\node\Tests\NodeFieldMultilingualTestCase.
- */
-
-namespace Drupal\node\Tests;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Functional test for multilingual fields.
- */
-class NodeFieldMultilingualTestCase extends WebTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Multilingual fields',
-      'description' => 'Test multilingual support for fields.',
-      'group' => 'Field API',
-    );
-  }
-
-  function setUp() {
-    parent::setUp(array('node', 'language'));
-
-    // Create Basic page node type.
-    $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
-
-    // Setup users.
-    $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages', 'create page content', 'edit own page content'));
-    $this->drupalLogin($admin_user);
-
-    // Add a new language.
-    $language = (object) array(
-      'langcode' => 'it',
-      'name' => 'Italian',
-    );
-    language_save($language);
-
-    // Enable URL language detection and selection.
-    $edit = array('language_interface[enabled][language-url]' => '1');
-    $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));
-
-    // Set "Basic page" content type to use multilingual support.
-    $edit = array(
-      'node_type_language_hidden' => FALSE,
-    );
-    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
-    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.'));
-
-    // Make node body translatable.
-    $field = field_info_field('body');
-    $field['translatable'] = TRUE;
-    field_update_field($field);
-  }
-
-  /**
-   * Test if field languages are correctly set through the node form.
-   */
-  function testMultilingualNodeForm() {
-    // Create "Basic page" content.
-    $langcode = node_type_get_default_langcode('page');
-    $title_key = "title";
-    $title_value = $this->randomName(8);
-    $body_key = "body[$langcode][0][value]";
-    $body_value = $this->randomName(16);
-
-    // Create node to edit.
-    $edit = array();
-    $edit[$title_key] = $title_value;
-    $edit[$body_key] = $body_value;
-    $this->drupalPost('node/add/page', $edit, t('Save'));
-
-    // Check that the node exists in the database.
-    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
-    $this->assertTrue($node, t('Node found in database.'));
-
-    $assert = isset($node->body['en']) && !isset($node->body[LANGUAGE_NOT_SPECIFIED]) && $node->body['en'][0]['value'] == $body_value;
-    $this->assertTrue($assert, t('Field language correctly set.'));
-
-    // Change node language.
-    $this->drupalGet("node/$node->nid/edit");
-    $edit = array(
-      $title_key => $this->randomName(8),
-      'langcode' => 'it'
-    );
-    $this->drupalPost(NULL, $edit, t('Save'));
-    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
-    $this->assertTrue($node, t('Node found in database.'));
-
-    $assert = isset($node->body['it']) && !isset($node->body['en']) && $node->body['it'][0]['value'] == $body_value;
-    $this->assertTrue($assert, t('Field language correctly changed.'));
-
-    // Enable content language URL detection.
-    language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LANGUAGE_NEGOTIATION_URL => 0));
-
-    // Test multilingual field language fallback logic.
-    $this->drupalGet("it/node/$node->nid");
-    $this->assertRaw($body_value, t('Body correctly displayed using Italian as requested language'));
-
-    $this->drupalGet("node/$node->nid");
-    $this->assertRaw($body_value, t('Body correctly displayed using English as requested language'));
-  }
-
-  /*
-   * Test multilingual field display settings.
-   */
-  function testMultilingualDisplaySettings() {
-    // Create "Basic page" content.
-    $langcode = node_type_get_default_langcode('page');
-    $title_key = "title";
-    $title_value = $this->randomName(8);
-    $body_key = "body[$langcode][0][value]";
-    $body_value = $this->randomName(16);
-
-    // Create node to edit.
-    $edit = array();
-    $edit[$title_key] = $title_value;
-    $edit[$body_key] = $body_value;
-    $this->drupalPost('node/add/page', $edit, t('Save'));
-
-    // Check that the node exists in the database.
-    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
-    $this->assertTrue($node, t('Node found in database.'));
-
-    // Check if node body is showed.
-    $this->drupalGet("node/$node->nid");
-    $body = $this->xpath('//article[@id=:id]//div[@class=:class]/descendant::p', array(
-      ':id' => 'node-' . $node->nid,
-      ':class' => 'content',
-    ));
-    $this->assertEqual(current($body), $node->body['en'][0]['value'], 'Node body found.');
-  }
-}
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
deleted file mode 100644
index 39db014..0000000
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\node\Tests\NodeTypeInitalLanguageTest.
- */
-
-namespace Drupal\node\Tests;
-
-/**
- * Tests related to node type initial language.
- */
-class NodeTypeInitialLanguageTest extends NodeTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Node type initial language',
-      'description' => 'Tests node type initial language settings.',
-      'group' => 'Node',
-    );
-  }
-
-  function setUp() {
-    parent::setUp(array('language'));
-    $web_user = $this->drupalCreateUser(array('bypass node access', 'administer content types', 'administer languages'));
-    $this->drupalLogin($web_user);
-  }
-
-  /**
-   * Tests the node type initial language defaults, and modify them.
-   *
-   * The default initial language must be the site's default, and the language
-   * locked option must be on.
-   */
-  function testNodeTypeInitialLanguageDefaults() {
-    $this->drupalGet('admin/structure/types/manage/article');
-    $this->assertOptionSelected('edit-node-type-language-default', 'site_default', 'The default inital language is the site default.');
-    $this->assertFieldChecked('edit-node-type-language-hidden', 'Language selector is hidden by default.');
-
-    $this->drupalGet('node/add/article');
-    $this->assertNoField('langcode', 'Language is not selectable on node add/edit page by default.');
-
-    // Adds a new language and set it as default.
-    $edit = array(
-      'predefined_langcode' => 'hu',
-    );
-    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
-    $edit = array(
-      'site_default' => 'hu',
-    );
-    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
-
-    // Tests the initial language after changing the site default language.
-    // First unhide the language selector
-    $edit = array(
-      'node_type_language_hidden' => FALSE,
-    );
-    $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
-    $this->drupalGet('node/add/article');
-    $this->assertField('langcode', 'Language is selectable on node add/edit page when language not hidden.');
-    $this->assertOptionSelected('edit-langcode', 'hu', 'The inital language is the site default on the node add page after the site default language is changed.');
-
-    // Changes the inital language settings.
-    $edit = array(
-      'node_type_language_default' => 'en',
-    );
-    $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
-    $this->drupalGet('node/add/article');
-    $this->assertOptionSelected('edit-langcode', 'en', 'The inital language is the defined language.');
-  }
-}
diff --git a/core/modules/node/node.admin.inc b/core/modules/node/node.admin.inc
index 1bb4547..5cc25eb 100644
--- a/core/modules/node/node.admin.inc
+++ b/core/modules/node/node.admin.inc
@@ -106,10 +106,10 @@ function node_filters() {
 
   // Language filter if language support is present.
   if (language_multilingual()) {
-    $languages = language_list(LANGUAGE_ALL);
+    $languages = language_list();
+    $language_options = array(LANGUAGE_NOT_SPECIFIED => t('- None -'));
     foreach ($languages as $langcode => $language) {
-      // Make locked languages appear special in the list.
-      $language_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name;
+      $language_options[$langcode] = $language->name;
     }
     $filters['language'] = array(
       'title' => t('language'),
@@ -476,7 +476,7 @@ function node_admin_nodes() {
   $nodes = node_load_multiple($nids);
 
   // Prepare the list of nodes.
-  $languages = language_list(LANGUAGE_ALL);
+  $languages = language_list();
   $destination = drupal_get_destination();
   $options = array();
   foreach ($nodes as $node) {
diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php
index 4a067ab..55ce86d 100644
--- a/core/modules/node/node.api.php
+++ b/core/modules/node/node.api.php
@@ -1,7 +1,5 @@
 <?php
 
-use Drupal\entity\EntityInterface;
-
 /**
  * @file
  * Hooks provided by the Node module.
@@ -843,15 +841,13 @@ function hook_node_view(Drupal\node\Node $node, $view_mode, $langcode) {
  *
  * @param $build
  *   A renderable array representing the node content.
- * @param Drupal\node\Node $node
- *   The node being rendered.
  *
  * @see node_view()
  * @see hook_entity_view_alter()
  *
  * @ingroup node_api_hooks
  */
-function hook_node_view_alter(&$build, Drupal\node\Node $node) {
+function hook_node_view_alter(&$build) {
   if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
     // Change its weight.
     $build['an_additional_field']['#weight'] = -10;
diff --git a/core/modules/node/node.install b/core/modules/node/node.install
index 7382320..6f806e9 100644
--- a/core/modules/node/node.install
+++ b/core/modules/node/node.install
@@ -458,9 +458,7 @@ function node_uninstall() {
         ->condition('name', 'node_options_' . $type)
         ->condition('name', 'node_submitted_' . $type)
         ->condition('name', 'node_permissions_' . $type)
-        ->condition('name', 'node_type_language_default_' . $type)
-        ->condition('name', 'node_type_language_hidden_' . $type)
-        ->condition('name', 'node_type_language_translation_enabled_' . $type)
+        ->condition('name', 'node_type_language_' . $type)
       )
       ->execute();
   }
@@ -522,9 +520,9 @@ function _update_7000_node_get_types() {
 function node_update_8001() {
   $types = db_query('SELECT type FROM {node_type}')->fetchCol();
   foreach ($types as $type) {
-    $node_type_language = variable_get('language_content_type_' . $type);
-    if (isset($node_type_language)) {
-      variable_set('node_type_language_' . $type, $node_type_language);
+    $language = variable_get('language_content_type_' . $type);
+    if (isset($language)) {
+      variable_set('node_type_language_' . $type, $language);
     }
     variable_del('language_content_type_' . $type);
   }
@@ -545,29 +543,6 @@ function node_update_8002() {
 }
 
 /**
- * Rename node type language variable names.
- */
-function node_update_8003() {
-  $types = db_query('SELECT type FROM {node_type}')->fetchCol();
-  foreach ($types as $type) {
-    variable_set('node_type_language_default_' . $type, LANGUAGE_NOT_SPECIFIED);
-    $node_type_language = variable_get('node_type_language_' . $type, 0);
-    if ($node_type_language == 0) {
-      variable_set('node_type_language_hidden_' . $type, TRUE);
-    }
-    if ($node_type_language == 2) {
-      // Translation was enabled, so enable it again and
-      // unhide the language selector. Because if language is
-      // LANGUAGE_NOT_SPECIFIED and the selector hidden, translation
-      // cannot be enabled.
-      variable_set('node_type_language_hidden_' . $type, FALSE);
-      variable_set('node_type_language_translation_enabled_' . $type, TRUE);
-    }
-    variable_del('node_type_language_' . $type);
-  }
-}
-
-/**
- * @} End of "addtogroup updates-7.x-to-8.x"
+ * @} End of "addtogroup updates-7.x-to-8.x".
  * The next series of updates should start at 9000.
  */
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 49d20a7..e787c7d 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -226,11 +226,6 @@ function node_entity_info() {
     ),
   );
 
-  // Add a translation handler for fields if the language module is enabled.
-  if (module_exists('language')) {
-    $return['node']['translation']['node'] = TRUE;
-  }
-
   // Search integration is provided by node.module, so search-related
   // view modes for nodes are defined here and not in search.module.
   if (module_exists('search')) {
@@ -634,47 +629,6 @@ function node_field_extra_fields() {
 }
 
 /**
- * Get the default language for a node type.
- *
- * @param string $node_type
- *   The type of node.
- *
- * @return string
- *   The language code of the node type's default langcode.
- */
-function node_type_get_default_langcode($node_type) {
-  $default_value = variable_get('node_type_language_default_' . $node_type, 'site_default');
-
-  $language_interface = drupal_container()->get(LANGUAGE_TYPE_INTERFACE);
-
-  if ($default_value == LANGUAGE_NOT_SPECIFIED) {
-    return LANGUAGE_NOT_SPECIFIED;
-  }
-
-  switch ($default_value) {
-    case 'site_default':
-      $default_value = language_default()->langcode;
-      break;
-
-    case 'current_interface':
-      $default_value = $language_interface->langcode;
-      break;
-
-    case 'authors_default':
-      global $user;
-      if (!empty($user->preferred_langcode)) {
-        $default_value = $user->preferred_langcode;
-      }
-      else {
-        $default_value = $language_interface->langcode;
-      }
-      break;
-  }
-
-  return $default_value;
-}
-
-/**
  * Deletes a node type from the database.
  *
  * @param $name
@@ -1205,7 +1159,7 @@ function node_view(Node $node, $view_mode = 'full', $langcode = NULL) {
 
   // Allow modules to modify the structured node.
   $type = 'node';
-  drupal_alter(array('node_view', 'entity_view'), $build, $node);
+  drupal_alter(array('node_view', 'entity_view'), $build, $type);
 
   return $build;
 }
@@ -1285,7 +1239,7 @@ function node_build_content(Node $node, $view_mode = 'full', $langcode = NULL) {
 
   // Allow modules to make their own additions to the node.
   module_invoke_all('node_view', $node, $view_mode, $langcode);
-  module_invoke_all('entity_view', $node, $view_mode, $langcode);
+  module_invoke_all('entity_view', $node, 'node', $view_mode, $langcode);
 }
 
 /**
@@ -2704,9 +2658,8 @@ function node_form_search_form_alter(&$form, $form_state) {
 
     // Languages:
     $language_options = array();
-    foreach (language_list(LANGUAGE_ALL) as $langcode => $language) {
-      // Make locked languages appear special in the list.
-      $language_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name;
+    foreach (language_list() as $langcode => $language) {
+      $language_options[$langcode] = $language->name;
     }
     if (count($language_options) > 1) {
       $form['advanced']['language'] = array(
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index faa3dea..70383b7 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -91,7 +91,7 @@ function node_add($type) {
     'uid' => $user->uid,
     'name' => (isset($user->name) ? $user->name : ''),
     'type' => $type,
-    'langcode' => node_type_get_default_langcode($type)
+    'langcode' => LANGUAGE_NOT_SPECIFIED,
   ));
   drupal_set_title(t('Create @name', array('@name' => $types[$type]->name)), PASS_THROUGH);
   $output = drupal_get_form($type . '_node_form', $node);
@@ -186,25 +186,26 @@ function node_form($form, &$form_state, Node $node) {
   // @todo D8: Remove. Modules should access the node using $form_state['node'].
   $form['#node'] = $node;
 
-  if (module_exists('language')) {
-    $languages = language_list(LANGUAGE_ALL);
+  if (variable_get('node_type_language_' . $node->type, 0) && module_exists('language')) {
+    $languages = language_list();
     $language_options = array();
     foreach ($languages as $langcode => $language) {
-      // Make locked languages appear special in the list.
-      $language_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name;
+      $language_options[$langcode] = $language->name;
     }
     $form['langcode'] = array(
       '#type' => 'select',
       '#title' => t('Language'),
-      '#default_value' => $node->langcode,
+      '#default_value' => (isset($node->langcode) ? $node->langcode : ''),
       '#options' => $language_options,
-      '#access' => !variable_get('node_type_language_hidden_' . $node->type, TRUE),
+      '#empty_value' => LANGUAGE_NOT_SPECIFIED,
     );
   }
   else {
     $form['langcode'] = array(
       '#type' => 'value',
-      '#value' => $node->langcode,
+      // New nodes without multilingual support get the default language, old
+      // nodes keep their language if language.module is not available.
+      '#value' => !isset($form['#node']->nid) ? language_default()->langcode : $node->langcode,
     );
   }
 
@@ -492,9 +493,6 @@ function theme_node_preview($variables) {
  * @see node_form_submit_build_node()
  */
 function node_form_submit($form, &$form_state) {
-  // Handle possible field translations first and then build the node from the
-  // submitted values.
-  node_field_language_form_submit($form, $form_state);
   $node = node_form_submit_build_node($form, $form_state);
   $insert = empty($node->nid);
   $node->save();
@@ -526,30 +524,6 @@ function node_form_submit($form, &$form_state) {
 }
 
 /**
- * Handles possible node language changes.
- *
- */
-function node_field_language_form_submit($form, &$form_state) {
-  if (field_has_translation_handler('node', 'node')) {
-    $bundle = $form_state['values']['type'];
-    $node_language = $form_state['values']['langcode'];
-
-    foreach (field_info_instances('node', $bundle) as $instance) {
-      $field_name = $instance['field_name'];
-      $field = field_info_field($field_name);
-      $previous_langcode = $form[$field_name]['#language'];
-
-      // Handle a possible language change: New language values are inserted,
-      // previous ones are deleted.
-      if ($field['translatable'] && $previous_langcode != $node_language) {
-        $form_state['values'][$field_name][$node_language] = $form_state['values'][$field_name][$previous_langcode];
-        $form_state['values'][$field_name][$previous_langcode] = array();
-      }
-    }
-  }
-}
-
-/**
  * Updates the form state's node entity by processing this submission's values.
  *
  * This is the default builder function for the node form. It is called
diff --git a/core/modules/openid/openid.module b/core/modules/openid/openid.module
index 034c7c2..3881320 100644
--- a/core/modules/openid/openid.module
+++ b/core/modules/openid/openid.module
@@ -263,11 +263,11 @@ function openid_form_user_register_form_alter(&$form, &$form_state) {
         $candidate_langcodes[] = $parts[0] . '-' . $parts[2];
         $candidate_langcodes[] = $parts[0] . '-' . $parts[1] . '-' . $parts[2];
       }
-      $languages = language_list();
+      $enabled_languages = language_list();
       // Iterate over the generated permutations starting with the longest (most
       // specific) strings.
       foreach (array_reverse($candidate_langcodes) as $candidate_langcode) {
-        if (isset($languages[$candidate_langcode])) {
+        if (isset($enabled_languages[$candidate_langcode])) {
           $form['language']['preferred_langcode']['#type'] = 'hidden';
           $form['language']['preferred_langcode']['#value'] = $candidate_langcode;
           // Skip the rest of the foreach to not overwrite the specific
diff --git a/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php b/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
index b3dba0e..096729f 100644
--- a/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
+++ b/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
@@ -42,8 +42,7 @@ class PathLanguageTest extends PathTestBase {
    */
   function testAliasTranslation() {
     // Set 'page' content type to enable translation.
-    variable_set('node_type_language_hidden_page', FALSE);
-    variable_set('node_type_language_translation_enabled_page', TRUE);
+    variable_set('node_type_language_page', TRANSLATION_ENABLED);
 
     $english_node = $this->drupalCreateNode(array('type' => 'page'));
     $english_alias = $this->randomName();
diff --git a/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php b/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
index ee1d4d7..6b89cad 100644
--- a/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
+++ b/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
@@ -50,7 +50,8 @@ class PollTranslateTest extends PollTestBase {
 
     // Set "Poll" content type to use multilingual support with translation.
     $this->drupalGet('admin/structure/types/manage/poll');
-    $edit = array('node_type_language_hidden' => FALSE, 'node_type_language_translation_enabled' => TRUE);
+    $edit = array();
+    $edit['node_type_language'] = TRANSLATION_ENABLED;
     $this->drupalPost('admin/structure/types/manage/poll', $edit, t('Save content type'));
     $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Poll')), t('Poll content type has been updated.'));
 
diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchLanguageTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchLanguageTest.php
index f117729..0770fa6 100644
--- a/core/modules/search/lib/Drupal/search/Tests/SearchLanguageTest.php
+++ b/core/modules/search/lib/Drupal/search/Tests/SearchLanguageTest.php
@@ -28,6 +28,10 @@ class SearchLanguageTest extends SearchTestBase {
   }
 
   function testLanguages() {
+    // Check that there are initially no languages displayed.
+    $this->drupalGet('search/node');
+    $this->assertNoText(t('Languages'), t('No languages to choose from.'));
+
     // Add predefined language.
     $edit = array('predefined_langcode' => 'fr');
     $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
@@ -56,5 +60,9 @@ class SearchLanguageTest extends SearchTestBase {
     $this->drupalPost(NULL, $edit, t('Save configuration'));
     $this->assertNoFieldChecked('edit-site-default-en', t('Default language updated.'));
     $this->drupalPost('admin/config/regional/language/delete/en', array(), t('Delete'));
+
+    // Check that there are again no languages displayed.
+    $this->drupalGet('search/node');
+    $this->assertNoText(t('Languages'), t('No languages to choose from.'));
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/DateFormatsLanguageTest.php b/core/modules/system/lib/Drupal/system/Tests/System/DateFormatsLanguageTest.php
deleted file mode 100644
index 5f86c6e..0000000
--- a/core/modules/system/lib/Drupal/system/Tests/System/DateFormatsLanguageTest.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\system\Tests\System\DateFormatsLanguageTest.
- */
-
-namespace Drupal\system\Tests\System;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Functional tests for localizing date formats.
- */
-class DateFormatsLanguageTest extends WebTestBase {
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Localize date formats',
-      'description' => 'Tests for the localization of date formats.',
-      'group' => 'System',
-    );
-  }
-
-  function setUp() {
-    parent::setUp(array('node', 'language'));
-
-    // Create Article node type.
-    $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
-
-    // Create and login user.
-    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'create article content'));
-    $this->drupalLogin($admin_user);
-  }
-
-  /**
-   * Functional tests for localizing date formats.
-   */
-  function testLocalizeDateFormats() {
-    // Add language.
-    $edit = array(
-      'predefined_langcode' => 'fr',
-    );
-    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
-
-    // Set language negotiation.
-    $language_type = LANGUAGE_TYPE_INTERFACE;
-    $edit = array(
-      "{$language_type}[enabled][language-url]" => TRUE,
-    );
-    $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));
-
-    // Configure date formats.
-    $this->drupalGet('admin/config/regional/date-time/locale');
-    $this->assertText('French', 'Configured languages appear.');
-    $edit = array(
-      'date_format_long' => 'd.m.Y - H:i',
-      'date_format_medium' => 'd.m.Y - H:i',
-      'date_format_short' => 'd.m.Y - H:i',
-    );
-    $this->drupalPost('admin/config/regional/date-time/locale/fr/edit', $edit, t('Save configuration'));
-    $this->assertText(t('Configuration saved.'), 'French date formats updated.');
-    $edit = array(
-      'date_format_long' => 'j M Y - g:ia',
-      'date_format_medium' => 'j M Y - g:ia',
-      'date_format_short' => 'j M Y - g:ia',
-    );
-    $this->drupalPost('admin/config/regional/date-time/locale/en/edit', $edit, t('Save configuration'));
-    $this->assertText(t('Configuration saved.'), 'English date formats updated.');
-
-    // Create node content.
-    $node = $this->drupalCreateNode(array('type' => 'article'));
-
-    // Configure format for the node posted date changes with the language.
-    $this->drupalGet('node/' . $node->nid);
-    $english_date = format_date($node->created, 'custom', 'j M Y');
-    $this->assertText($english_date, t('English date format appears'));
-    $this->drupalGet('fr/node/' . $node->nid);
-    $french_date = format_date($node->created, 'custom', 'd.m.Y');
-    $this->assertText($french_date, t('French date format appears'));
-  }
-}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/LanguageUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/LanguageUpgradePathTest.php
index 1291ffb..81e9676 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/LanguageUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/LanguageUpgradePathTest.php
@@ -40,7 +40,7 @@ class LanguageUpgradePathTest extends UpgradePathTestBase {
 
     // Ensure Catalan was properly upgraded to be the new default language.
     $this->assertTrue(language_default()->langcode == 'ca', t('Catalan is the default language'));
-    $languages = language_list(LANGUAGE_ALL);
+    $languages = language_list();
     foreach ($languages as $language) {
       $this->assertTrue($language->default == ($language->langcode == 'ca'), t('@language default property properly set', array('@language' => $language->name)));
     }
@@ -75,11 +75,12 @@ class LanguageUpgradePathTest extends UpgradePathTestBase {
     $this->assertRaw('<td>Chuvash</td>', 'There is a Chuvash translation of the node.');
     $this->assertLinkByHref("node/$translation_nid", 0, 'The translation table links to the Chuvash translation.');
     $this->assertRaw('<td>Catalan</td><td>n/a</td><td>Not translated</td>', 'There is no Catalan translation of this node.');
+
     // Check for node content type settings upgrade.
     $this->drupalGet('node/add/article');
-    $this->assertField('langcode', 'There is a language selector.');
+    $this->assertFieldByName('langcode');
     $this->drupalGet('node/add/page');
-    $this->assertNoField('langcode', 'There is no language selector.');
+    $this->assertNoFieldByName('langcode');
 
     // Check that the user language value was retained in both langcode and
     // preferred_langcode.
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 819df67..de17cef 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -3163,185 +3163,3 @@ function system_actions_remove_orphans() {
   actions_synchronize(TRUE);
   drupal_goto('admin/config/system/actions/manage');
 }
-
-/**
- * Display edit date format links for each language.
- */
-function system_date_format_language_overview_page() {
-  $header = array(
-    t('Language'),
-    array('data' => t('Operations'), 'colspan' => '2'),
-  );
-
-  $languages = language_list();
-  foreach ($languages as $langcode => $language) {
-    $row = array();
-    $row[] = $language->name;
-    $row[] = l(t('edit'), 'admin/config/regional/date-time/locale/' . $langcode . '/edit');
-    $row[] = l(t('reset'), 'admin/config/regional/date-time/locale/' . $langcode . '/reset');
-    $rows[] = $row;
-  }
-
-  return theme('table', array('header' => $header, 'rows' => $rows));
-}
-
-/**
- * Provide date localization configuration options to users.
- */
-function system_date_format_localize_form($form, &$form_state, $langcode) {
-  // Display the current language name.
-  $form['language'] = array(
-    '#type' => 'item',
-    '#title' => t('Language'),
-    '#markup' => language_load($langcode)->name,
-    '#weight' => -10,
-  );
-  $form['langcode'] = array(
-    '#type' => 'value',
-    '#value' => $langcode,
-  );
-
-  // Get list of date format types.
-  $types = system_get_date_types();
-
-  // Get list of available formats.
-  $formats = system_get_date_formats();
-  $choices = array();
-  foreach ($formats as $type => $list) {
-    foreach ($list as $f => $format) {
-      $choices[$f] = format_date(REQUEST_TIME, 'custom', $f);
-    }
-  }
-  reset($formats);
-
-  // Get configured formats for each language.
-  $locale_formats = system_date_format_locale($langcode);
-  // Display a form field for each format type.
-  foreach ($types as $type => $type_info) {
-    if (!empty($locale_formats) && in_array($type, array_keys($locale_formats))) {
-      $default = $locale_formats[$type];
-    }
-    else {
-      $default = variable_get('date_format_' . $type, key($formats));
-    }
-
-    // Show date format select list.
-    $form['date_formats']['date_format_' . $type] = array(
-      '#type' => 'select',
-      '#title' => check_plain($type_info['title']),
-      '#attributes' => array('class' => array('date-format')),
-      '#default_value' => (isset($choices[$default]) ? $default : 'custom'),
-      '#options' => $choices,
-    );
-  }
-
-  $form['actions'] = array('#type' => 'actions');
-  $form['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save configuration'),
-  );
-
-  return $form;
-}
-
-/**
- * Submit handler for configuring localized date formats on the locale_date_format_form.
- */
-function system_date_format_localize_form_submit($form, &$form_state) {
-  $langcode = $form_state['values']['langcode'];
-
-  // Get list of date format types.
-  $types = system_get_date_types();
-  foreach ($types as $type => $type_info) {
-    $format = $form_state['values']['date_format_' . $type];
-    if ($format == 'custom') {
-      $format = $form_state['values']['date_format_' . $type . '_custom'];
-    }
-    system_date_format_localize_form_save($langcode, $type, $format);
-  }
-  drupal_set_message(t('Configuration saved.'));
-  $form_state['redirect'] = 'admin/config/regional/date-time/locale';
-}
-
-/**
- * Returns HTML for a locale date format form.
- *
- * @param $variables
- *   An associative array containing:
- *   - form: A render element representing the form.
- *
- * @ingroup themeable
- */
-function theme_system_date_format_localize_form($variables) {
-  $form = $variables['form'];
-  $header = array(
-    t('Date type'),
-    t('Format'),
-  );
-
-  foreach (element_children($form['date_formats']) as $key) {
-    $row = array();
-    $row[] = $form['date_formats'][$key]['#title'];
-    unset($form['date_formats'][$key]['#title']);
-    $row[] = array('data' => drupal_render($form['date_formats'][$key]));
-    $rows[] = $row;
-  }
-
-  $output = drupal_render($form['language']);
-  $output .= theme('table', array('header' => $header, 'rows' => $rows));
-  $output .= drupal_render_children($form);
-
-  return $output;
-}
-
-/**
- * Reset locale specific date formats to the global defaults.
- *
- * @param $langcode
- *   Language code, e.g. 'en'.
- */
-function system_date_format_localize_reset_form($form, &$form_state, $langcode) {
-  $form['langcode'] = array('#type' => 'value', '#value' => $langcode);
-  return confirm_form($form,
-    t('Are you sure you want to reset the date formats for %language to the global defaults?', array('%language' => language_load($langcode)->name)),
-    'admin/config/regional/date-time/locale',
-    t('Resetting will remove all localized date formats for this language. This action cannot be undone.'),
-    t('Reset'), t('Cancel'));
-}
-
-/**
- * Reset date formats for a specific language to global defaults.
- */
-function system_date_format_localize_reset_form_submit($form, &$form_state) {
-  db_delete('date_format_locale')
-    ->condition('language', $form_state['values']['langcode'])
-    ->execute();
-  $form_state['redirect'] = 'admin/config/regional/date-time/locale';
-}
-
-/**
- * Save locale specific date formats to the database.
- *
- * @param $langcode
- *   Language code, can be 2 characters, e.g. 'en' or 5 characters, e.g.
- *   'en-CA'.
- * @param $type
- *   Date format type, e.g. 'short', 'medium'.
- * @param $format
- *   The date format string.
- */
-function system_date_format_localize_form_save($langcode, $type, $format) {
-  $locale_format = array();
-  $locale_format['language'] = $langcode;
-  $locale_format['type'] = $type;
-  $locale_format['format'] = $format;
-
-  $is_existing = (bool) db_query_range('SELECT 1 FROM {date_format_locale} WHERE language = :langcode AND type = :type', 0, 1, array(':langcode' => $langcode, ':type' => $type))->fetchField();
-  if ($is_existing) {
-    $keys = array('type', 'language');
-    drupal_write_record('date_format_locale', $locale_format, $keys);
-  }
-  else {
-    drupal_write_record('date_format_locale', $locale_format);
-  }
-}
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index a104270..479ceea 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -3586,7 +3586,7 @@ function hook_date_format_types_alter(&$types) {
  * used with the associated date type -- a user has to choose a format for each
  * date type in the administrative interface. There is one exception: locale
  * initialization chooses a locale-specific format for the three core-provided
- * types (see system_get_localized_date_format() for details). If your module
+ * types (see locale_get_localized_date_format() for details). If your module
  * needs to ensure that a date type it defines has a format associated with it,
  * call @code variable_set('date_format_' . $type, $format); @endcode
  * where $type is the machine-readable name defined in hook_date_format_types(),
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index b9558e5..73236f7 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -199,9 +199,6 @@ function system_theme() {
       'render element' => 'form',
       'file' => 'system.admin.inc',
     ),
-    'system_date_format_localize_form' => array(
-      'render element' => 'form',
-    ),
   ));
 }
 
@@ -1113,36 +1110,6 @@ function system_menu() {
     'type' => MENU_CALLBACK,
     'file' => 'system.admin.inc',
   );
-
-  // Localize date formats.
-  if (module_exists('language')) {
-    $items['admin/config/regional/date-time/locale'] = array(
-      'title' => 'Localize',
-      'description' => 'Configure date formats for each locale',
-      'page callback' => 'system_date_format_language_overview_page',
-      'access arguments' => array('administer site configuration'),
-      'type' => MENU_LOCAL_TASK,
-      'weight' => -8,
-      'file' => 'system.admin.inc',
-    );
-    $items['admin/config/regional/date-time/locale/%/edit'] = array(
-      'title' => 'Localize date formats',
-      'description' => 'Configure date formats for each locale',
-      'page callback' => 'drupal_get_form',
-      'page arguments' => array('system_date_format_localize_form', 5),
-      'access arguments' => array('administer site configuration'),
-      'file' => 'system.admin.inc',
-    );
-    $items['admin/config/regional/date-time/locale/%/reset'] = array(
-      'title' => 'Reset date formats',
-      'description' => 'Reset localized date formats to global defaults',
-      'page callback' => 'drupal_get_form',
-      'page arguments' => array('system_date_format_localize_reset_form', 5),
-      'access arguments' => array('administer site configuration'),
-      'file' => 'system.admin.inc',
-    );
-  }
-
   return $items;
 }
 
@@ -2000,24 +1967,6 @@ function system_filetransfer_info() {
  * Implements hook_init().
  */
 function system_init() {
-  global $conf;
-
-  $language_interface = drupal_container()->get(LANGUAGE_TYPE_INTERFACE);
-  // For each date type (e.g. long, short), get the localized date format
-  // for the user's current language and override the default setting for it
-  // in $conf. This should happen on all pages except the date and time formats
-  // settings page, where we want to display the site default and not the
-  // localized version.
-  if (strpos(current_path(), 'admin/config/regional/date-time/formats') !== 0) {
-    $languages = array($language_interface->langcode);
-
-    // Setup appropriate date formats for this locale.
-    $formats = system_get_localized_date_format($languages);
-    foreach ($formats as $format_type => $format) {
-      $conf[$format_type] = $format;
-    }
-  }
-
   $path = drupal_get_path('module', 'system');
   // Add the CSS for this module. These aren't in system.info, because they
   // need to be in the CSS_SYSTEM group rather than the CSS_DEFAULT group.
@@ -2054,64 +2003,6 @@ function system_init() {
 }
 
 /**
- * Select locale date format details from database.
- *
- * @param $languages
- *   An array of language codes.
- *
- * @return
- *   An array of date formats.
- */
-function system_get_localized_date_format($languages) {
-  $formats = array();
-
-  // Get list of different format types.
-  $format_types = system_get_date_types();
-  $short_default = variable_get('date_format_short', 'm/d/Y - H:i');
-
-  // Loop through each language until we find one with some date formats
-  // configured.
-  foreach ($languages as $language) {
-    $date_formats = system_date_format_locale($language);
-    if (!empty($date_formats)) {
-      // We have locale-specific date formats, so check for their types. If
-      // we're missing a type, use the default setting instead.
-      foreach ($format_types as $type => $type_info) {
-        // If format exists for this language, use it.
-        if (!empty($date_formats[$type])) {
-          $formats['date_format_' . $type] = $date_formats[$type];
-        }
-        // Otherwise get default variable setting. If this is not set, default
-        // to the short format.
-        else {
-          $formats['date_format_' . $type] = variable_get('date_format_' . $type, $short_default);
-        }
-      }
-
-      // Return on the first match.
-      return $formats;
-    }
-  }
-
-  // No locale specific formats found, so use defaults.
-  $system_types = array('short', 'medium', 'long');
-  // Handle system types separately as they have defaults if no variable exists.
-  $formats['date_format_short'] = $short_default;
-  $formats['date_format_medium'] = variable_get('date_format_medium', 'D, m/d/Y - H:i');
-  $formats['date_format_long'] = variable_get('date_format_long', 'l, F j, Y - H:i');
-
-  // For non-system types, get the default setting, otherwise use the short
-  // format.
-  foreach ($format_types as $type => $type_info) {
-    if (!in_array($type, $system_types)) {
-      $formats['date_format_' . $type] = variable_get('date_format_' . $type, $short_default);
-    }
-  }
-
-  return $formats;
-}
-
-/**
  * Adds CSS and JavaScript files declared in module .info files.
  */
 function system_add_module_assets() {
diff --git a/core/modules/taxonomy/taxonomy.api.php b/core/modules/taxonomy/taxonomy.api.php
index 2ef691f..5f053fb 100644
--- a/core/modules/taxonomy/taxonomy.api.php
+++ b/core/modules/taxonomy/taxonomy.api.php
@@ -1,7 +1,5 @@
 <?php
 
-use Drupal\entity\EntityInterface;
-
 /**
  * @file
  * Hooks provided by the Taxonomy module.
@@ -239,12 +237,10 @@ function hook_taxonomy_term_delete(Drupal\taxonomy\Term $term) {
  *
  * @param $build
  *   A renderable array representing the taxonomy term content.
- * @param Drupal\taxonomy\Term $term
- *   The taxonomy term being rendered.
  *
  * @see hook_entity_view_alter()
  */
-function hook_taxonomy_term_view_alter(&$build, Drupal\taxonomy\Term $term) {
+function hook_taxonomy_term_view_alter(&$build) {
   if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
     // Change its weight.
     $build['an_additional_field']['#weight'] = -10;
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index 6697a0a..ba74a9a 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -612,7 +612,8 @@ function taxonomy_term_view(Term $term, $view_mode = 'full', $langcode = NULL) {
   $build['#attached']['css'][] = drupal_get_path('module', 'taxonomy') . '/taxonomy.css';
 
   // Allow modules to modify the structured term.
-  drupal_alter(array('taxonomy_term_view', 'entity_view'), $build, $term);
+  $type = 'taxonomy_term';
+  drupal_alter(array('taxonomy_term_view', 'entity_view'), $build, $type);
 
   return $build;
 }
diff --git a/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php b/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
index 2c2a4d2..b8dcc3d 100644
--- a/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
+++ b/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
@@ -42,7 +42,8 @@ class TranslationTest extends WebTestBase {
     // Set "Basic page" content type to use multilingual support with
     // translation.
     $this->drupalGet('admin/structure/types/manage/page');
-    $edit = array('node_type_language_hidden' => FALSE, 'node_type_language_translation_enabled' => TRUE);
+    $edit = array();
+    $edit['node_type_language'] = TRANSLATION_ENABLED;
     $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
     $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.'));
 
@@ -221,7 +222,7 @@ class TranslationTest extends WebTestBase {
     // Disable translation support to check that the language switcher is left
     // untouched only for new nodes.
     $this->drupalLogin($this->admin_user);
-    $edit = array('node_type_language_hidden' => TRUE, 'node_type_language_translation_enabled' => FALSE);
+    $edit = array('node_type_language' => 0);
     $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
     $this->drupalLogin($this->translator);
 
diff --git a/core/modules/translation/translation.js b/core/modules/translation/translation.js
index 7bc1c21..d4b9f53 100644
--- a/core/modules/translation/translation.js
+++ b/core/modules/translation/translation.js
@@ -4,10 +4,10 @@
 
 Drupal.behaviors.TranslationEnable = {
   attach: function (context) {
-    $('#edit-node-type-language-default, #edit-node-type-language-hidden', context).change(function(context) {
+    $('#edit-node-type-language-default, #edit-node-type-language-locked', context).change(function(context) {
       var default_language = $('#edit-node-type-language-default').val();
 
-      if ((default_language == 'und' || default_language == 'zxx' || default_language == 'mul') && $('#edit-node-type-language-hidden').attr('checked')) {
+      if ((default_language == 'und' || default_language == 'zxx' || default_language == 'mul') && $('#edit-node-type-language-locked').attr('checked')) {
         $('.form-item-node-type-language-translation-enabled').hide();
         $('#edit-node-type-language-translation-enabled').removeAttr('checked');
       } else {
diff --git a/core/modules/translation/translation.module b/core/modules/translation/translation.module
index 4edf541..b2c0635 100644
--- a/core/modules/translation/translation.module
+++ b/core/modules/translation/translation.module
@@ -22,6 +22,11 @@
 use Drupal\node\Node;
 
 /**
+ * Identifies a content type which has translation support enabled.
+ */
+const TRANSLATION_ENABLED = 2;
+
+/**
  * Implements hook_help().
  */
 function translation_help($path, $arg) {
@@ -114,34 +119,11 @@ function translation_permission() {
  * Implements hook_form_FORM_ID_alter() for node_type_form().
  */
 function translation_form_node_type_form_alter(&$form, &$form_state) {
-  // Hide form element if default language is a constant.
-  // TODO: When form #states allows OR values change this to use form #states.
-  $form['#attached']['js'] = array(
-    drupal_get_path('module', 'translation') . '/translation.js',
-  );
   // Add translation option to content type form.
-  $form['language']['node_type_language_translation_enabled'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Enable translation'),
-    '#default_value' => variable_get('node_type_language_translation_enabled_' . $form['#node_type']->type, FALSE),
-    '#element_validate' => array('translation_node_type_language_translation_enabled_validate'),
-    '#prefix' => "<label class='form-item-node-type-language-translation-enabled'>" . t('Translation') . "</label>",
-  );
-}
-
-/**
- * Checks if translation can be enabled.
- *
- * If language is set to one of the special languages
- * and language selector is not hidden, translation cannot be enabled.
- */
-function translation_node_type_language_translation_enabled_validate($element, &$form_state, $form) {
-  if (language_is_locked($form_state['values']['node_type_language_default']) && $form_state['values']['node_type_language_hidden'] && $form_state['values']['node_type_language_translation_enabled']) {
-    foreach (language_locked_languages() as $language) {
-      $locked_languages[] = $language->name;
-    }
-    form_set_error('node_type_language_translation_enabled', t('Translation is not supported if language is always one of: @locked_languages', array('@locked_languages' => implode(", ", $locked_languages))));
-  }
+  $form['workflow']['node_type_language']['#type'] = 'radios';
+  $form['workflow']['node_type_language']['#options'] = array(t('Disabled'), t('Enabled'), TRANSLATION_ENABLED => t('Enabled, with translation'));
+  // Description based on text from node.module.
+  $form['workflow']['node_type_language']['#description'] = t('Add a language selection field to the editing form, allowing you to select from one of the <a href="@languages">enabled languages</a>. You can also turn on translation for this content type, which lets you have content translated to any of the installed languages. If disabled, new posts are saved with the default language. Existing content will not be affected by changing this option.', array('@languages' => url('admin/config/regional/language')));
 }
 
 /**
@@ -162,9 +144,9 @@ function translation_form_node_form_alter(&$form, &$form_state) {
       $form['langcode']['#disabled'] = TRUE;
     }
     elseif (!empty($node->nid) && !empty($node->tnid)) {
-      // Disable languages for existing translations, so it is not possible
-      // to switch this node to some language which is already in the
-      // translation set. Also remove the language neutral option.
+      // Disable languages for existing translations, so it is not possible to switch this
+      // node to some language which is already in the translation set. Also remove the
+      // language neutral option.
       unset($form['langcode']['#options'][LANGUAGE_NOT_SPECIFIED]);
       foreach (translation_node_get_translations($node->tnid) as $langcode => $translation) {
         if ($translation->nid != $node->nid) {
@@ -183,7 +165,7 @@ function translation_form_node_form_alter(&$form, &$form_state) {
         '#weight' => 30,
       );
       if ($node->tnid == $node->nid) {
-        // This is the source node of the translation.
+        // This is the source node of the translation
         $form['translation']['retranslate'] = array(
           '#type' => 'checkbox',
           '#title' => t('Flag translations as outdated'),
@@ -215,7 +197,7 @@ function translation_node_view(Node $node, $view_mode) {
   // If the site has no translations or is not multilingual we have no content
   // translation links to display.
   if (isset($node->tnid) && language_multilingual() && $translations = translation_node_get_translations($node->tnid)) {
-    $languages = language_list(LANGUAGE_ALL);
+    $languages = language_list();
 
     // There might be a language provider enabled defining custom language
     // switch links which need to be taken into account while generating the
@@ -230,6 +212,7 @@ function translation_node_view(Node $node, $view_mode) {
     foreach ($translations as $langcode => $translation) {
       // Do not show links to the same node or to unpublished translations.
       if ($translation->status && isset($languages[$langcode]) && $langcode != $node->langcode) {
+        $language = $languages[$langcode];
         $key = "translation_$langcode";
 
         if (isset($custom_links->links[$langcode])) {
@@ -238,8 +221,8 @@ function translation_node_view(Node $node, $view_mode) {
         else {
           $links[$key] = array(
             'href' => "node/{$translation->nid}",
-            'title' => language_name($langcode),
-            'language' => $languages[$langcode],
+            'title' => $language->name,
+            'language' => $language,
           );
         }
 
@@ -384,7 +367,7 @@ function translation_node_validate(Node $node, $form) {
   if (translation_supported_type($node->type) && (!empty($node->tnid) || !empty($form['#node']->translation_source->nid))) {
     $tnid = !empty($node->tnid) ? $node->tnid : $form['#node']->translation_source->nid;
     $translations = translation_node_get_translations($tnid);
-    if (isset($translations[$node->langcode]) && $translations[$node->langcode]->nid != $node->nid) {
+    if (isset($translations[$node->langcode]) && $translations[$node->langcode]->nid != $node->nid ) {
       form_set_error('langcode', t('There is already a translation in this language.'));
     }
   }
@@ -478,7 +461,7 @@ function translation_node_get_translations($tnid) {
  *   TRUE if translation is supported, and FALSE if not.
  */
 function translation_supported_type($type) {
-  return variable_get('node_type_language_translation_enabled_' . $type, FALSE);
+  return variable_get('node_type_language_' . $type, 0) == TRANSLATION_ENABLED;
 }
 
 /**
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserEntityCallbacksTest.php b/core/modules/user/lib/Drupal/user/Tests/UserEntityCallbacksTest.php
index dc85ade..a8fd35b 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserEntityCallbacksTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserEntityCallbacksTest.php
@@ -25,19 +25,19 @@ class UserEntityCallbacksTest extends WebTestBase {
     parent::setUp('user');
 
     $this->account = $this->drupalCreateUser();
-    $this->anonymous = entity_create('user', (array) drupal_anonymous_user());
+    $this->anonymous = drupal_anonymous_user();
   }
 
   /**
    * Test label callback.
    */
   function testLabelCallback() {
-    $this->assertEqual($this->account->label(), $this->account->name, t('The username should be used as label'));
+    $this->assertEqual(entity_label('user', $this->account), $this->account->name, t('The username should be used as label'));
 
     // Setup a random anonymous name to be sure the name is used.
     $name = $this->randomName();
     variable_set('anonymous', $name);
-    $this->assertEqual($this->anonymous->label(), $name, t('The variable anonymous should be used for name of uid 0'));
+    $this->assertEqual(entity_label('user', $this->anonymous), $name, t('The variable anonymous should be used for name of uid 0'));
   }
 
   /**
diff --git a/core/modules/user/user.api.php b/core/modules/user/user.api.php
index 98b9887..8c7286e 100644
--- a/core/modules/user/user.api.php
+++ b/core/modules/user/user.api.php
@@ -1,7 +1,5 @@
 <?php
 
-use Drupal\entity\EntityInterface;
-
 /**
  * @file
  * Hooks provided by the User module.
@@ -361,13 +359,11 @@ function hook_user_view($account, $view_mode, $langcode) {
  *
  * @param $build
  *   A renderable array representing the user.
- * @param Drupal\user\User $account
- *   The user account being rendered.
  *
  * @see user_view()
  * @see hook_entity_view_alter()
  */
-function hook_user_view_alter(&$build, Drupal\user\User $account) {
+function hook_user_view_alter(&$build) {
   // Check for the existence of a field added by another module.
   if (isset($build['an_additional_field'])) {
     // Change its weight.
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 12cb7d6..6f21c5c 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -186,9 +186,6 @@ function user_uri($user) {
 /**
  * Entity label callback.
  *
- * This label callback has langcode for security reasons. The username is the
- * visual identifier for a user and needs to be consistent in all languages.
- *
  * @param $entity_type
  *   The entity type.
  * @param $entity
@@ -2388,7 +2385,8 @@ function user_view($account, $view_mode = 'full', $langcode = NULL) {
   );
 
   // Allow modules to modify the structured user.
-  drupal_alter(array('user_view', 'entity_view'), $build, $account);
+  $type = 'user';
+  drupal_alter(array('user_view', 'entity_view'), $build, $type);
 
   return $build;
 }
@@ -2419,7 +2417,7 @@ function user_build_content($account, $view_mode = 'full', $langcode = NULL) {
 
   // Populate $account->content with a render() array.
   module_invoke_all('user_view', $account, $view_mode, $langcode);
-  module_invoke_all('entity_view', $account, $view_mode, $langcode);
+  module_invoke_all('entity_view', $account, 'user', $view_mode, $langcode);
 }
 
 /**
diff --git a/core/vendor/Twig/AUTHORS b/core/vendor/Twig/AUTHORS
deleted file mode 100644
index eb5db05..0000000
--- a/core/vendor/Twig/AUTHORS
+++ /dev/null
@@ -1,9 +0,0 @@
-Twig is written and maintained by the Twig Team:
-
-Lead Developer:
-
-- Fabien Potencier <fabien.potencier@symfony-project.org>
-
-Project Founder:
-
-- Armin Ronacher <armin.ronacher@active-4.com>
diff --git a/core/vendor/Twig/Autoloader.php b/core/vendor/Twig/Autoloader.php
deleted file mode 100644
index 0f62884..0000000
--- a/core/vendor/Twig/Autoloader.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Autoloads Twig classes.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Autoloader
-{
-    /**
-     * Registers Twig_Autoloader as an SPL autoloader.
-     */
-    static public function register()
-    {
-        ini_set('unserialize_callback_func', 'spl_autoload_call');
-        spl_autoload_register(array(new self, 'autoload'));
-    }
-
-    /**
-     * Handles autoloading of classes.
-     *
-     * @param string $class A class name.
-     *
-     * @return boolean Returns true if the class has been loaded
-     */
-    static public function autoload($class)
-    {
-        if (0 !== strpos($class, 'Twig')) {
-            return;
-        }
-
-        if (is_file($file = dirname(__FILE__).'/../'.str_replace(array('_', "\0"), array('/', ''), $class).'.php')) {
-            require $file;
-        }
-    }
-}
diff --git a/core/vendor/Twig/Compiler.php b/core/vendor/Twig/Compiler.php
deleted file mode 100644
index 5cd1b31..0000000
--- a/core/vendor/Twig/Compiler.php
+++ /dev/null
@@ -1,250 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Compiles a node to PHP code.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Compiler implements Twig_CompilerInterface
-{
-    protected $lastLine;
-    protected $source;
-    protected $indentation;
-    protected $env;
-    protected $debugInfo;
-    protected $sourceOffset;
-    protected $sourceLine;
-
-    /**
-     * Constructor.
-     *
-     * @param Twig_Environment $env The twig environment instance
-     */
-    public function __construct(Twig_Environment $env)
-    {
-        $this->env = $env;
-        $this->debugInfo = array();
-    }
-
-    /**
-     * Returns the environment instance related to this compiler.
-     *
-     * @return Twig_Environment The environment instance
-     */
-    public function getEnvironment()
-    {
-        return $this->env;
-    }
-
-    /**
-     * Gets the current PHP code after compilation.
-     *
-     * @return string The PHP code
-     */
-    public function getSource()
-    {
-        return $this->source;
-    }
-
-    /**
-     * Compiles a node.
-     *
-     * @param Twig_NodeInterface $node        The node to compile
-     * @param integer            $indentation The current indentation
-     *
-     * @return Twig_Compiler The current compiler instance
-     */
-    public function compile(Twig_NodeInterface $node, $indentation = 0)
-    {
-        $this->lastLine = null;
-        $this->source = '';
-        $this->sourceOffset = 0;
-        $this->sourceLine = 0;
-        $this->indentation = $indentation;
-
-        $node->compile($this);
-
-        return $this;
-    }
-
-    public function subcompile(Twig_NodeInterface $node, $raw = true)
-    {
-        if (false === $raw) {
-            $this->addIndentation();
-        }
-
-        $node->compile($this);
-
-        return $this;
-    }
-
-    /**
-     * Adds a raw string to the compiled code.
-     *
-     * @param string $string The string
-     *
-     * @return Twig_Compiler The current compiler instance
-     */
-    public function raw($string)
-    {
-        $this->source .= $string;
-
-        return $this;
-    }
-
-    /**
-     * Writes a string to the compiled code by adding indentation.
-     *
-     * @return Twig_Compiler The current compiler instance
-     */
-    public function write()
-    {
-        $strings = func_get_args();
-        foreach ($strings as $string) {
-            $this->addIndentation();
-            $this->source .= $string;
-        }
-
-        return $this;
-    }
-
-    public function addIndentation()
-    {
-        $this->source .= str_repeat(' ', $this->indentation * 4);
-
-        return $this;
-    }
-
-    /**
-     * Adds a quoted string to the compiled code.
-     *
-     * @param string $value The string
-     *
-     * @return Twig_Compiler The current compiler instance
-     */
-    public function string($value)
-    {
-        $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\"));
-
-        return $this;
-    }
-
-    /**
-     * Returns a PHP representation of a given value.
-     *
-     * @param mixed $value The value to convert
-     *
-     * @return Twig_Compiler The current compiler instance
-     */
-    public function repr($value)
-    {
-        if (is_int($value) || is_float($value)) {
-            if (false !== $locale = setlocale(LC_NUMERIC, 0)) {
-                setlocale(LC_NUMERIC, 'C');
-            }
-
-            $this->raw($value);
-
-            if (false !== $locale) {
-                setlocale(LC_NUMERIC, $locale);
-            }
-        } elseif (null === $value) {
-            $this->raw('null');
-        } elseif (is_bool($value)) {
-            $this->raw($value ? 'true' : 'false');
-        } elseif (is_array($value)) {
-            $this->raw('array(');
-            $i = 0;
-            foreach ($value as $key => $value) {
-                if ($i++) {
-                    $this->raw(', ');
-                }
-                $this->repr($key);
-                $this->raw(' => ');
-                $this->repr($value);
-            }
-            $this->raw(')');
-        } else {
-            $this->string($value);
-        }
-
-        return $this;
-    }
-
-    /**
-     * Adds debugging information.
-     *
-     * @param Twig_NodeInterface $node The related twig node
-     *
-     * @return Twig_Compiler The current compiler instance
-     */
-    public function addDebugInfo(Twig_NodeInterface $node)
-    {
-        if ($node->getLine() != $this->lastLine) {
-            // when mbstring.func_overload is set to 2
-            // mb_substr_count() replaces substr_count()
-            // but they have different signatures!
-            if (((int) ini_get('mbstring.func_overload')) & 2) {
-                // this is much slower than the "right" version
-                $this->sourceLine += mb_substr_count(mb_substr($this->source, $this->sourceOffset), "\n");
-            } else {
-                $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset);
-            }
-            $this->sourceOffset = strlen($this->source);
-            $this->debugInfo[$this->sourceLine] = $node->getLine();
-
-            $this->lastLine = $node->getLine();
-            $this->write("// line {$node->getLine()}\n");
-        }
-
-        return $this;
-    }
-
-    public function getDebugInfo()
-    {
-        return $this->debugInfo;
-    }
-
-    /**
-     * Indents the generated code.
-     *
-     * @param integer $step The number of indentation to add
-     *
-     * @return Twig_Compiler The current compiler instance
-     */
-    public function indent($step = 1)
-    {
-        $this->indentation += $step;
-
-        return $this;
-    }
-
-    /**
-     * Outdents the generated code.
-     *
-     * @param integer $step The number of indentation to remove
-     *
-     * @return Twig_Compiler The current compiler instance
-     */
-    public function outdent($step = 1)
-    {
-        $this->indentation -= $step;
-
-        if ($this->indentation < 0) {
-            throw new Twig_Error('Unable to call outdent() as the indentation would become negative');
-        }
-
-        return $this;
-    }
-}
diff --git a/core/vendor/Twig/CompilerInterface.php b/core/vendor/Twig/CompilerInterface.php
deleted file mode 100644
index f861381..0000000
--- a/core/vendor/Twig/CompilerInterface.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by compiler classes.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_CompilerInterface
-{
-    /**
-     * Compiles a node.
-     *
-     * @param Twig_NodeInterface $node The node to compile
-     *
-     * @return Twig_CompilerInterface The current compiler instance
-     */
-    function compile(Twig_NodeInterface $node);
-
-    /**
-     * Gets the current PHP code after compilation.
-     *
-     * @return string The PHP code
-     */
-    function getSource();
-}
diff --git a/core/vendor/Twig/Environment.php b/core/vendor/Twig/Environment.php
deleted file mode 100644
index 333d667..0000000
--- a/core/vendor/Twig/Environment.php
+++ /dev/null
@@ -1,1105 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Stores the Twig configuration.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Environment
-{
-    const VERSION = '1.8.3-DEV';
-
-    protected $charset;
-    protected $loader;
-    protected $debug;
-    protected $autoReload;
-    protected $cache;
-    protected $lexer;
-    protected $parser;
-    protected $compiler;
-    protected $baseTemplateClass;
-    protected $extensions;
-    protected $parsers;
-    protected $visitors;
-    protected $filters;
-    protected $tests;
-    protected $functions;
-    protected $globals;
-    protected $runtimeInitialized;
-    protected $loadedTemplates;
-    protected $strictVariables;
-    protected $unaryOperators;
-    protected $binaryOperators;
-    protected $templateClassPrefix = '__TwigTemplate_';
-    protected $functionCallbacks;
-    protected $filterCallbacks;
-    protected $staging;
-
-    /**
-     * Constructor.
-     *
-     * Available options:
-     *
-     *  * debug: When set to true, it automatically set "auto_reload" to true as
-     *           well (default to false).
-     *
-     *  * charset: The charset used by the templates (default to utf-8).
-     *
-     *  * base_template_class: The base template class to use for generated
-     *                         templates (default to Twig_Template).
-     *
-     *  * cache: An absolute path where to store the compiled templates, or
-     *           false to disable compilation cache (default).
-     *
-     *  * auto_reload: Whether to reload the template is the original source changed.
-     *                 If you don't provide the auto_reload option, it will be
-     *                 determined automatically base on the debug value.
-     *
-     *  * strict_variables: Whether to ignore invalid variables in templates
-     *                      (default to false).
-     *
-     *  * autoescape: Whether to enable auto-escaping (default to html):
-     *                  * false: disable auto-escaping
-     *                  * true: equivalent to html
-     *                  * html, js: set the autoescaping to one of the supported strategies
-     *                  * PHP callback: a PHP callback that returns an escaping strategy based on the template "filename"
-     *
-     *  * optimizations: A flag that indicates which optimizations to apply
-     *                   (default to -1 which means that all optimizations are enabled;
-     *                   set it to 0 to disable).
-     *
-     * @param Twig_LoaderInterface $loader  A Twig_LoaderInterface instance
-     * @param array                $options An array of options
-     */
-    public function __construct(Twig_LoaderInterface $loader = null, $options = array())
-    {
-        if (null !== $loader) {
-            $this->setLoader($loader);
-        }
-
-        $options = array_merge(array(
-            'debug'               => false,
-            'charset'             => 'UTF-8',
-            'base_template_class' => 'Twig_Template',
-            'strict_variables'    => false,
-            'autoescape'          => 'html',
-            'cache'               => false,
-            'auto_reload'         => null,
-            'optimizations'       => -1,
-        ), $options);
-
-        $this->debug              = (bool) $options['debug'];
-        $this->charset            = $options['charset'];
-        $this->baseTemplateClass  = $options['base_template_class'];
-        $this->autoReload         = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload'];
-        $this->extensions         = array(
-            'core'      => new Twig_Extension_Core(),
-            'escaper'   => new Twig_Extension_Escaper($options['autoescape']),
-            'optimizer' => new Twig_Extension_Optimizer($options['optimizations']),
-        );
-        $this->strictVariables    = (bool) $options['strict_variables'];
-        $this->runtimeInitialized = false;
-        $this->setCache($options['cache']);
-        $this->functionCallbacks = array();
-        $this->filterCallbacks = array();
-        $this->staging = array(
-            'functions'     => array(),
-            'filters'       => array(),
-            'tests'         => array(),
-            'token_parsers' => array(),
-            'visitors'      => array(),
-            'globals'       => array(),
-        );
-    }
-
-    /**
-     * Gets the base template class for compiled templates.
-     *
-     * @return string The base template class name
-     */
-    public function getBaseTemplateClass()
-    {
-        return $this->baseTemplateClass;
-    }
-
-    /**
-     * Sets the base template class for compiled templates.
-     *
-     * @param string $class The base template class name
-     */
-    public function setBaseTemplateClass($class)
-    {
-        $this->baseTemplateClass = $class;
-    }
-
-    /**
-     * Enables debugging mode.
-     */
-    public function enableDebug()
-    {
-        $this->debug = true;
-    }
-
-    /**
-     * Disables debugging mode.
-     */
-    public function disableDebug()
-    {
-        $this->debug = false;
-    }
-
-    /**
-     * Checks if debug mode is enabled.
-     *
-     * @return Boolean true if debug mode is enabled, false otherwise
-     */
-    public function isDebug()
-    {
-        return $this->debug;
-    }
-
-    /**
-     * Enables the auto_reload option.
-     */
-    public function enableAutoReload()
-    {
-        $this->autoReload = true;
-    }
-
-    /**
-     * Disables the auto_reload option.
-     */
-    public function disableAutoReload()
-    {
-        $this->autoReload = false;
-    }
-
-    /**
-     * Checks if the auto_reload option is enabled.
-     *
-     * @return Boolean true if auto_reload is enabled, false otherwise
-     */
-    public function isAutoReload()
-    {
-        return $this->autoReload;
-    }
-
-    /**
-     * Enables the strict_variables option.
-     */
-    public function enableStrictVariables()
-    {
-        $this->strictVariables = true;
-    }
-
-    /**
-     * Disables the strict_variables option.
-     */
-    public function disableStrictVariables()
-    {
-        $this->strictVariables = false;
-    }
-
-    /**
-     * Checks if the strict_variables option is enabled.
-     *
-     * @return Boolean true if strict_variables is enabled, false otherwise
-     */
-    public function isStrictVariables()
-    {
-        return $this->strictVariables;
-    }
-
-    /**
-     * Gets the cache directory or false if cache is disabled.
-     *
-     * @return string|false
-     */
-    public function getCache()
-    {
-        return $this->cache;
-    }
-
-     /**
-      * Sets the cache directory or false if cache is disabled.
-      *
-      * @param string|false $cache The absolute path to the compiled templates,
-      *                            or false to disable cache
-      */
-    public function setCache($cache)
-    {
-        $this->cache = $cache ? $cache : false;
-    }
-
-    /**
-     * Gets the cache filename for a given template.
-     *
-     * @param string $name The template name
-     *
-     * @return string The cache file name
-     */
-    public function getCacheFilename($name)
-    {
-        if (false === $this->cache) {
-            return false;
-        }
-
-        $class = substr($this->getTemplateClass($name), strlen($this->templateClassPrefix));
-
-        return $this->getCache().'/'.substr($class, 0, 2).'/'.substr($class, 2, 2).'/'.substr($class, 4).'.php';
-    }
-
-    /**
-     * Gets the template class associated with the given string.
-     *
-     * @param string  $name  The name for which to calculate the template class name
-     * @param integer $index The index if it is an embedded template
-     *
-     * @return string The template class name
-     */
-    public function getTemplateClass($name, $index = null)
-    {
-        return $this->templateClassPrefix.md5($this->loader->getCacheKey($name)).(null === $index ? '' : '_'.$index);
-    }
-
-    /**
-     * Gets the template class prefix.
-     *
-     * @return string The template class prefix
-     */
-    public function getTemplateClassPrefix()
-    {
-        return $this->templateClassPrefix;
-    }
-
-    /**
-     * Renders a template.
-     *
-     * @param string $name    The template name
-     * @param array  $context An array of parameters to pass to the template
-     *
-     * @return string The rendered template
-     */
-    public function render($name, array $context = array())
-    {
-        return $this->loadTemplate($name)->render($context);
-    }
-
-    /**
-     * Displays a template.
-     *
-     * @param string $name    The template name
-     * @param array  $context An array of parameters to pass to the template
-     */
-    public function display($name, array $context = array())
-    {
-        $this->loadTemplate($name)->display($context);
-    }
-
-    /**
-     * Loads a template by name.
-     *
-     * @param string  $name  The template name
-     * @param integer $index The index if it is an embedded template
-     *
-     * @return Twig_TemplateInterface A template instance representing the given template name
-     */
-    public function loadTemplate($name, $index = null)
-    {
-        $cls = $this->getTemplateClass($name, $index);
-
-        if (isset($this->loadedTemplates[$cls])) {
-            return $this->loadedTemplates[$cls];
-        }
-
-        if (!class_exists($cls, false)) {
-            if (false === $cache = $this->getCacheFilename($name)) {
-                eval('?>'.$this->compileSource($this->loader->getSource($name), $name));
-            } else {
-                if (!is_file($cache) || ($this->isAutoReload() && !$this->isTemplateFresh($name, filemtime($cache)))) {
-                    $this->writeCacheFile($cache, $this->compileSource($this->loader->getSource($name), $name));
-                }
-
-                require_once $cache;
-            }
-        }
-
-        if (!$this->runtimeInitialized) {
-            $this->initRuntime();
-        }
-
-        return $this->loadedTemplates[$cls] = new $cls($this);
-    }
-
-    /**
-     * Returns true if the template is still fresh.
-     *
-     * Besides checking the loader for freshness information,
-     * this method also checks if the enabled extensions have
-     * not changed.
-     *
-     * @param string    $name The template name
-     * @param timestamp $time The last modification time of the cached template
-     *
-     * @return Boolean true if the template is fresh, false otherwise
-     */
-    public function isTemplateFresh($name, $time)
-    {
-        foreach ($this->extensions as $extension) {
-            $r = new ReflectionObject($extension);
-            if (filemtime($r->getFileName()) > $time) {
-                return false;
-            }
-        }
-
-        return $this->loader->isFresh($name, $time);
-    }
-
-    public function resolveTemplate($names)
-    {
-        if (!is_array($names)) {
-            $names = array($names);
-        }
-
-        foreach ($names as $name) {
-            if ($name instanceof Twig_Template) {
-                return $name;
-            }
-
-            try {
-                return $this->loadTemplate($name);
-            } catch (Twig_Error_Loader $e) {
-            }
-        }
-
-        if (1 === count($names)) {
-            throw $e;
-        }
-
-        throw new Twig_Error_Loader(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names)));
-    }
-
-    /**
-     * Clears the internal template cache.
-     */
-    public function clearTemplateCache()
-    {
-        $this->loadedTemplates = array();
-    }
-
-    /**
-     * Clears the template cache files on the filesystem.
-     */
-    public function clearCacheFiles()
-    {
-        if (false === $this->cache) {
-            return;
-        }
-
-        foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->cache), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
-            if ($file->isFile()) {
-                @unlink($file->getPathname());
-            }
-        }
-    }
-
-    /**
-     * Gets the Lexer instance.
-     *
-     * @return Twig_LexerInterface A Twig_LexerInterface instance
-     */
-    public function getLexer()
-    {
-        if (null === $this->lexer) {
-            $this->lexer = new Twig_Lexer($this);
-        }
-
-        return $this->lexer;
-    }
-
-    /**
-     * Sets the Lexer instance.
-     *
-     * @param Twig_LexerInterface A Twig_LexerInterface instance
-     */
-    public function setLexer(Twig_LexerInterface $lexer)
-    {
-        $this->lexer = $lexer;
-    }
-
-    /**
-     * Tokenizes a source code.
-     *
-     * @param string $source The template source code
-     * @param string $name   The template name
-     *
-     * @return Twig_TokenStream A Twig_TokenStream instance
-     */
-    public function tokenize($source, $name = null)
-    {
-        return $this->getLexer()->tokenize($source, $name);
-    }
-
-    /**
-     * Gets the Parser instance.
-     *
-     * @return Twig_ParserInterface A Twig_ParserInterface instance
-     */
-    public function getParser()
-    {
-        if (null === $this->parser) {
-            $this->parser = new Twig_Parser($this);
-        }
-
-        return $this->parser;
-    }
-
-    /**
-     * Sets the Parser instance.
-     *
-     * @param Twig_ParserInterface A Twig_ParserInterface instance
-     */
-    public function setParser(Twig_ParserInterface $parser)
-    {
-        $this->parser = $parser;
-    }
-
-    /**
-     * Parses a token stream.
-     *
-     * @param Twig_TokenStream $tokens A Twig_TokenStream instance
-     *
-     * @return Twig_Node_Module A Node tree
-     */
-    public function parse(Twig_TokenStream $tokens)
-    {
-        return $this->getParser()->parse($tokens);
-    }
-
-    /**
-     * Gets the Compiler instance.
-     *
-     * @return Twig_CompilerInterface A Twig_CompilerInterface instance
-     */
-    public function getCompiler()
-    {
-        if (null === $this->compiler) {
-            $this->compiler = new Twig_Compiler($this);
-        }
-
-        return $this->compiler;
-    }
-
-    /**
-     * Sets the Compiler instance.
-     *
-     * @param Twig_CompilerInterface $compiler A Twig_CompilerInterface instance
-     */
-    public function setCompiler(Twig_CompilerInterface $compiler)
-    {
-        $this->compiler = $compiler;
-    }
-
-    /**
-     * Compiles a Node.
-     *
-     * @param Twig_NodeInterface $node A Twig_NodeInterface instance
-     *
-     * @return string The compiled PHP source code
-     */
-    public function compile(Twig_NodeInterface $node)
-    {
-        return $this->getCompiler()->compile($node)->getSource();
-    }
-
-    /**
-     * Compiles a template source code.
-     *
-     * @param string $source The template source code
-     * @param string $name   The template name
-     *
-     * @return string The compiled PHP source code
-     */
-    public function compileSource($source, $name = null)
-    {
-        try {
-            return $this->compile($this->parse($this->tokenize($source, $name)));
-        } catch (Twig_Error $e) {
-            $e->setTemplateFile($name);
-            throw $e;
-        } catch (Exception $e) {
-            throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $name, $e);
-        }
-    }
-
-    /**
-     * Sets the Loader instance.
-     *
-     * @param Twig_LoaderInterface $loader A Twig_LoaderInterface instance
-     */
-    public function setLoader(Twig_LoaderInterface $loader)
-    {
-        $this->loader = $loader;
-    }
-
-    /**
-     * Gets the Loader instance.
-     *
-     * @return Twig_LoaderInterface A Twig_LoaderInterface instance
-     */
-    public function getLoader()
-    {
-        return $this->loader;
-    }
-
-    /**
-     * Sets the default template charset.
-     *
-     * @param string $charset The default charset
-     */
-    public function setCharset($charset)
-    {
-        $this->charset = $charset;
-    }
-
-    /**
-     * Gets the default template charset.
-     *
-     * @return string The default charset
-     */
-    public function getCharset()
-    {
-        return $this->charset;
-    }
-
-    /**
-     * Initializes the runtime environment.
-     */
-    public function initRuntime()
-    {
-        $this->runtimeInitialized = true;
-
-        foreach ($this->getExtensions() as $extension) {
-            $extension->initRuntime($this);
-        }
-    }
-
-    /**
-     * Returns true if the given extension is registered.
-     *
-     * @param string $name The extension name
-     *
-     * @return Boolean Whether the extension is registered or not
-     */
-    public function hasExtension($name)
-    {
-        return isset($this->extensions[$name]);
-    }
-
-    /**
-     * Gets an extension by name.
-     *
-     * @param string $name The extension name
-     *
-     * @return Twig_ExtensionInterface A Twig_ExtensionInterface instance
-     */
-    public function getExtension($name)
-    {
-        if (!isset($this->extensions[$name])) {
-            throw new Twig_Error_Runtime(sprintf('The "%s" extension is not enabled.', $name));
-        }
-
-        return $this->extensions[$name];
-    }
-
-    /**
-     * Registers an extension.
-     *
-     * @param Twig_ExtensionInterface $extension A Twig_ExtensionInterface instance
-     */
-    public function addExtension(Twig_ExtensionInterface $extension)
-    {
-        $this->extensions[$extension->getName()] = $extension;
-        $this->parsers = null;
-        $this->visitors = null;
-        $this->filters = null;
-        $this->tests = null;
-        $this->functions = null;
-        $this->globals = null;
-    }
-
-    /**
-     * Removes an extension by name.
-     *
-     * @param string $name The extension name
-     */
-    public function removeExtension($name)
-    {
-        unset($this->extensions[$name]);
-        $this->parsers = null;
-        $this->visitors = null;
-        $this->filters = null;
-        $this->tests = null;
-        $this->functions = null;
-        $this->globals = null;
-    }
-
-    /**
-     * Registers an array of extensions.
-     *
-     * @param array $extensions An array of extensions
-     */
-    public function setExtensions(array $extensions)
-    {
-        foreach ($extensions as $extension) {
-            $this->addExtension($extension);
-        }
-    }
-
-    /**
-     * Returns all registered extensions.
-     *
-     * @return array An array of extensions
-     */
-    public function getExtensions()
-    {
-        return $this->extensions;
-    }
-
-    /**
-     * Registers a Token Parser.
-     *
-     * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance
-     */
-    public function addTokenParser(Twig_TokenParserInterface $parser)
-    {
-        $this->staging['token_parsers'][] = $parser;
-        $this->parsers = null;
-    }
-
-    /**
-     * Gets the registered Token Parsers.
-     *
-     * @return Twig_TokenParserBrokerInterface A broker containing token parsers
-     */
-    public function getTokenParsers()
-    {
-        if (null === $this->parsers) {
-            $this->parsers = new Twig_TokenParserBroker();
-
-            if (isset($this->staging['token_parsers'])) {
-                foreach ($this->staging['token_parsers'] as $parser) {
-                    $this->parsers->addTokenParser($parser);
-                }
-            }
-
-            foreach ($this->getExtensions() as $extension) {
-                $parsers = $extension->getTokenParsers();
-                foreach ($parsers as $parser) {
-                    if ($parser instanceof Twig_TokenParserInterface) {
-                        $this->parsers->addTokenParser($parser);
-                    } elseif ($parser instanceof Twig_TokenParserBrokerInterface) {
-                        $this->parsers->addTokenParserBroker($parser);
-                    } else {
-                        throw new Twig_Error_Runtime('getTokenParsers() must return an array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances');
-                    }
-                }
-            }
-        }
-
-        return $this->parsers;
-    }
-
-    /**
-     * Gets registered tags.
-     *
-     * Be warned that this method cannot return tags defined by Twig_TokenParserBrokerInterface classes.
-     *
-     * @return Twig_TokenParserInterface[] An array of Twig_TokenParserInterface instances
-     */
-    public function getTags()
-    {
-        $tags = array();
-        foreach ($this->getTokenParsers()->getParsers() as $parser) {
-            if ($parser instanceof Twig_TokenParserInterface) {
-                $tags[$parser->getTag()] = $parser;
-            }
-        }
-
-        return $tags;
-    }
-
-    /**
-     * Registers a Node Visitor.
-     *
-     * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance
-     */
-    public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
-    {
-        $this->staging['visitors'][] = $visitor;
-        $this->visitors = null;
-    }
-
-    /**
-     * Gets the registered Node Visitors.
-     *
-     * @return Twig_NodeVisitorInterface[] An array of Twig_NodeVisitorInterface instances
-     */
-    public function getNodeVisitors()
-    {
-        if (null === $this->visitors) {
-            foreach ($this->getExtensions() as $extension) {
-                foreach ($extension->getNodeVisitors() as $visitor) {
-                    $this->addNodeVisitor($visitor);
-                }
-            }
-
-            $this->visitors = $this->staging['visitors'];
-        }
-
-        return $this->visitors;
-    }
-
-    /**
-     * Registers a Filter.
-     *
-     * @param string               $name   The filter name
-     * @param Twig_FilterInterface $filter A Twig_FilterInterface instance
-     */
-    public function addFilter($name, Twig_FilterInterface $filter)
-    {
-        $this->staging['filters'][$name] = $filter;
-        $this->filters = null;
-    }
-
-    /**
-     * Get a filter by name.
-     *
-     * Subclasses may override this method and load filters differently;
-     * so no list of filters is available.
-     *
-     * @param string $name The filter name
-     *
-     * @return Twig_Filter|false A Twig_Filter instance or false if the filter does not exists
-     */
-    public function getFilter($name)
-    {
-        if (null === $this->filters) {
-            $this->getFilters();
-        }
-
-        if (isset($this->filters[$name])) {
-            return $this->filters[$name];
-        }
-
-        foreach ($this->filters as $pattern => $filter) {
-            $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
-            if ($count) {
-                if (preg_match('#^'.$pattern.'$#', $name, $matches)) {
-                    array_shift($matches);
-                    $filter->setArguments($matches);
-
-                    return $filter;
-                }
-            }
-        }
-
-        foreach ($this->filterCallbacks as $callback) {
-            if (false !== $filter = call_user_func($callback, $name)) {
-                return $filter;
-            }
-        }
-
-        return false;
-    }
-
-    public function registerUndefinedFilterCallback($callable)
-    {
-        $this->filterCallbacks[] = $callable;
-    }
-
-    /**
-     * Gets the registered Filters.
-     *
-     * Be warned that this method cannot return filters defined with registerUndefinedFunctionCallback.
-     *
-     * @return Twig_FilterInterface[] An array of Twig_FilterInterface instances
-     *
-     * @see registerUndefinedFilterCallback
-     */
-    public function getFilters()
-    {
-        if (null === $this->filters) {
-            foreach ($this->getExtensions() as $extension) {
-                foreach ($extension->getFilters() as $name => $filter) {
-                    $this->addFilter($name, $filter);
-                }
-            }
-
-            $this->filters = $this->staging['filters'];
-        }
-
-        return $this->filters;
-    }
-
-    /**
-     * Registers a Test.
-     *
-     * @param string             $name The test name
-     * @param Twig_TestInterface $test A Twig_TestInterface instance
-     */
-    public function addTest($name, Twig_TestInterface $test)
-    {
-        $this->staging['tests'][$name] = $test;
-        $this->tests = null;
-    }
-
-    /**
-     * Gets the registered Tests.
-     *
-     * @return Twig_TestInterface[] An array of Twig_TestInterface instances
-     */
-    public function getTests()
-    {
-        if (null === $this->tests) {
-            foreach ($this->getExtensions() as $extension) {
-                foreach ($extension->getTests() as $name => $test) {
-                    $this->addTest($name, $test);
-                }
-            }
-
-            $this->tests = $this->staging['tests'];
-        }
-
-        return $this->tests;
-    }
-
-    /**
-     * Registers a Function.
-     *
-     * @param string                 $name     The function name
-     * @param Twig_FunctionInterface $function A Twig_FunctionInterface instance
-     */
-    public function addFunction($name, Twig_FunctionInterface $function)
-    {
-        $this->staging['functions'][$name] = $function;
-        $this->functions = null;
-    }
-
-    /**
-     * Get a function by name.
-     *
-     * Subclasses may override this method and load functions differently;
-     * so no list of functions is available.
-     *
-     * @param string $name function name
-     *
-     * @return Twig_Function|false A Twig_Function instance or false if the function does not exists
-     */
-    public function getFunction($name)
-    {
-        if (null === $this->functions) {
-            $this->getFunctions();
-        }
-
-        if (isset($this->functions[$name])) {
-            return $this->functions[$name];
-        }
-
-        foreach ($this->functions as $pattern => $function) {
-            $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
-            if ($count) {
-                if (preg_match('#^'.$pattern.'$#', $name, $matches)) {
-                    array_shift($matches);
-                    $function->setArguments($matches);
-
-                    return $function;
-                }
-            }
-        }
-
-        foreach ($this->functionCallbacks as $callback) {
-            if (false !== $function = call_user_func($callback, $name)) {
-                return $function;
-            }
-        }
-
-        return false;
-    }
-
-    public function registerUndefinedFunctionCallback($callable)
-    {
-        $this->functionCallbacks[] = $callable;
-    }
-
-    /**
-     * Gets registered functions.
-     *
-     * Be warned that this method cannot return functions defined with registerUndefinedFunctionCallback.
-     *
-     * @return Twig_FunctionInterface[] An array of Twig_FunctionInterface instances
-     *
-     * @see registerUndefinedFunctionCallback
-     */
-    public function getFunctions()
-    {
-        if (null === $this->functions) {
-            foreach ($this->getExtensions() as $extension) {
-                foreach ($extension->getFunctions() as $name => $function) {
-                    $this->addFunction($name, $function);
-                }
-            }
-
-            $this->functions = $this->staging['functions'];
-        }
-
-        return $this->functions;
-    }
-
-    /**
-     * Registers a Global.
-     *
-     * @param string $name  The global name
-     * @param mixed  $value The global value
-     */
-    public function addGlobal($name, $value)
-    {
-        $this->staging['globals'][$name] = $value;
-        $this->globals = null;
-    }
-
-    /**
-     * Gets the registered Globals.
-     *
-     * @return array An array of globals
-     */
-    public function getGlobals()
-    {
-        if (null === $this->globals) {
-            $this->globals = isset($this->staging['globals']) ? $this->staging['globals'] : array();
-            foreach ($this->getExtensions() as $extension) {
-                $this->globals = array_merge($this->globals, $extension->getGlobals());
-            }
-        }
-
-        return $this->globals;
-    }
-
-    /**
-     * Merges a context with the defined globals.
-     *
-     * @param array $context An array representing the context
-     *
-     * @return array The context merged with the globals
-     */
-    public function mergeGlobals(array $context)
-    {
-        // we don't use array_merge as the context being generally
-        // bigger than globals, this code is faster.
-        foreach ($this->getGlobals() as $key => $value) {
-            if (!array_key_exists($key, $context)) {
-                $context[$key] = $value;
-            }
-        }
-
-        return $context;
-    }
-
-    /**
-     * Gets the registered unary Operators.
-     *
-     * @return array An array of unary operators
-     */
-    public function getUnaryOperators()
-    {
-        if (null === $this->unaryOperators) {
-            $this->initOperators();
-        }
-
-        return $this->unaryOperators;
-    }
-
-    /**
-     * Gets the registered binary Operators.
-     *
-     * @return array An array of binary operators
-     */
-    public function getBinaryOperators()
-    {
-        if (null === $this->binaryOperators) {
-            $this->initOperators();
-        }
-
-        return $this->binaryOperators;
-    }
-
-    public function computeAlternatives($name, $items)
-    {
-        $alternatives = array();
-        foreach ($items as $item) {
-            $lev = levenshtein($name, $item);
-            if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
-                $alternatives[$item] = $lev;
-            }
-        }
-        asort($alternatives);
-
-        return array_keys($alternatives);
-    }
-
-    protected function initOperators()
-    {
-        $this->unaryOperators = array();
-        $this->binaryOperators = array();
-        foreach ($this->getExtensions() as $extension) {
-            $operators = $extension->getOperators();
-
-            if (!$operators) {
-                continue;
-            }
-
-            if (2 !== count($operators)) {
-                throw new InvalidArgumentException(sprintf('"%s::getOperators()" does not return a valid operators array.', get_class($extension)));
-            }
-
-            $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]);
-            $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]);
-        }
-    }
-
-    protected function writeCacheFile($file, $content)
-    {
-        $dir = dirname($file);
-        if (!is_dir($dir)) {
-            if (false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
-                throw new RuntimeException(sprintf("Unable to create the cache directory (%s).", $dir));
-            }
-        } elseif (!is_writable($dir)) {
-            throw new RuntimeException(sprintf("Unable to write in the cache directory (%s).", $dir));
-        }
-
-        $tmpFile = tempnam(dirname($file), basename($file));
-        if (false !== @file_put_contents($tmpFile, $content)) {
-            // rename does not work on Win32 before 5.2.6
-            if (@rename($tmpFile, $file) || (@copy($tmpFile, $file) && unlink($tmpFile))) {
-                @chmod($file, 0644);
-
-                return;
-            }
-        }
-
-        throw new Twig_Error_Runtime(sprintf('Failed to write cache file "%s".', $file));
-    }
-}
diff --git a/core/vendor/Twig/Error.php b/core/vendor/Twig/Error.php
deleted file mode 100644
index 4b74e40..0000000
--- a/core/vendor/Twig/Error.php
+++ /dev/null
@@ -1,199 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Twig base exception.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Error extends Exception
-{
-    protected $lineno;
-    protected $filename;
-    protected $rawMessage;
-    protected $previous;
-
-    /**
-     * Constructor.
-     *
-     * @param string    $message  The error message
-     * @param integer   $lineno   The template line where the error occurred
-     * @param string    $filename The template file name where the error occurred
-     * @param Exception $previous The previous exception
-     */
-    public function __construct($message, $lineno = -1, $filename = null, Exception $previous = null)
-    {
-        if (version_compare(PHP_VERSION, '5.3.0', '<')) {
-            $this->previous = $previous;
-            parent::__construct('');
-        } else {
-            parent::__construct('', 0, $previous);
-        }
-
-        $this->lineno = $lineno;
-        $this->filename = $filename;
-
-        if (-1 === $this->lineno || null === $this->filename) {
-            $this->guessTemplateInfo();
-        }
-
-        $this->rawMessage = $message;
-
-        $this->updateRepr();
-    }
-
-    /**
-     * Gets the raw message.
-     *
-     * @return string The raw message
-     */
-    public function getRawMessage()
-    {
-        return $this->rawMessage;
-    }
-
-    /**
-     * Gets the filename where the error occurred.
-     *
-     * @return string The filename
-     */
-    public function getTemplateFile()
-    {
-        return $this->filename;
-    }
-
-    /**
-     * Sets the filename where the error occurred.
-     *
-     * @param string $filename The filename
-     */
-    public function setTemplateFile($filename)
-    {
-        $this->filename = $filename;
-
-        $this->updateRepr();
-    }
-
-    /**
-     * Gets the template line where the error occurred.
-     *
-     * @return integer The template line
-     */
-    public function getTemplateLine()
-    {
-        return $this->lineno;
-    }
-
-    /**
-     * Sets the template line where the error occurred.
-     *
-     * @param integer $lineno The template line
-     */
-    public function setTemplateLine($lineno)
-    {
-        $this->lineno = $lineno;
-
-        $this->updateRepr();
-    }
-
-    /**
-     * For PHP < 5.3.0, provides access to the getPrevious() method.
-     *
-     * @param string $method    The method name
-     * @param array  $arguments The parameters to be passed to the method
-     *
-     * @return Exception The previous exception or null
-     */
-    public function __call($method, $arguments)
-    {
-        if ('getprevious' == strtolower($method)) {
-            return $this->previous;
-        }
-
-        throw new BadMethodCallException(sprintf('Method "Twig_Error::%s()" does not exist.', $method));
-    }
-
-    protected function updateRepr()
-    {
-        $this->message = $this->rawMessage;
-
-        $dot = false;
-        if ('.' === substr($this->message, -1)) {
-            $this->message = substr($this->message, 0, -1);
-            $dot = true;
-        }
-
-        if (null !== $this->filename) {
-            if (is_string($this->filename) || (is_object($this->filename) && method_exists($this->filename, '__toString'))) {
-                $filename = sprintf('"%s"', $this->filename);
-            } else {
-                $filename = json_encode($this->filename);
-            }
-            $this->message .= sprintf(' in %s', $filename);
-        }
-
-        if ($this->lineno >= 0) {
-            $this->message .= sprintf(' at line %d', $this->lineno);
-        }
-
-        if ($dot) {
-            $this->message .= '.';
-        }
-    }
-
-    protected function guessTemplateInfo()
-    {
-        $template = null;
-        foreach (debug_backtrace() as $trace) {
-            if (isset($trace['object']) && $trace['object'] instanceof Twig_Template && 'Twig_Template' !== get_class($trace['object'])) {
-                $template = $trace['object'];
-
-                // update template filename
-                if (null === $this->filename) {
-                    $this->filename = $template->getTemplateName();
-                }
-
-                break;
-            }
-        }
-
-        if (null === $template || $this->lineno > -1) {
-            return;
-        }
-
-        $r = new ReflectionObject($template);
-        $file = $r->getFileName();
-
-        $exceptions = array($e = $this);
-        while (($e instanceof self || method_exists($e, 'getPrevious')) && $e = $e->getPrevious()) {
-            $exceptions[] = $e;
-        }
-
-        while ($e = array_pop($exceptions)) {
-            $traces = $e->getTrace();
-            while ($trace = array_shift($traces)) {
-                if (!isset($trace['file']) || !isset($trace['line']) || $file != $trace['file']) {
-                    continue;
-                }
-
-                foreach ($template->getDebugInfo() as $codeLine => $templateLine) {
-                    if ($codeLine <= $trace['line']) {
-                        // update template line
-                        $this->lineno = $templateLine;
-
-                        return;
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/core/vendor/Twig/Error/Loader.php b/core/vendor/Twig/Error/Loader.php
deleted file mode 100644
index 418a776..0000000
--- a/core/vendor/Twig/Error/Loader.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Exception thrown when an error occurs during template loading.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Error_Loader extends Twig_Error
-{
-}
diff --git a/core/vendor/Twig/Error/Runtime.php b/core/vendor/Twig/Error/Runtime.php
deleted file mode 100644
index 8a387fa..0000000
--- a/core/vendor/Twig/Error/Runtime.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Exception thrown when an error occurs at runtime.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Error_Runtime extends Twig_Error
-{
-}
diff --git a/core/vendor/Twig/Error/Syntax.php b/core/vendor/Twig/Error/Syntax.php
deleted file mode 100644
index a2650c3..0000000
--- a/core/vendor/Twig/Error/Syntax.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Exception thrown when a syntax error occurs during lexing or parsing of a template.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Error_Syntax extends Twig_Error
-{
-}
diff --git a/core/vendor/Twig/ExpressionParser.php b/core/vendor/Twig/ExpressionParser.php
deleted file mode 100644
index 0f35930..0000000
--- a/core/vendor/Twig/ExpressionParser.php
+++ /dev/null
@@ -1,488 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Parses expressions.
- *
- * This parser implements a "Precedence climbing" algorithm.
- *
- * @see http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm
- * @see http://en.wikipedia.org/wiki/Operator-precedence_parser
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_ExpressionParser
-{
-    const OPERATOR_LEFT = 1;
-    const OPERATOR_RIGHT = 2;
-
-    protected $parser;
-    protected $unaryOperators;
-    protected $binaryOperators;
-
-    public function __construct(Twig_Parser $parser, array $unaryOperators, array $binaryOperators)
-    {
-        $this->parser = $parser;
-        $this->unaryOperators = $unaryOperators;
-        $this->binaryOperators = $binaryOperators;
-    }
-
-    public function parseExpression($precedence = 0)
-    {
-        $expr = $this->getPrimary();
-        $token = $this->parser->getCurrentToken();
-        while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) {
-            $op = $this->binaryOperators[$token->getValue()];
-            $this->parser->getStream()->next();
-
-            if (isset($op['callable'])) {
-                $expr = call_user_func($op['callable'], $this->parser, $expr);
-            } else {
-                $expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence']);
-                $class = $op['class'];
-                $expr = new $class($expr, $expr1, $token->getLine());
-            }
-
-            $token = $this->parser->getCurrentToken();
-        }
-
-        if (0 === $precedence) {
-            return $this->parseConditionalExpression($expr);
-        }
-
-        return $expr;
-    }
-
-    protected function getPrimary()
-    {
-        $token = $this->parser->getCurrentToken();
-
-        if ($this->isUnary($token)) {
-            $operator = $this->unaryOperators[$token->getValue()];
-            $this->parser->getStream()->next();
-            $expr = $this->parseExpression($operator['precedence']);
-            $class = $operator['class'];
-
-            return $this->parsePostfixExpression(new $class($expr, $token->getLine()));
-        } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-            $this->parser->getStream()->next();
-            $expr = $this->parseExpression();
-            $this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'An opened parenthesis is not properly closed');
-
-            return $this->parsePostfixExpression($expr);
-        }
-
-        return $this->parsePrimaryExpression();
-    }
-
-    protected function parseConditionalExpression($expr)
-    {
-        while ($this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '?')) {
-            $this->parser->getStream()->next();
-            $expr2 = $this->parseExpression();
-            $this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE, ':', 'The ternary operator must have a default value');
-            $expr3 = $this->parseExpression();
-
-            $expr = new Twig_Node_Expression_Conditional($expr, $expr2, $expr3, $this->parser->getCurrentToken()->getLine());
-        }
-
-        return $expr;
-    }
-
-    protected function isUnary(Twig_Token $token)
-    {
-        return $token->test(Twig_Token::OPERATOR_TYPE) && isset($this->unaryOperators[$token->getValue()]);
-    }
-
-    protected function isBinary(Twig_Token $token)
-    {
-        return $token->test(Twig_Token::OPERATOR_TYPE) && isset($this->binaryOperators[$token->getValue()]);
-    }
-
-    public function parsePrimaryExpression()
-    {
-        $token = $this->parser->getCurrentToken();
-        switch ($token->getType()) {
-            case Twig_Token::NAME_TYPE:
-                $this->parser->getStream()->next();
-                switch ($token->getValue()) {
-                    case 'true':
-                    case 'TRUE':
-                        $node = new Twig_Node_Expression_Constant(true, $token->getLine());
-                        break;
-
-                    case 'false':
-                    case 'FALSE':
-                        $node = new Twig_Node_Expression_Constant(false, $token->getLine());
-                        break;
-
-                    case 'none':
-                    case 'NONE':
-                    case 'null':
-                    case 'NULL':
-                        $node = new Twig_Node_Expression_Constant(null, $token->getLine());
-                        break;
-
-                    default:
-                        if ('(' === $this->parser->getCurrentToken()->getValue()) {
-                            $node = $this->getFunctionNode($token->getValue(), $token->getLine());
-                        } else {
-                            $node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine());
-                        }
-                }
-                break;
-
-            case Twig_Token::NUMBER_TYPE:
-                $this->parser->getStream()->next();
-                $node = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
-                break;
-
-            case Twig_Token::STRING_TYPE:
-            case Twig_Token::INTERPOLATION_START_TYPE:
-                $node = $this->parseStringExpression();
-                break;
-
-            default:
-                if ($token->test(Twig_Token::PUNCTUATION_TYPE, '[')) {
-                    $node = $this->parseArrayExpression();
-                } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '{')) {
-                    $node = $this->parseHashExpression();
-                } else {
-                    throw new Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s"', Twig_Token::typeToEnglish($token->getType(), $token->getLine()), $token->getValue()), $token->getLine());
-                }
-        }
-
-        return $this->parsePostfixExpression($node);
-    }
-
-    public function parseStringExpression()
-    {
-        $stream = $this->parser->getStream();
-
-        $nodes = array();
-        // a string cannot be followed by another string in a single expression
-        $nextCanBeString = true;
-        while (true) {
-            if ($stream->test(Twig_Token::STRING_TYPE) && $nextCanBeString) {
-                $token = $stream->next();
-                $nodes[] = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
-                $nextCanBeString = false;
-            } elseif ($stream->test(Twig_Token::INTERPOLATION_START_TYPE)) {
-                $stream->next();
-                $nodes[] = $this->parseExpression();
-                $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
-                $nextCanBeString = true;
-            } else {
-                break;
-            }
-        }
-
-        $expr = array_shift($nodes);
-        foreach ($nodes as $node) {
-            $expr = new Twig_Node_Expression_Binary_Concat($expr, $node, $node->getLine());
-        }
-
-        return $expr;
-    }
-
-    public function parseArrayExpression()
-    {
-        $stream = $this->parser->getStream();
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '[', 'An array element was expected');
-
-        $node = new Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine());
-        $first = true;
-        while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
-            if (!$first) {
-                $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'An array element must be followed by a comma');
-
-                // trailing ,?
-                if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
-                    break;
-                }
-            }
-            $first = false;
-
-            $node->addElement($this->parseExpression());
-        }
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']', 'An opened array is not properly closed');
-
-        return $node;
-    }
-
-    public function parseHashExpression()
-    {
-        $stream = $this->parser->getStream();
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '{', 'A hash element was expected');
-
-        $node = new Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine());
-        $first = true;
-        while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, '}')) {
-            if (!$first) {
-                $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'A hash value must be followed by a comma');
-
-                // trailing ,?
-                if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '}')) {
-                    break;
-                }
-            }
-            $first = false;
-
-            // a hash key can be:
-            //
-            //  * a number -- 12
-            //  * a string -- 'a'
-            //  * a name, which is equivalent to a string -- a
-            //  * an expression, which must be enclosed in parentheses -- (1 + 2)
-            if ($stream->test(Twig_Token::STRING_TYPE) || $stream->test(Twig_Token::NAME_TYPE) || $stream->test(Twig_Token::NUMBER_TYPE)) {
-                $token = $stream->next();
-                $key = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
-            } elseif ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-                $key = $this->parseExpression();
-            } else {
-                $current = $stream->getCurrent();
-
-                throw new Twig_Error_Syntax(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s"', Twig_Token::typeToEnglish($current->getType(), $current->getLine()), $current->getValue()), $current->getLine());
-            }
-
-            $stream->expect(Twig_Token::PUNCTUATION_TYPE, ':', 'A hash key must be followed by a colon (:)');
-            $value = $this->parseExpression();
-
-            $node->addElement($value, $key);
-        }
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '}', 'An opened hash is not properly closed');
-
-        return $node;
-    }
-
-    public function parsePostfixExpression($node)
-    {
-        while (true) {
-            $token = $this->parser->getCurrentToken();
-            if ($token->getType() == Twig_Token::PUNCTUATION_TYPE) {
-                if ('.' == $token->getValue() || '[' == $token->getValue()) {
-                    $node = $this->parseSubscriptExpression($node);
-                } elseif ('|' == $token->getValue()) {
-                    $node = $this->parseFilterExpression($node);
-                } else {
-                    break;
-                }
-            } else {
-                break;
-            }
-        }
-
-        return $node;
-    }
-
-    public function getFunctionNode($name, $line)
-    {
-        $args = $this->parseArguments();
-        switch ($name) {
-            case 'parent':
-                if (!count($this->parser->getBlockStack())) {
-                    throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden', $line);
-                }
-
-                if (!$this->parser->getParent() && !$this->parser->hasTraits()) {
-                    throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend nor "use" another template is forbidden', $line);
-                }
-
-                return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $line);
-            case 'block':
-                return new Twig_Node_Expression_BlockReference($args->getNode(0), false, $line);
-            case 'attribute':
-                if (count($args) < 2) {
-                    throw new Twig_Error_Syntax('The "attribute" function takes at least two arguments (the variable and the attributes)', $line);
-                }
-
-                return new Twig_Node_Expression_GetAttr($args->getNode(0), $args->getNode(1), count($args) > 2 ? $args->getNode(2) : new Twig_Node_Expression_Array(array(), $line), Twig_TemplateInterface::ANY_CALL, $line);
-            default:
-                if (null !== $alias = $this->parser->getImportedFunction($name)) {
-                    $arguments = new Twig_Node_Expression_Array(array(), $line);
-                    foreach ($args as $n) {
-                        $arguments->addElement($n);
-                    }
-
-                    $node = new Twig_Node_Expression_MethodCall($alias['node'], $alias['name'], $arguments, $line);
-                    $node->setAttribute('safe', true);
-
-                    return $node;
-                }
-
-                $class = $this->getFunctionNodeClass($name);
-
-                return new $class($name, $args, $line);
-        }
-    }
-
-    public function parseSubscriptExpression($node)
-    {
-        $stream = $this->parser->getStream();
-        $token = $stream->next();
-        $lineno = $token->getLine();
-        $arguments = new Twig_Node_Expression_Array(array(), $lineno);
-        $type = Twig_TemplateInterface::ANY_CALL;
-        if ($token->getValue() == '.') {
-            $token = $stream->next();
-            if (
-                $token->getType() == Twig_Token::NAME_TYPE
-                ||
-                $token->getType() == Twig_Token::NUMBER_TYPE
-                ||
-                ($token->getType() == Twig_Token::OPERATOR_TYPE && preg_match(Twig_Lexer::REGEX_NAME, $token->getValue()))
-            ) {
-                $arg = new Twig_Node_Expression_Constant($token->getValue(), $lineno);
-
-                if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-                    $type = Twig_TemplateInterface::METHOD_CALL;
-                    foreach ($this->parseArguments() as $n) {
-                        $arguments->addElement($n);
-                    }
-                }
-            } else {
-                throw new Twig_Error_Syntax('Expected name or number', $lineno);
-            }
-        } else {
-            $type = Twig_TemplateInterface::ARRAY_CALL;
-
-            $arg = $this->parseExpression();
-
-            // slice?
-            if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
-                $stream->next();
-
-                if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
-                    $length = new Twig_Node_Expression_Constant(null, $token->getLine());
-                } else {
-                    $length = $this->parseExpression();
-                }
-
-                $class = $this->getFilterNodeClass('slice');
-                $arguments = new Twig_Node(array($arg, $length));
-                $filter = new $class($node, new Twig_Node_Expression_Constant('slice', $token->getLine()), $arguments, $token->getLine());
-
-                $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']');
-
-                return $filter;
-            }
-
-            $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']');
-        }
-
-        return new Twig_Node_Expression_GetAttr($node, $arg, $arguments, $type, $lineno);
-    }
-
-    public function parseFilterExpression($node)
-    {
-        $this->parser->getStream()->next();
-
-        return $this->parseFilterExpressionRaw($node);
-    }
-
-    public function parseFilterExpressionRaw($node, $tag = null)
-    {
-        while (true) {
-            $token = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE);
-
-            $name = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
-            if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-                $arguments = new Twig_Node();
-            } else {
-                $arguments = $this->parseArguments();
-            }
-
-            $class = $this->getFilterNodeClass($name->getAttribute('value'));
-
-            $node = new $class($node, $name, $arguments, $token->getLine(), $tag);
-
-            if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '|')) {
-                break;
-            }
-
-            $this->parser->getStream()->next();
-        }
-
-        return $node;
-    }
-
-    public function parseArguments()
-    {
-        $args = array();
-        $stream = $this->parser->getStream();
-
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '(', 'A list of arguments must be opened by a parenthesis');
-        while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ')')) {
-            if (!empty($args)) {
-                $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'Arguments must be separated by a comma');
-            }
-            $args[] = $this->parseExpression();
-        }
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'A list of arguments must be closed by a parenthesis');
-
-        return new Twig_Node($args);
-    }
-
-    public function parseAssignmentExpression()
-    {
-        $targets = array();
-        while (true) {
-            $token = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, null, 'Only variables can be assigned to');
-            if (in_array($token->getValue(), array('true', 'false', 'none'))) {
-                throw new Twig_Error_Syntax(sprintf('You cannot assign a value to "%s"', $token->getValue()), $token->getLine());
-            }
-            $targets[] = new Twig_Node_Expression_AssignName($token->getValue(), $token->getLine());
-
-            if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, ',')) {
-                break;
-            }
-            $this->parser->getStream()->next();
-        }
-
-        return new Twig_Node($targets);
-    }
-
-    public function parseMultitargetExpression()
-    {
-        $targets = array();
-        while (true) {
-            $targets[] = $this->parseExpression();
-            if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, ',')) {
-                break;
-            }
-            $this->parser->getStream()->next();
-        }
-
-        return new Twig_Node($targets);
-    }
-
-    protected function getFunctionNodeClass($name)
-    {
-        $functionMap = $this->parser->getEnvironment()->getFunctions();
-        if (isset($functionMap[$name]) && $functionMap[$name] instanceof Twig_Function_Node) {
-            return $functionMap[$name]->getClass();
-        }
-
-        return 'Twig_Node_Expression_Function';
-    }
-
-    protected function getFilterNodeClass($name)
-    {
-        $filterMap = $this->parser->getEnvironment()->getFilters();
-        if (isset($filterMap[$name]) && $filterMap[$name] instanceof Twig_Filter_Node) {
-            return $filterMap[$name]->getClass();
-        }
-
-        return 'Twig_Node_Expression_Filter';
-    }
-}
diff --git a/core/vendor/Twig/Extension.php b/core/vendor/Twig/Extension.php
deleted file mode 100644
index 931fc03..0000000
--- a/core/vendor/Twig/Extension.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-abstract class Twig_Extension implements Twig_ExtensionInterface
-{
-    /**
-     * Initializes the runtime environment.
-     *
-     * This is where you can load some file that contains filter functions for instance.
-     *
-     * @param Twig_Environment $environment The current Twig_Environment instance
-     */
-    public function initRuntime(Twig_Environment $environment)
-    {
-    }
-
-    /**
-     * Returns the token parser instances to add to the existing list.
-     *
-     * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
-     */
-    public function getTokenParsers()
-    {
-        return array();
-    }
-
-    /**
-     * Returns the node visitor instances to add to the existing list.
-     *
-     * @return array An array of Twig_NodeVisitorInterface instances
-     */
-    public function getNodeVisitors()
-    {
-        return array();
-    }
-
-    /**
-     * Returns a list of filters to add to the existing list.
-     *
-     * @return array An array of filters
-     */
-    public function getFilters()
-    {
-        return array();
-    }
-
-    /**
-     * Returns a list of tests to add to the existing list.
-     *
-     * @return array An array of tests
-     */
-    public function getTests()
-    {
-        return array();
-    }
-
-    /**
-     * Returns a list of functions to add to the existing list.
-     *
-     * @return array An array of functions
-     */
-    public function getFunctions()
-    {
-        return array();
-    }
-
-    /**
-     * Returns a list of operators to add to the existing list.
-     *
-     * @return array An array of operators
-     */
-    public function getOperators()
-    {
-        return array();
-    }
-
-    /**
-     * Returns a list of global variables to add to the existing list.
-     *
-     * @return array An array of global variables
-     */
-    public function getGlobals()
-    {
-        return array();
-    }
-}
diff --git a/core/vendor/Twig/Extension/Core.php b/core/vendor/Twig/Extension/Core.php
deleted file mode 100644
index 27c80ce..0000000
--- a/core/vendor/Twig/Extension/Core.php
+++ /dev/null
@@ -1,1039 +0,0 @@
-<?php
-
-if (!defined('ENT_SUBSTITUTE')) {
-    define('ENT_SUBSTITUTE', 8);
-}
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Extension_Core extends Twig_Extension
-{
-    protected $dateFormats = array('F j, Y H:i', '%d days');
-    protected $numberFormat = array(0, '.', ',');
-    protected $timezone = null;
-
-    /**
-     * Sets the default format to be used by the date filter.
-     *
-     * @param string $format             The default date format string
-     * @param string $dateIntervalFormat The default date interval format string
-     */
-    public function setDateFormat($format = null, $dateIntervalFormat = null)
-    {
-        if (null !== $format) {
-            $this->dateFormats[0] = $format;
-        }
-
-        if (null !== $dateIntervalFormat) {
-            $this->dateFormats[1] = $dateIntervalFormat;
-        }
-    }
-
-    /**
-     * Gets the default format to be used by the date filter.
-     *
-     * @return array The default date format string and the default date interval format string
-     */
-    public function getDateFormat()
-    {
-        return $this->dateFormats;
-    }
-
-    /**
-     * Sets the default timezone to be used by the date filter.
-     *
-     * @param DateTimeZone|string $timezone The default timezone string or a DateTimeZone object
-     */
-    public function setTimezone($timezone)
-    {
-        $this->timezone = $timezone instanceof DateTimeZone ? $timezone : new DateTimeZone($timezone);
-    }
-
-    /**
-     * Gets the default timezone to be used by the date filter.
-     *
-     * @return DateTimeZone The default timezone currently in use
-     */
-    public function getTimezone()
-    {
-        return $this->timezone;
-    }
-
-    /**
-     * Sets the default format to be used by the number_format filter.
-     *
-     * @param integer $decimal      The number of decimal places to use.
-     * @param string  $decimalPoint The character(s) to use for the decimal point.
-     * @param string  $thousandSep  The character(s) to use for the thousands separator.
-     */
-    public function setNumberFormat($decimal, $decimalPoint, $thousandSep)
-    {
-        $this->numberFormat = array($decimal, $decimalPoint, $thousandSep);
-    }
-
-    /**
-     * Get the default format used by the number_format filter.
-     *
-     * @return array The arguments for number_format()
-     */
-    public function getNumberFormat()
-    {
-        return $this->numberFormat;
-    }
-
-    /**
-     * Returns the token parser instance to add to the existing list.
-     *
-     * @return array An array of Twig_TokenParser instances
-     */
-    public function getTokenParsers()
-    {
-        return array(
-            new Twig_TokenParser_For(),
-            new Twig_TokenParser_If(),
-            new Twig_TokenParser_Extends(),
-            new Twig_TokenParser_Include(),
-            new Twig_TokenParser_Block(),
-            new Twig_TokenParser_Use(),
-            new Twig_TokenParser_Filter(),
-            new Twig_TokenParser_Macro(),
-            new Twig_TokenParser_Import(),
-            new Twig_TokenParser_From(),
-            new Twig_TokenParser_Set(),
-            new Twig_TokenParser_Spaceless(),
-            new Twig_TokenParser_Flush(),
-            new Twig_TokenParser_Do(),
-            new Twig_TokenParser_Embed(),
-        );
-    }
-
-    /**
-     * Returns a list of filters to add to the existing list.
-     *
-     * @return array An array of filters
-     */
-    public function getFilters()
-    {
-        $filters = array(
-            // formatting filters
-            'date'          => new Twig_Filter_Function('twig_date_format_filter', array('needs_environment' => true)),
-            'format'        => new Twig_Filter_Function('sprintf'),
-            'replace'       => new Twig_Filter_Function('strtr'),
-            'number_format' => new Twig_Filter_Function('twig_number_format_filter', array('needs_environment' => true)),
-            'abs'           => new Twig_Filter_Function('abs'),
-
-            // encoding
-            'url_encode'       => new Twig_Filter_Function('twig_urlencode_filter'),
-            'json_encode'      => new Twig_Filter_Function('twig_jsonencode_filter'),
-            'convert_encoding' => new Twig_Filter_Function('twig_convert_encoding'),
-
-            // string filters
-            'title'      => new Twig_Filter_Function('twig_title_string_filter', array('needs_environment' => true)),
-            'capitalize' => new Twig_Filter_Function('twig_capitalize_string_filter', array('needs_environment' => true)),
-            'upper'      => new Twig_Filter_Function('strtoupper'),
-            'lower'      => new Twig_Filter_Function('strtolower'),
-            'striptags'  => new Twig_Filter_Function('strip_tags'),
-            'trim'       => new Twig_Filter_Function('trim'),
-            'nl2br'      => new Twig_Filter_Function('nl2br', array('pre_escape' => 'html', 'is_safe' => array('html'))),
-
-            // array helpers
-            'join'    => new Twig_Filter_Function('twig_join_filter'),
-            'sort'    => new Twig_Filter_Function('twig_sort_filter'),
-            'merge'   => new Twig_Filter_Function('twig_array_merge'),
-
-            // string/array filters
-            'reverse' => new Twig_Filter_Function('twig_reverse_filter', array('needs_environment' => true)),
-            'length'  => new Twig_Filter_Function('twig_length_filter', array('needs_environment' => true)),
-            'slice'   => new Twig_Filter_Function('twig_slice', array('needs_environment' => true)),
-
-            // iteration and runtime
-            'default' => new Twig_Filter_Node('Twig_Node_Expression_Filter_Default'),
-            '_default' => new Twig_Filter_Function('_twig_default_filter'),
-
-            'keys'    => new Twig_Filter_Function('twig_get_array_keys_filter'),
-
-            // escaping
-            'escape' => new Twig_Filter_Function('twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
-            'e'      => new Twig_Filter_Function('twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
-        );
-
-        if (function_exists('mb_get_info')) {
-            $filters['upper'] = new Twig_Filter_Function('twig_upper_filter', array('needs_environment' => true));
-            $filters['lower'] = new Twig_Filter_Function('twig_lower_filter', array('needs_environment' => true));
-        }
-
-        return $filters;
-    }
-
-    /**
-     * Returns a list of global functions to add to the existing list.
-     *
-     * @return array An array of global functions
-     */
-    public function getFunctions()
-    {
-        return array(
-            'range'    => new Twig_Function_Function('range'),
-            'constant' => new Twig_Function_Function('constant'),
-            'cycle'    => new Twig_Function_Function('twig_cycle'),
-            'random'   => new Twig_Function_Function('twig_random', array('needs_environment' => true)),
-            'date'     => new Twig_Function_Function('twig_date_converter', array('needs_environment' => true)),
-        );
-    }
-
-    /**
-     * Returns a list of tests to add to the existing list.
-     *
-     * @return array An array of tests
-     */
-    public function getTests()
-    {
-        return array(
-            'even'        => new Twig_Test_Node('Twig_Node_Expression_Test_Even'),
-            'odd'         => new Twig_Test_Node('Twig_Node_Expression_Test_Odd'),
-            'defined'     => new Twig_Test_Node('Twig_Node_Expression_Test_Defined'),
-            'sameas'      => new Twig_Test_Node('Twig_Node_Expression_Test_Sameas'),
-            'none'        => new Twig_Test_Node('Twig_Node_Expression_Test_Null'),
-            'null'        => new Twig_Test_Node('Twig_Node_Expression_Test_Null'),
-            'divisibleby' => new Twig_Test_Node('Twig_Node_Expression_Test_Divisibleby'),
-            'constant'    => new Twig_Test_Node('Twig_Node_Expression_Test_Constant'),
-            'empty'       => new Twig_Test_Function('twig_test_empty'),
-            'iterable'    => new Twig_Test_Function('twig_test_iterable'),
-        );
-    }
-
-    /**
-     * Returns a list of operators to add to the existing list.
-     *
-     * @return array An array of operators
-     */
-    public function getOperators()
-    {
-        return array(
-            array(
-                'not' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
-                '-'   => array('precedence' => 500, 'class' => 'Twig_Node_Expression_Unary_Neg'),
-                '+'   => array('precedence' => 500, 'class' => 'Twig_Node_Expression_Unary_Pos'),
-            ),
-            array(
-                'b-and'  => array('precedence' => 5, 'class' => 'Twig_Node_Expression_Binary_BitwiseAnd', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'b-xor'  => array('precedence' => 5, 'class' => 'Twig_Node_Expression_Binary_BitwiseXor', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'b-or'   => array('precedence' => 5, 'class' => 'Twig_Node_Expression_Binary_BitwiseOr', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'or'     => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'and'    => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '=='     => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Equal', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '!='     => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '<'      => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Less', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '>'      => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Greater', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '>='     => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_GreaterEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '<='     => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_LessEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'not in' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotIn', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'in'     => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_In', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '..'     => array('precedence' => 25, 'class' => 'Twig_Node_Expression_Binary_Range', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '+'      => array('precedence' => 30, 'class' => 'Twig_Node_Expression_Binary_Add', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '-'      => array('precedence' => 30, 'class' => 'Twig_Node_Expression_Binary_Sub', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '~'      => array('precedence' => 40, 'class' => 'Twig_Node_Expression_Binary_Concat', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '*'      => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mul', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '/'      => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Div', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '//'     => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_FloorDiv', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '%'      => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mod', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'is'     => array('precedence' => 100, 'callable' => array($this, 'parseTestExpression'), 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'is not' => array('precedence' => 100, 'callable' => array($this, 'parseNotTestExpression'), 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '**'     => array('precedence' => 200, 'class' => 'Twig_Node_Expression_Binary_Power', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT),
-            ),
-        );
-    }
-
-    public function parseNotTestExpression(Twig_Parser $parser, $node)
-    {
-        return new Twig_Node_Expression_Unary_Not($this->parseTestExpression($parser, $node), $parser->getCurrentToken()->getLine());
-    }
-
-    public function parseTestExpression(Twig_Parser $parser, $node)
-    {
-        $stream = $parser->getStream();
-        $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-        $arguments = null;
-        if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-            $arguments = $parser->getExpressionParser()->parseArguments();
-        }
-
-        $class = $this->getTestNodeClass($parser->getEnvironment(), $name);
-
-        return new $class($node, $name, $arguments, $parser->getCurrentToken()->getLine());
-    }
-
-    protected function getTestNodeClass(Twig_Environment $env, $name)
-    {
-        $testMap = $env->getTests();
-        if (isset($testMap[$name]) && $testMap[$name] instanceof Twig_Test_Node) {
-            return $testMap[$name]->getClass();
-        }
-
-        return 'Twig_Node_Expression_Test';
-    }
-
-    /**
-     * Returns the name of the extension.
-     *
-     * @return string The extension name
-     */
-    public function getName()
-    {
-        return 'core';
-    }
-}
-
-/**
- * Cycles over a value.
- *
- * @param ArrayAccess|array $values An array or an ArrayAccess instance
- * @param integer           $i      The cycle value
- *
- * @return string The next value in the cycle
- */
-function twig_cycle($values, $i)
-{
-    if (!is_array($values) && !$values instanceof ArrayAccess) {
-        return $values;
-    }
-
-    return $values[$i % count($values)];
-}
-
-/**
- * Returns a random value depending on the supplied parameter type:
- * - a random item from a Traversable or array
- * - a random character from a string
- * - a random integer between 0 and the integer parameter
- *
- * @param Twig_Environment             $env    A Twig_Environment instance
- * @param Traversable|array|int|string $values The values to pick a random item from
- *
- * @throws Twig_Error_Runtime When $values is an empty array (does not apply to an empty string which is returned as is).
- *
- * @return mixed A random value from the given sequence
- */
-function twig_random(Twig_Environment $env, $values = null)
-{
-    if (null === $values) {
-        return mt_rand();
-    }
-
-    if (is_int($values) || is_float($values)) {
-        return $values < 0 ? mt_rand($values, 0) : mt_rand(0, $values);
-    }
-
-    if ($values instanceof Traversable) {
-        $values = iterator_to_array($values);
-    } elseif (is_string($values)) {
-        if ('' === $values) {
-            return '';
-        }
-        if (null !== $charset = $env->getCharset()) {
-            if ('UTF-8' != $charset) {
-                $values = twig_convert_encoding($values, 'UTF-8', $charset);
-            }
-
-            // unicode version of str_split()
-            // split at all positions, but not after the start and not before the end
-            $values = preg_split('/(?<!^)(?!$)/u', $values);
-
-            if ('UTF-8' != $charset) {
-                foreach ($values as $i => $value) {
-                    $values[$i] = twig_convert_encoding($value, $charset, 'UTF-8');
-                }
-            }
-        } else {
-            return $values[mt_rand(0, strlen($values) - 1)];
-        }
-    }
-
-    if (!is_array($values)) {
-        return $values;
-    }
-
-    if (0 === count($values)) {
-        throw new Twig_Error_Runtime('The random function cannot pick from an empty array.');
-    }
-
-    return $values[array_rand($values, 1)];
-}
-
-/**
- * Converts a date to the given format.
- *
- * <pre>
- *   {{ post.published_at|date("m/d/Y") }}
- * </pre>
- *
- * @param Twig_Environment             $env      A Twig_Environment instance
- * @param DateTime|DateInterval|string $date     A date
- * @param string                       $format   A format
- * @param DateTimeZone|string          $timezone A timezone
- *
- * @return string The formatter date
- */
-function twig_date_format_filter(Twig_Environment $env, $date, $format = null, $timezone = null)
-{
-    if (null === $format) {
-        $formats = $env->getExtension('core')->getDateFormat();
-        $format = $date instanceof DateInterval ? $formats[1] : $formats[0];
-    }
-
-    if ($date instanceof DateInterval || $date instanceof DateTime) {
-        if (null !== $timezone) {
-            $date = clone $date;
-            $date->setTimezone($timezone instanceof DateTimeZone ? $timezone : new DateTimeZone($timezone));
-        }
-
-        return $date->format($format);
-    }
-
-    return twig_date_converter($env, $date, $timezone)->format($format);
-}
-
-/**
- * Converts an input to a DateTime instance.
- *
- * <pre>
- *    {% if date(user.created_at) < date('+2days') %}
- *      {# do something #}
- *    {% endif %}
- * </pre>
- *
- * @param Twig_Environment    $env      A Twig_Environment instance
- * @param DateTime|string     $date     A date
- * @param DateTimeZone|string $timezone A timezone
- *
- * @return DateTime A DateTime instance
- */
-function twig_date_converter(Twig_Environment $env, $date = null, $timezone = null)
-{
-    if (!$date instanceof DateTime) {
-        $asString = (string) $date;
-
-        if (ctype_digit($asString) || (!empty($asString) && '-' === $asString[0] && ctype_digit(substr($asString, 1)))) {
-            $date = new DateTime('@'.$date);
-        } else {
-            $date = new DateTime($date);
-        }
-    } else {
-        $date = clone $date;
-    }
-
-    // set Timezone
-    if (null !== $timezone) {
-        if ($timezone instanceof DateTimeZone) {
-            $date->setTimezone($timezone);
-        } else {
-            $date->setTimezone(new DateTimeZone($timezone));
-        }
-    } elseif (($timezone = $env->getExtension('core')->getTimezone()) instanceof DateTimeZone) {
-        $date->setTimezone($timezone);
-    } else {
-        $date->setTimezone(new DateTimeZone(date_default_timezone_get()));
-    }
-
-    return $date;
-}
-
-/**
- * Number format filter.
- *
- * All of the formatting options can be left null, in that case the defaults will
- * be used.  Supplying any of the parameters will override the defaults set in the
- * environment object.
- *
- * @param Twig_Environment    $env          A Twig_Environment instance
- * @param mixed               $number       A float/int/string of the number to format
- * @param int                 $decimal      The number of decimal points to display.
- * @param string              $decimalPoint The character(s) to use for the decimal point.
- * @param string              $thousandSep  The character(s) to use for the thousands separator.
- *
- * @return string The formatted number
- */
-function twig_number_format_filter(Twig_Environment $env, $number, $decimal = null, $decimalPoint = null, $thousandSep = null)
-{
-    $defaults = $env->getExtension('core')->getNumberFormat();
-    if (null === $decimal) {
-        $decimal = $defaults[0];
-    }
-
-    if (null === $decimalPoint) {
-        $decimalPoint = $defaults[1];
-    }
-
-    if (null === $thousandSep) {
-        $thousandSep = $defaults[2];
-    }
-
-    return number_format((float) $number, $decimal, $decimalPoint, $thousandSep);
-}
-
-/**
- * URL encodes a string.
- *
- * @param string $url A URL
- * @param bool   $raw true to use rawurlencode() instead of urlencode
- *
- * @return string The URL encoded value
- */
-function twig_urlencode_filter($url, $raw = false)
-{
-    if ($raw) {
-        return rawurlencode($url);
-    }
-
-    return urlencode($url);
-}
-
-if (version_compare(PHP_VERSION, '5.3.0', '<')) {
-    /**
-     * JSON encodes a variable.
-     *
-     * @param mixed   $value   The value to encode.
-     * @param integer $options Not used on PHP 5.2.x
-     *
-     * @return mixed The JSON encoded value
-     */
-    function twig_jsonencode_filter($value, $options = 0)
-    {
-        if ($value instanceof Twig_Markup) {
-            $value = (string) $value;
-        } elseif (is_array($value)) {
-            array_walk_recursive($value, '_twig_markup2string');
-        }
-
-        return json_encode($value);
-    }
-} else {
-    /**
-     * JSON encodes a variable.
-     *
-     * @param mixed   $value   The value to encode.
-     * @param integer $options Bitmask consisting of JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
-     *
-     * @return mixed The JSON encoded value
-     */
-    function twig_jsonencode_filter($value, $options = 0)
-    {
-        if ($value instanceof Twig_Markup) {
-            $value = (string) $value;
-        } elseif (is_array($value)) {
-            array_walk_recursive($value, '_twig_markup2string');
-        }
-
-        return json_encode($value, $options);
-    }
-}
-
-function _twig_markup2string(&$value)
-{
-    if ($value instanceof Twig_Markup) {
-        $value = (string) $value;
-    }
-}
-
-/**
- * Merges an array with another one.
- *
- * <pre>
- *  {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
- *
- *  {% set items = items|merge({ 'peugeot': 'car' }) %}
- *
- *  {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car' } #}
- * </pre>
- *
- * @param array $arr1 An array
- * @param array $arr2 An array
- *
- * @return array The merged array
- */
-function twig_array_merge($arr1, $arr2)
-{
-    if (!is_array($arr1) || !is_array($arr2)) {
-        throw new Twig_Error_Runtime('The merge filter only works with arrays or hashes.');
-    }
-
-    return array_merge($arr1, $arr2);
-}
-
-/**
- * Slices a variable.
- *
- * @param Twig_Environment $env          A Twig_Environment instance
- * @param mixed            $item         A variable
- * @param integer          $start        Start of the slice
- * @param integer          $length       Size of the slice
- * @param Boolean          $preserveKeys Whether to preserve key or not (when the input is an array)
- *
- * @return mixed The sliced variable
- */
-function twig_slice(Twig_Environment $env, $item, $start, $length = null, $preserveKeys = false)
-{
-    if ($item instanceof Traversable) {
-        $item = iterator_to_array($item, false);
-    }
-
-    if (is_array($item)) {
-        return array_slice($item, $start, $length, $preserveKeys);
-    }
-
-    $item = (string) $item;
-
-    if (function_exists('mb_get_info') && null !== $charset = $env->getCharset()) {
-        return mb_substr($item, $start, null === $length ? mb_strlen($item, $charset) - $start : $length, $charset);
-    }
-
-    return null === $length ? substr($item, $start) : substr($item, $start, $length);
-}
-
-/**
- * Joins the values to a string.
- *
- * The separator between elements is an empty string per default, you can define it with the optional parameter.
- *
- * <pre>
- *  {{ [1, 2, 3]|join('|') }}
- *  {# returns 1|2|3 #}
- *
- *  {{ [1, 2, 3]|join }}
- *  {# returns 123 #}
- * </pre>
- *
- * @param array  $value An array
- * @param string $glue  The separator
- *
- * @return string The concatenated string
- */
-function twig_join_filter($value, $glue = '')
-{
-    if ($value instanceof Traversable) {
-        $value = iterator_to_array($value, false);
-    }
-
-    return implode($glue, (array) $value);
-}
-
-// The '_default' filter is used internally to avoid using the ternary operator
-// which costs a lot for big contexts (before PHP 5.4). So, on average,
-// a function call is cheaper.
-function _twig_default_filter($value, $default = '')
-{
-    if (twig_test_empty($value)) {
-        return $default;
-    }
-
-    return $value;
-}
-
-/**
- * Returns the keys for the given array.
- *
- * It is useful when you want to iterate over the keys of an array:
- *
- * <pre>
- *  {% for key in array|keys %}
- *      {# ... #}
- *  {% endfor %}
- * </pre>
- *
- * @param array $array An array
- *
- * @return array The keys
- */
-function twig_get_array_keys_filter($array)
-{
-    if (is_object($array) && $array instanceof Traversable) {
-        return array_keys(iterator_to_array($array));
-    }
-
-    if (!is_array($array)) {
-        return array();
-    }
-
-    return array_keys($array);
-}
-
-/**
- * Reverses a variable.
- *
- * @param Twig_Environment         $env          A Twig_Environment instance
- * @param array|Traversable|string $item         An array, a Traversable instance, or a string
- * @param Boolean                  $preserveKeys Whether to preserve key or not
- *
- * @return mixed The reversed input
- */
-function twig_reverse_filter(Twig_Environment $env, $item, $preserveKeys = false)
-{
-    if (is_object($item) && $item instanceof Traversable) {
-        return array_reverse(iterator_to_array($item), $preserveKeys);
-    }
-
-    if (is_array($item)) {
-        return array_reverse($item, $preserveKeys);
-    }
-
-    if (null !== $charset = $env->getCharset()) {
-        $string = (string) $item;
-
-        if ('UTF-8' != $charset) {
-            $item = twig_convert_encoding($string, 'UTF-8', $charset);
-        }
-
-        preg_match_all('/./us', $item, $matches);
-
-        $string = implode('', array_reverse($matches[0]));
-
-        if ('UTF-8' != $charset) {
-            $string = twig_convert_encoding($string, $charset, 'UTF-8');
-        }
-
-        return $string;
-    }
-
-    return strrev((string) $item);
-}
-
-/**
- * Sorts an array.
- *
- * @param array $array An array
- */
-function twig_sort_filter($array)
-{
-    asort($array);
-
-    return $array;
-}
-
-/* used internally */
-function twig_in_filter($value, $compare)
-{
-    if (is_array($compare)) {
-        return in_array($value, $compare);
-    } elseif (is_string($compare)) {
-        if (!strlen((string) $value)) {
-            return empty($compare);
-        }
-
-        return false !== strpos($compare, (string) $value);
-    } elseif (is_object($compare) && $compare instanceof Traversable) {
-        return in_array($value, iterator_to_array($compare, false));
-    }
-
-    return false;
-}
-
-/**
- * Escapes a string.
- *
- * @param Twig_Environment $env        A Twig_Environment instance
- * @param string           $string     The value to be escaped
- * @param string           $strategy   The escaping strategy
- * @param string           $charset    The charset
- * @param Boolean          $autoescape Whether the function is called by the auto-escaping feature (true) or by the developer (false)
- */
-function twig_escape_filter(Twig_Environment $env, $string, $strategy = 'html', $charset = null, $autoescape = false)
-{
-    if ($autoescape && is_object($string) && $string instanceof Twig_Markup) {
-        return $string;
-    }
-
-    if (!is_string($string) && !(is_object($string) && method_exists($string, '__toString'))) {
-        return $string;
-    }
-
-    if (null === $charset) {
-        $charset = $env->getCharset();
-    }
-
-    $string = (string) $string;
-
-    switch ($strategy) {
-        case 'js':
-            // escape all non-alphanumeric characters
-            // into their \xHH or \uHHHH representations
-            if ('UTF-8' != $charset) {
-                $string = twig_convert_encoding($string, 'UTF-8', $charset);
-            }
-
-            if (null === $string = preg_replace_callback('#[^\p{L}\p{N} ]#u', '_twig_escape_js_callback', $string)) {
-                throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');
-            }
-
-            if ('UTF-8' != $charset) {
-                $string = twig_convert_encoding($string, $charset, 'UTF-8');
-            }
-
-            return $string;
-
-        case 'html':
-            // see http://php.net/htmlspecialchars
-
-            // Using a static variable to avoid initializing the array
-            // each time the function is called. Moving the declaration on the
-            // top of the function slow downs other escaping strategies.
-            static $htmlspecialcharsCharsets = array(
-                'iso-8859-1' => true, 'iso8859-1' => true,
-                'iso-8859-15' => true, 'iso8859-15' => true,
-                'utf-8' => true,
-                'cp866' => true, 'ibm866' => true, '866' => true,
-                'cp1251' => true, 'windows-1251' => true, 'win-1251' => true,
-                '1251' => true,
-                'cp1252' => true, 'windows-1252' => true, '1252' => true,
-                'koi8-r' => true, 'koi8-ru' => true, 'koi8r' => true,
-                'big5' => true, '950' => true,
-                'gb2312' => true, '936' => true,
-                'big5-hkscs' => true,
-                'shift_jis' => true, 'sjis' => true, '932' => true,
-                'euc-jp' => true, 'eucjp' => true,
-                'iso8859-5' => true, 'iso-8859-5' => true, 'macroman' => true,
-            );
-
-            if (isset($htmlspecialcharsCharsets[strtolower($charset)])) {
-                return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
-            }
-
-            $string = twig_convert_encoding($string, 'UTF-8', $charset);
-            $string = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
-
-            return twig_convert_encoding($string, $charset, 'UTF-8');
-
-        default:
-            throw new Twig_Error_Runtime(sprintf('Invalid escaping strategy "%s" (valid ones: html, js).', $strategy));
-    }
-}
-
-/* used internally */
-function twig_escape_filter_is_safe(Twig_Node $filterArgs)
-{
-    foreach ($filterArgs as $arg) {
-        if ($arg instanceof Twig_Node_Expression_Constant) {
-            return array($arg->getAttribute('value'));
-        }
-
-        return array();
-    }
-
-    return array('html');
-}
-
-if (function_exists('mb_convert_encoding')) {
-    function twig_convert_encoding($string, $to, $from)
-    {
-        return mb_convert_encoding($string, $to, $from);
-    }
-} elseif (function_exists('iconv')) {
-    function twig_convert_encoding($string, $to, $from)
-    {
-        return iconv($from, $to, $string);
-    }
-} else {
-    function twig_convert_encoding($string, $to, $from)
-    {
-        throw new Twig_Error_Runtime('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');
-    }
-}
-
-function _twig_escape_js_callback($matches)
-{
-    $char = $matches[0];
-
-    // \xHH
-    if (!isset($char[1])) {
-        return '\\x'.substr('00'.bin2hex($char), -2);
-    }
-
-    // \uHHHH
-    $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8');
-
-    return '\\u'.substr('0000'.bin2hex($char), -4);
-}
-
-// add multibyte extensions if possible
-if (function_exists('mb_get_info')) {
-    /**
-     * Returns the length of a variable.
-     *
-     * @param Twig_Environment $env   A Twig_Environment instance
-     * @param mixed            $thing A variable
-     *
-     * @return integer The length of the value
-     */
-    function twig_length_filter(Twig_Environment $env, $thing)
-    {
-        return is_scalar($thing) ? mb_strlen($thing, $env->getCharset()) : count($thing);
-    }
-
-    /**
-     * Converts a string to uppercase.
-     *
-     * @param Twig_Environment $env    A Twig_Environment instance
-     * @param string           $string A string
-     *
-     * @return string The uppercased string
-     */
-    function twig_upper_filter(Twig_Environment $env, $string)
-    {
-        if (null !== ($charset = $env->getCharset())) {
-            return mb_strtoupper($string, $charset);
-        }
-
-        return strtoupper($string);
-    }
-
-    /**
-     * Converts a string to lowercase.
-     *
-     * @param Twig_Environment $env    A Twig_Environment instance
-     * @param string           $string A string
-     *
-     * @return string The lowercased string
-     */
-    function twig_lower_filter(Twig_Environment $env, $string)
-    {
-        if (null !== ($charset = $env->getCharset())) {
-            return mb_strtolower($string, $charset);
-        }
-
-        return strtolower($string);
-    }
-
-    /**
-     * Returns a titlecased string.
-     *
-     * @param Twig_Environment $env    A Twig_Environment instance
-     * @param string           $string A string
-     *
-     * @return string The titlecased string
-     */
-    function twig_title_string_filter(Twig_Environment $env, $string)
-    {
-        if (null !== ($charset = $env->getCharset())) {
-            return mb_convert_case($string, MB_CASE_TITLE, $charset);
-        }
-
-        return ucwords(strtolower($string));
-    }
-
-    /**
-     * Returns a capitalized string.
-     *
-     * @param Twig_Environment $env    A Twig_Environment instance
-     * @param string           $string A string
-     *
-     * @return string The capitalized string
-     */
-    function twig_capitalize_string_filter(Twig_Environment $env, $string)
-    {
-        if (null !== ($charset = $env->getCharset())) {
-            return mb_strtoupper(mb_substr($string, 0, 1, $charset), $charset).
-                         mb_strtolower(mb_substr($string, 1, mb_strlen($string, $charset), $charset), $charset);
-        }
-
-        return ucfirst(strtolower($string));
-    }
-}
-// and byte fallback
-else
-{
-    /**
-     * Returns the length of a variable.
-     *
-     * @param Twig_Environment $env   A Twig_Environment instance
-     * @param mixed            $thing A variable
-     *
-     * @return integer The length of the value
-     */
-    function twig_length_filter(Twig_Environment $env, $thing)
-    {
-        return is_scalar($thing) ? strlen($thing) : count($thing);
-    }
-
-    /**
-     * Returns a titlecased string.
-     *
-     * @param Twig_Environment $env    A Twig_Environment instance
-     * @param string           $string A string
-     *
-     * @return string The titlecased string
-     */
-    function twig_title_string_filter(Twig_Environment $env, $string)
-    {
-        return ucwords(strtolower($string));
-    }
-
-    /**
-     * Returns a capitalized string.
-     *
-     * @param Twig_Environment $env    A Twig_Environment instance
-     * @param string           $string A string
-     *
-     * @return string The capitalized string
-     */
-    function twig_capitalize_string_filter(Twig_Environment $env, $string)
-    {
-        return ucfirst(strtolower($string));
-    }
-}
-
-/* used internally */
-function twig_ensure_traversable($seq)
-{
-    if ($seq instanceof Traversable || is_array($seq)) {
-        return $seq;
-    }
-
-    return array();
-}
-
-/**
- * Checks if a variable is empty.
- *
- * <pre>
- * {# evaluates to true if the foo variable is null, false, or the empty string #}
- * {% if foo is empty %}
- *     {# ... #}
- * {% endif %}
- * </pre>
- *
- * @param mixed $value A variable
- *
- * @return Boolean true if the value is empty, false otherwise
- */
-function twig_test_empty($value)
-{
-    if ($value instanceof Countable) {
-        return 0 == count($value);
-    }
-
-    return false === $value || (empty($value) && '0' != $value);
-}
-
-/**
- * Checks if a variable is traversable.
- *
- * <pre>
- * {# evaluates to true if the foo variable is an array or a traversable object #}
- * {% if foo is traversable %}
- *     {# ... #}
- * {% endif %}
- * </pre>
- *
- * @param mixed $value A variable
- *
- * @return Boolean true if the value is traversable
- */
-function twig_test_iterable($value)
-{
-    return $value instanceof Traversable || is_array($value);
-}
diff --git a/core/vendor/Twig/Extension/Debug.php b/core/vendor/Twig/Extension/Debug.php
deleted file mode 100644
index 8059df0..0000000
--- a/core/vendor/Twig/Extension/Debug.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Extension_Debug extends Twig_Extension
-{
-    /**
-     * Returns a list of global functions to add to the existing list.
-     *
-     * @return array An array of global functions
-     */
-    public function getFunctions()
-    {
-        // dump is safe if var_dump is overriden by xdebug
-        $isDumpOutputHtmlSafe = extension_loaded('xdebug')
-            // false means that it was not set (and the default is on) or it explicitly enabled
-            && (false === ini_get('xdebug.overload_var_dump') || ini_get('xdebug.overload_var_dump'))
-            // false means that it was not set (and the default is on) or it explicitly enabled
-            // xdebug.overload_var_dump produces HTML only when html_errors is also enabled
-            && (false === ini_get('html_errors') || ini_get('html_errors'))
-        ;
-
-        return array(
-            'dump' => new Twig_Function_Function('twig_var_dump', array('is_safe' => $isDumpOutputHtmlSafe ? array('html') : array(), 'needs_context' => true, 'needs_environment' => true)),
-        );
-    }
-
-    /**
-     * Returns the name of the extension.
-     *
-     * @return string The extension name
-     */
-    public function getName()
-    {
-        return 'debug';
-    }
-}
-
-function twig_var_dump(Twig_Environment $env, $context)
-{
-    if (!$env->isDebug()) {
-        return;
-    }
-
-    ob_start();
-
-    $count = func_num_args();
-    if (2 === $count) {
-        $vars = array();
-        foreach ($context as $key => $value) {
-            if (!$value instanceof Twig_Template) {
-                $vars[$key] = $value;
-            }
-        }
-
-        var_dump($vars);
-    } else {
-        for ($i = 2; $i < $count; $i++) {
-            var_dump(func_get_arg($i));
-        }
-    }
-
-    return ob_get_clean();
-}
diff --git a/core/vendor/Twig/Extension/Escaper.php b/core/vendor/Twig/Extension/Escaper.php
deleted file mode 100644
index b0aa8b1..0000000
--- a/core/vendor/Twig/Extension/Escaper.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Extension_Escaper extends Twig_Extension
-{
-    protected $defaultStrategy;
-
-    public function __construct($defaultStrategy = 'html')
-    {
-        $this->setDefaultStrategy($defaultStrategy);
-    }
-
-    /**
-     * Returns the token parser instances to add to the existing list.
-     *
-     * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
-     */
-    public function getTokenParsers()
-    {
-        return array(new Twig_TokenParser_AutoEscape());
-    }
-
-    /**
-     * Returns the node visitor instances to add to the existing list.
-     *
-     * @return array An array of Twig_NodeVisitorInterface instances
-     */
-    public function getNodeVisitors()
-    {
-        return array(new Twig_NodeVisitor_Escaper());
-    }
-
-    /**
-     * Returns a list of filters to add to the existing list.
-     *
-     * @return array An array of filters
-     */
-    public function getFilters()
-    {
-        return array(
-            'raw' => new Twig_Filter_Function('twig_raw_filter', array('is_safe' => array('all'))),
-        );
-    }
-
-    /**
-     * Sets the default strategy to use when not defined by the user.
-     *
-     * The strategy can be a valid PHP callback that takes the template
-     * "filename" as an argument and returns the strategy to use.
-     *
-     * @param mixed $defaultStrategy An escaping strategy
-     */
-    public function setDefaultStrategy($defaultStrategy)
-    {
-        // for BC
-        if (true === $defaultStrategy) {
-            $defaultStrategy = 'html';
-        }
-
-        $this->defaultStrategy = $defaultStrategy;
-    }
-
-    /**
-     * Gets the default strategy to use when not defined by the user.
-     *
-     * @param string $filename The template "filename"
-     *
-     * @return string The default strategy to use for the template
-     */
-    public function getDefaultStrategy($filename)
-    {
-        if (is_callable($this->defaultStrategy)) {
-            return call_user_func($this->defaultStrategy, $filename);
-        }
-
-        return $this->defaultStrategy;
-    }
-
-    /**
-     * Returns the name of the extension.
-     *
-     * @return string The extension name
-     */
-    public function getName()
-    {
-        return 'escaper';
-    }
-}
-
-/**
- * Marks a variable as being safe.
- *
- * @param string $string A PHP variable
- */
-function twig_raw_filter($string)
-{
-    return $string;
-}
-
diff --git a/core/vendor/Twig/Extension/Optimizer.php b/core/vendor/Twig/Extension/Optimizer.php
deleted file mode 100644
index 013fcb6..0000000
--- a/core/vendor/Twig/Extension/Optimizer.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Extension_Optimizer extends Twig_Extension
-{
-    protected $optimizers;
-
-    public function __construct($optimizers = -1)
-    {
-        $this->optimizers = $optimizers;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getNodeVisitors()
-    {
-        return array(new Twig_NodeVisitor_Optimizer($this->optimizers));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getName()
-    {
-        return 'optimizer';
-    }
-}
diff --git a/core/vendor/Twig/Extension/Sandbox.php b/core/vendor/Twig/Extension/Sandbox.php
deleted file mode 100644
index bf76c11..0000000
--- a/core/vendor/Twig/Extension/Sandbox.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Extension_Sandbox extends Twig_Extension
-{
-    protected $sandboxedGlobally;
-    protected $sandboxed;
-    protected $policy;
-
-    public function __construct(Twig_Sandbox_SecurityPolicyInterface $policy, $sandboxed = false)
-    {
-        $this->policy            = $policy;
-        $this->sandboxedGlobally = $sandboxed;
-    }
-
-    /**
-     * Returns the token parser instances to add to the existing list.
-     *
-     * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
-     */
-    public function getTokenParsers()
-    {
-        return array(new Twig_TokenParser_Sandbox());
-    }
-
-    /**
-     * Returns the node visitor instances to add to the existing list.
-     *
-     * @return array An array of Twig_NodeVisitorInterface instances
-     */
-    public function getNodeVisitors()
-    {
-        return array(new Twig_NodeVisitor_Sandbox());
-    }
-
-    public function enableSandbox()
-    {
-        $this->sandboxed = true;
-    }
-
-    public function disableSandbox()
-    {
-        $this->sandboxed = false;
-    }
-
-    public function isSandboxed()
-    {
-        return $this->sandboxedGlobally || $this->sandboxed;
-    }
-
-    public function isSandboxedGlobally()
-    {
-        return $this->sandboxedGlobally;
-    }
-
-    public function setSecurityPolicy(Twig_Sandbox_SecurityPolicyInterface $policy)
-    {
-        $this->policy = $policy;
-    }
-
-    public function getSecurityPolicy()
-    {
-        return $this->policy;
-    }
-
-    public function checkSecurity($tags, $filters, $functions)
-    {
-        if ($this->isSandboxed()) {
-            $this->policy->checkSecurity($tags, $filters, $functions);
-        }
-    }
-
-    public function checkMethodAllowed($obj, $method)
-    {
-        if ($this->isSandboxed()) {
-            $this->policy->checkMethodAllowed($obj, $method);
-        }
-    }
-
-    public function checkPropertyAllowed($obj, $method)
-    {
-        if ($this->isSandboxed()) {
-            $this->policy->checkPropertyAllowed($obj, $method);
-        }
-    }
-
-    public function ensureToStringAllowed($obj)
-    {
-        if (is_object($obj)) {
-            $this->policy->checkMethodAllowed($obj, '__toString');
-        }
-
-        return $obj;
-    }
-
-    /**
-     * Returns the name of the extension.
-     *
-     * @return string The extension name
-     */
-    public function getName()
-    {
-        return 'sandbox';
-    }
-}
diff --git a/core/vendor/Twig/ExtensionInterface.php b/core/vendor/Twig/ExtensionInterface.php
deleted file mode 100644
index 0bfed88..0000000
--- a/core/vendor/Twig/ExtensionInterface.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by extension classes.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_ExtensionInterface
-{
-    /**
-     * Initializes the runtime environment.
-     *
-     * This is where you can load some file that contains filter functions for instance.
-     *
-     * @param Twig_Environment $environment The current Twig_Environment instance
-     */
-    function initRuntime(Twig_Environment $environment);
-
-    /**
-     * Returns the token parser instances to add to the existing list.
-     *
-     * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
-     */
-    function getTokenParsers();
-
-    /**
-     * Returns the node visitor instances to add to the existing list.
-     *
-     * @return array An array of Twig_NodeVisitorInterface instances
-     */
-    function getNodeVisitors();
-
-    /**
-     * Returns a list of filters to add to the existing list.
-     *
-     * @return array An array of filters
-     */
-    function getFilters();
-
-    /**
-     * Returns a list of tests to add to the existing list.
-     *
-     * @return array An array of tests
-     */
-    function getTests();
-
-    /**
-     * Returns a list of functions to add to the existing list.
-     *
-     * @return array An array of functions
-     */
-    function getFunctions();
-
-    /**
-     * Returns a list of operators to add to the existing list.
-     *
-     * @return array An array of operators
-     */
-    function getOperators();
-
-    /**
-     * Returns a list of global variables to add to the existing list.
-     *
-     * @return array An array of global variables
-     */
-    function getGlobals();
-
-    /**
-     * Returns the name of the extension.
-     *
-     * @return string The extension name
-     */
-    function getName();
-}
diff --git a/core/vendor/Twig/Filter.php b/core/vendor/Twig/Filter.php
deleted file mode 100644
index 1a4806c..0000000
--- a/core/vendor/Twig/Filter.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template filter.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-abstract class Twig_Filter implements Twig_FilterInterface
-{
-    protected $options;
-    protected $arguments = array();
-
-    public function __construct(array $options = array())
-    {
-        $this->options = array_merge(array(
-            'needs_environment' => false,
-            'needs_context'     => false,
-            'pre_escape'        => null,
-            'preserves_safety'  => null,
-        ), $options);
-    }
-
-    public function setArguments($arguments)
-    {
-        $this->arguments = $arguments;
-    }
-
-    public function getArguments()
-    {
-        return $this->arguments;
-    }
-
-    public function needsEnvironment()
-    {
-        return $this->options['needs_environment'];
-    }
-
-    public function needsContext()
-    {
-        return $this->options['needs_context'];
-    }
-
-    public function getSafe(Twig_Node $filterArgs)
-    {
-        if (isset($this->options['is_safe'])) {
-            return $this->options['is_safe'];
-        }
-
-        if (isset($this->options['is_safe_callback'])) {
-            return call_user_func($this->options['is_safe_callback'], $filterArgs);
-        }
-
-        return null;
-    }
-
-    public function getPreservesSafety()
-    {
-        return $this->options['preserves_safety'];
-    }
-
-    public function getPreEscape()
-    {
-        return $this->options['pre_escape'];
-    }
-}
diff --git a/core/vendor/Twig/Filter/Function.php b/core/vendor/Twig/Filter/Function.php
deleted file mode 100644
index 1de078b..0000000
--- a/core/vendor/Twig/Filter/Function.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a function template filter.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Filter_Function extends Twig_Filter
-{
-    protected $function;
-
-    public function __construct($function, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->function = $function;
-    }
-
-    public function compile()
-    {
-        return $this->function;
-    }
-}
diff --git a/core/vendor/Twig/Filter/Method.php b/core/vendor/Twig/Filter/Method.php
deleted file mode 100644
index a680f61..0000000
--- a/core/vendor/Twig/Filter/Method.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a method template filter.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Filter_Method extends Twig_Filter
-{
-    protected $extension;
-    protected $method;
-
-    public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->extension = $extension;
-        $this->method = $method;
-    }
-
-    public function compile()
-    {
-        return sprintf('$this->env->getExtension(\'%s\')->%s', $this->extension->getName(), $this->method);
-    }
-}
diff --git a/core/vendor/Twig/Filter/Node.php b/core/vendor/Twig/Filter/Node.php
deleted file mode 100644
index 7481c05..0000000
--- a/core/vendor/Twig/Filter/Node.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template filter as a node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Filter_Node extends Twig_Filter
-{
-    protected $class;
-
-    public function __construct($class, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->class = $class;
-    }
-
-    public function getClass()
-    {
-        return $this->class;
-    }
-
-    public function compile()
-    {
-    }
-}
diff --git a/core/vendor/Twig/FilterInterface.php b/core/vendor/Twig/FilterInterface.php
deleted file mode 100644
index f398026..0000000
--- a/core/vendor/Twig/FilterInterface.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template filter.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_FilterInterface
-{
-    /**
-     * Compiles a filter.
-     *
-     * @return string The PHP code for the filter
-     */
-    function compile();
-
-    function needsEnvironment();
-
-    function needsContext();
-
-    function getSafe(Twig_Node $filterArgs);
-
-    function getPreservesSafety();
-
-    function getPreEscape();
-
-    function setArguments($arguments);
-
-    function getArguments();
-}
diff --git a/core/vendor/Twig/Function.php b/core/vendor/Twig/Function.php
deleted file mode 100644
index cd7643f..0000000
--- a/core/vendor/Twig/Function.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template function.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-abstract class Twig_Function implements Twig_FunctionInterface
-{
-    protected $options;
-    protected $arguments = array();
-
-    public function __construct(array $options = array())
-    {
-        $this->options = array_merge(array(
-            'needs_environment' => false,
-            'needs_context'     => false,
-        ), $options);
-    }
-
-    public function setArguments($arguments)
-    {
-        $this->arguments = $arguments;
-    }
-
-    public function getArguments()
-    {
-        return $this->arguments;
-    }
-
-    public function needsEnvironment()
-    {
-        return $this->options['needs_environment'];
-    }
-
-    public function needsContext()
-    {
-        return $this->options['needs_context'];
-    }
-
-    public function getSafe(Twig_Node $functionArgs)
-    {
-        if (isset($this->options['is_safe'])) {
-            return $this->options['is_safe'];
-        }
-
-        if (isset($this->options['is_safe_callback'])) {
-            return call_user_func($this->options['is_safe_callback'], $functionArgs);
-        }
-
-        return array();
-    }
-}
diff --git a/core/vendor/Twig/Function/Function.php b/core/vendor/Twig/Function/Function.php
deleted file mode 100644
index 3237d8c..0000000
--- a/core/vendor/Twig/Function/Function.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2010 Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a function template function.
- *
- * @package    twig
- * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
- */
-class Twig_Function_Function extends Twig_Function
-{
-    protected $function;
-
-    public function __construct($function, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->function = $function;
-    }
-
-    public function compile()
-    {
-        return $this->function;
-    }
-}
diff --git a/core/vendor/Twig/Function/Method.php b/core/vendor/Twig/Function/Method.php
deleted file mode 100644
index 8838618..0000000
--- a/core/vendor/Twig/Function/Method.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2010 Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a method template function.
- *
- * @package    twig
- * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
- */
-class Twig_Function_Method extends Twig_Function
-{
-    protected $extension;
-    protected $method;
-
-    public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->extension = $extension;
-        $this->method = $method;
-    }
-
-    public function compile()
-    {
-        return sprintf('$this->env->getExtension(\'%s\')->%s', $this->extension->getName(), $this->method);
-    }
-}
diff --git a/core/vendor/Twig/Function/Node.php b/core/vendor/Twig/Function/Node.php
deleted file mode 100644
index a687a84..0000000
--- a/core/vendor/Twig/Function/Node.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template function as a node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Function_Node extends Twig_Filter
-{
-    protected $class;
-
-    public function __construct($class, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->class = $class;
-    }
-
-    public function getClass()
-    {
-        return $this->class;
-    }
-
-    public function compile()
-    {
-    }
-}
diff --git a/core/vendor/Twig/FunctionInterface.php b/core/vendor/Twig/FunctionInterface.php
deleted file mode 100644
index d402d17..0000000
--- a/core/vendor/Twig/FunctionInterface.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- * (c) 2010 Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template function.
- *
- * @package    twig
- * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
- */
-interface Twig_FunctionInterface
-{
-    /**
-     * Compiles a function.
-     *
-     * @return string The PHP code for the function
-     */
-    function compile();
-
-    function needsEnvironment();
-
-    function needsContext();
-
-    function getSafe(Twig_Node $filterArgs);
-
-    function setArguments($arguments);
-
-    function getArguments();
-}
diff --git a/core/vendor/Twig/LICENSE b/core/vendor/Twig/LICENSE
deleted file mode 100644
index 5063d8d..0000000
--- a/core/vendor/Twig/LICENSE
+++ /dev/null
@@ -1,31 +0,0 @@
-Copyright (c) 2009 by the Twig Team, see AUTHORS for more details.
-
-Some rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-
-    * The names of the contributors may not be used to endorse or
-      promote products derived from this software without specific
-      prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/core/vendor/Twig/Lexer.php b/core/vendor/Twig/Lexer.php
deleted file mode 100644
index d77071d..0000000
--- a/core/vendor/Twig/Lexer.php
+++ /dev/null
@@ -1,406 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Lexes a template string.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Lexer implements Twig_LexerInterface
-{
-    protected $tokens;
-    protected $code;
-    protected $cursor;
-    protected $lineno;
-    protected $end;
-    protected $state;
-    protected $states;
-    protected $brackets;
-    protected $env;
-    protected $filename;
-    protected $options;
-    protected $regexes;
-    protected $position;
-    protected $positions;
-
-    const STATE_DATA            = 0;
-    const STATE_BLOCK           = 1;
-    const STATE_VAR             = 2;
-    const STATE_STRING          = 3;
-    const STATE_INTERPOLATION   = 4;
-
-    const REGEX_NAME            = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A';
-    const REGEX_NUMBER          = '/[0-9]+(?:\.[0-9]+)?/A';
-    const REGEX_STRING          = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
-    const REGEX_DQ_STRING_DELIM = '/"/A';
-    const REGEX_DQ_STRING_PART  = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As';
-    const PUNCTUATION           = '()[]{}?:.,|';
-
-    public function __construct(Twig_Environment $env, array $options = array())
-    {
-        $this->env = $env;
-
-        $this->options = array_merge(array(
-            'tag_comment'     => array('{#', '#}'),
-            'tag_block'       => array('{%', '%}'),
-            'tag_variable'    => array('{{', '}}'),
-            'whitespace_trim' => '-',
-            'interpolation'   => array('#{', '}'),
-        ), $options);
-
-        $this->regexes = array(
-            'lex_var'             => '/\s*'.preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_variable'][1], '/').'/A',
-            'lex_block'           => '/\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')\n?/A',
-            'lex_raw_data'        => '/('.preg_quote($this->options['tag_block'][0].$this->options['whitespace_trim'], '/').'|'.preg_quote($this->options['tag_block'][0], '/').')\s*endraw\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/s',
-            'operator'            => $this->getOperatorRegex(),
-            'lex_comment'         => '/(?:'.preg_quote($this->options['whitespace_trim'], '/').preg_quote($this->options['tag_comment'][1], '/').'\s*|'.preg_quote($this->options['tag_comment'][1], '/').')\n?/s',
-            'lex_block_raw'       => '/\s*raw\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/As',
-            'lex_block_line'      => '/\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '/').'/As',
-            'lex_tokens_start'    => '/('.preg_quote($this->options['tag_variable'][0], '/').'|'.preg_quote($this->options['tag_block'][0], '/').'|'.preg_quote($this->options['tag_comment'][0], '/').')('.preg_quote($this->options['whitespace_trim'], '/').')?/s',
-            'interpolation_start' => '/'.preg_quote($this->options['interpolation'][0], '/').'\s*/A',
-            'interpolation_end'   => '/\s*'.preg_quote($this->options['interpolation'][1], '/').'/A',
-        );
-    }
-
-    /**
-     * Tokenizes a source code.
-     *
-     * @param string $code     The source code
-     * @param string $filename A unique identifier for the source code
-     *
-     * @return Twig_TokenStream A token stream instance
-     */
-    public function tokenize($code, $filename = null)
-    {
-        if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
-            $mbEncoding = mb_internal_encoding();
-            mb_internal_encoding('ASCII');
-        }
-
-        $this->code = str_replace(array("\r\n", "\r"), "\n", $code);
-        $this->filename = $filename;
-        $this->cursor = 0;
-        $this->lineno = 1;
-        $this->end = strlen($this->code);
-        $this->tokens = array();
-        $this->state = self::STATE_DATA;
-        $this->states = array();
-        $this->brackets = array();
-        $this->position = -1;
-
-        // find all token starts in one go
-        preg_match_all($this->regexes['lex_tokens_start'], $this->code, $matches, PREG_OFFSET_CAPTURE);
-        $this->positions = $matches;
-
-        while ($this->cursor < $this->end) {
-            // dispatch to the lexing functions depending
-            // on the current state
-            switch ($this->state) {
-                case self::STATE_DATA:
-                    $this->lexData();
-                    break;
-
-                case self::STATE_BLOCK:
-                    $this->lexBlock();
-                    break;
-
-                case self::STATE_VAR:
-                    $this->lexVar();
-                    break;
-
-                case self::STATE_STRING:
-                    $this->lexString();
-                    break;
-
-                case self::STATE_INTERPOLATION:
-                    $this->lexInterpolation();
-                    break;
-            }
-        }
-
-        $this->pushToken(Twig_Token::EOF_TYPE);
-
-        if (!empty($this->brackets)) {
-            list($expect, $lineno) = array_pop($this->brackets);
-            throw new Twig_Error_Syntax(sprintf('Unclosed "%s"', $expect), $lineno, $this->filename);
-        }
-
-        if (isset($mbEncoding)) {
-            mb_internal_encoding($mbEncoding);
-        }
-
-        return new Twig_TokenStream($this->tokens, $this->filename);
-    }
-
-    protected function lexData()
-    {
-        // if no matches are left we return the rest of the template as simple text token
-        if ($this->position == count($this->positions[0]) - 1) {
-            $this->pushToken(Twig_Token::TEXT_TYPE, substr($this->code, $this->cursor));
-            $this->cursor = $this->end;
-
-            return;
-        }
-
-        // Find the first token after the current cursor
-        $position = $this->positions[0][++$this->position];
-        while ($position[1] < $this->cursor) {
-            if ($this->position == count($this->positions[0]) - 1) {
-                return;
-            }
-            $position = $this->positions[0][++$this->position];
-        }
-
-        // push the template text first
-        $text = $textContent = substr($this->code, $this->cursor, $position[1] - $this->cursor);
-        if (isset($this->positions[2][$this->position][0])) {
-            $text = rtrim($text);
-        }
-        $this->pushToken(Twig_Token::TEXT_TYPE, $text);
-        $this->moveCursor($textContent.$position[0]);
-
-        switch ($this->positions[1][$this->position][0]) {
-            case $this->options['tag_comment'][0]:
-                $this->lexComment();
-                break;
-
-            case $this->options['tag_block'][0]:
-                // raw data?
-                if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, null, $this->cursor)) {
-                    $this->moveCursor($match[0]);
-                    $this->lexRawData();
-                // {% line \d+ %}
-                } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, null, $this->cursor)) {
-                    $this->moveCursor($match[0]);
-                    $this->lineno = (int) $match[1];
-                } else {
-                    $this->pushToken(Twig_Token::BLOCK_START_TYPE);
-                    $this->pushState(self::STATE_BLOCK);
-                }
-                break;
-
-            case $this->options['tag_variable'][0]:
-                $this->pushToken(Twig_Token::VAR_START_TYPE);
-                $this->pushState(self::STATE_VAR);
-                break;
-        }
-    }
-
-    protected function lexBlock()
-    {
-        if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::BLOCK_END_TYPE);
-            $this->moveCursor($match[0]);
-            $this->popState();
-        } else {
-            $this->lexExpression();
-        }
-    }
-
-    protected function lexVar()
-    {
-        if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::VAR_END_TYPE);
-            $this->moveCursor($match[0]);
-            $this->popState();
-        } else {
-            $this->lexExpression();
-        }
-    }
-
-    protected function lexExpression()
-    {
-        // whitespace
-        if (preg_match('/\s+/A', $this->code, $match, null, $this->cursor)) {
-            $this->moveCursor($match[0]);
-
-            if ($this->cursor >= $this->end) {
-                throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "%s"', $this->state === self::STATE_BLOCK ? 'block' : 'variable'), $this->lineno, $this->filename);
-            }
-        }
-
-        // operators
-        if (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::OPERATOR_TYPE, $match[0]);
-            $this->moveCursor($match[0]);
-        }
-        // names
-        elseif (preg_match(self::REGEX_NAME, $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::NAME_TYPE, $match[0]);
-            $this->moveCursor($match[0]);
-        }
-        // numbers
-        elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) {
-            $number = (float) $match[0];  // floats
-            if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
-                $number = (int) $match[0]; // integers lower than the maximum
-            }
-            $this->pushToken(Twig_Token::NUMBER_TYPE, $number);
-            $this->moveCursor($match[0]);
-        }
-        // punctuation
-        elseif (false !== strpos(self::PUNCTUATION, $this->code[$this->cursor])) {
-            // opening bracket
-            if (false !== strpos('([{', $this->code[$this->cursor])) {
-                $this->brackets[] = array($this->code[$this->cursor], $this->lineno);
-            }
-            // closing bracket
-            elseif (false !== strpos(')]}', $this->code[$this->cursor])) {
-                if (empty($this->brackets)) {
-                    throw new Twig_Error_Syntax(sprintf('Unexpected "%s"', $this->code[$this->cursor]), $this->lineno, $this->filename);
-                }
-
-                list($expect, $lineno) = array_pop($this->brackets);
-                if ($this->code[$this->cursor] != strtr($expect, '([{', ')]}')) {
-                    throw new Twig_Error_Syntax(sprintf('Unclosed "%s"', $expect), $lineno, $this->filename);
-                }
-            }
-
-            $this->pushToken(Twig_Token::PUNCTUATION_TYPE, $this->code[$this->cursor]);
-            ++$this->cursor;
-        }
-        // strings
-        elseif (preg_match(self::REGEX_STRING, $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1)));
-            $this->moveCursor($match[0]);
-        }
-        // opening double quoted string
-        elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
-            $this->brackets[] = array('"', $this->lineno);
-            $this->pushState(self::STATE_STRING);
-            $this->moveCursor($match[0]);
-        }
-        // unlexable
-        else {
-            throw new Twig_Error_Syntax(sprintf('Unexpected character "%s"', $this->code[$this->cursor]), $this->lineno, $this->filename);
-        }
-    }
-
-    protected function lexRawData()
-    {
-        if (!preg_match($this->regexes['lex_raw_data'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
-            throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "block"'), $this->lineno, $this->filename);
-        }
-
-        $text = substr($this->code, $this->cursor, $match[0][1] - $this->cursor);
-        $this->moveCursor($text.$match[0][0]);
-
-        if (false !== strpos($match[1][0], $this->options['whitespace_trim'])) {
-            $text = rtrim($text);
-        }
-
-        $this->pushToken(Twig_Token::TEXT_TYPE, $text);
-    }
-
-    protected function lexComment()
-    {
-        if (!preg_match($this->regexes['lex_comment'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
-            throw new Twig_Error_Syntax('Unclosed comment', $this->lineno, $this->filename);
-        }
-
-        $this->moveCursor(substr($this->code, $this->cursor, $match[0][1] - $this->cursor).$match[0][0]);
-    }
-
-    protected function lexString()
-    {
-        if (preg_match($this->regexes['interpolation_start'], $this->code, $match, null, $this->cursor)) {
-            $this->brackets[] = array($this->options['interpolation'][0], $this->lineno);
-            $this->pushToken(Twig_Token::INTERPOLATION_START_TYPE);
-            $this->moveCursor($match[0]);
-            $this->pushState(self::STATE_INTERPOLATION);
-
-        } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, null, $this->cursor) && strlen($match[0]) > 0) {
-            $this->pushToken(Twig_Token::STRING_TYPE, stripcslashes($match[0]));
-            $this->moveCursor($match[0]);
-
-        } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
-
-            list($expect, $lineno) = array_pop($this->brackets);
-            if ($this->code[$this->cursor] != '"') {
-                throw new Twig_Error_Syntax(sprintf('Unclosed "%s"', $expect), $lineno, $this->filename);
-            }
-
-            $this->popState();
-            ++$this->cursor;
-        }
-    }
-
-    protected function lexInterpolation()
-    {
-        $bracket = end($this->brackets);
-        if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, null, $this->cursor)) {
-            array_pop($this->brackets);
-            $this->pushToken(Twig_Token::INTERPOLATION_END_TYPE);
-            $this->moveCursor($match[0]);
-            $this->popState();
-        } else {
-            $this->lexExpression();
-        }
-    }
-
-    protected function pushToken($type, $value = '')
-    {
-        // do not push empty text tokens
-        if (Twig_Token::TEXT_TYPE === $type && '' === $value) {
-            return;
-        }
-
-        $this->tokens[] = new Twig_Token($type, $value, $this->lineno);
-    }
-
-    protected function moveCursor($text)
-    {
-        $this->cursor += strlen($text);
-        $this->lineno += substr_count($text, "\n");
-    }
-
-    protected function getOperatorRegex()
-    {
-        $operators = array_merge(
-            array('='),
-            array_keys($this->env->getUnaryOperators()),
-            array_keys($this->env->getBinaryOperators())
-        );
-
-        $operators = array_combine($operators, array_map('strlen', $operators));
-        arsort($operators);
-
-        $regex = array();
-        foreach ($operators as $operator => $length) {
-            // an operator that ends with a character must be followed by
-            // a whitespace or a parenthesis
-            if (ctype_alpha($operator[$length - 1])) {
-                $regex[] = preg_quote($operator, '/').'(?=[\s()])';
-            } else {
-                $regex[] = preg_quote($operator, '/');
-            }
-        }
-
-        return '/'.implode('|', $regex).'/A';
-    }
-
-    protected function pushState($state)
-    {
-        $this->states[] = $this->state;
-        $this->state = $state;
-    }
-
-    protected function popState()
-    {
-        if (0 === count($this->states)) {
-            throw new Exception('Cannot pop state without a previous state');
-        }
-
-        $this->state = array_pop($this->states);
-    }
-}
diff --git a/core/vendor/Twig/LexerInterface.php b/core/vendor/Twig/LexerInterface.php
deleted file mode 100644
index 2bec235..0000000
--- a/core/vendor/Twig/LexerInterface.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by lexer classes.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_LexerInterface
-{
-    /**
-     * Tokenizes a source code.
-     *
-     * @param string $code     The source code
-     * @param string $filename A unique identifier for the source code
-     *
-     * @return Twig_TokenStream A token stream instance
-     */
-    function tokenize($code, $filename = null);
-}
diff --git a/core/vendor/Twig/Loader/Array.php b/core/vendor/Twig/Loader/Array.php
deleted file mode 100644
index 8776264..0000000
--- a/core/vendor/Twig/Loader/Array.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Loads a template from an array.
- *
- * When using this loader with a cache mechanism, you should know that a new cache
- * key is generated each time a template content "changes" (the cache key being the
- * source code of the template). If you don't want to see your cache grows out of
- * control, you need to take care of clearing the old cache file by yourself.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Loader_Array implements Twig_LoaderInterface
-{
-    protected $templates;
-
-    /**
-     * Constructor.
-     *
-     * @param array $templates An array of templates (keys are the names, and values are the source code)
-     *
-     * @see Twig_Loader
-     */
-    public function __construct(array $templates)
-    {
-        $this->templates = array();
-        foreach ($templates as $name => $template) {
-            $this->templates[$name] = $template;
-        }
-    }
-
-    /**
-     * Adds or overrides a template.
-     *
-     * @param string $name     The template name
-     * @param string $template The template source
-     */
-    public function setTemplate($name, $template)
-    {
-        $this->templates[(string) $name] = $template;
-    }
-
-    /**
-     * Gets the source code of a template, given its name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The template source code
-     */
-    public function getSource($name)
-    {
-        $name = (string) $name;
-        if (!isset($this->templates[$name])) {
-            throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-        }
-
-        return $this->templates[$name];
-    }
-
-    /**
-     * Gets the cache key to use for the cache for a given template name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The cache key
-     */
-    public function getCacheKey($name)
-    {
-        $name = (string) $name;
-        if (!isset($this->templates[$name])) {
-            throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-        }
-
-        return $this->templates[$name];
-    }
-
-    /**
-     * Returns true if the template is still fresh.
-     *
-     * @param string    $name The template name
-     * @param timestamp $time The last modification time of the cached template
-     */
-    public function isFresh($name, $time)
-    {
-        $name = (string) $name;
-        if (!isset($this->templates[$name])) {
-            throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-        }
-
-        return true;
-    }
-}
diff --git a/core/vendor/Twig/Loader/Chain.php b/core/vendor/Twig/Loader/Chain.php
deleted file mode 100644
index a044905..0000000
--- a/core/vendor/Twig/Loader/Chain.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Loads templates from other loaders.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Loader_Chain implements Twig_LoaderInterface
-{
-    protected $loaders;
-
-    /**
-     * Constructor.
-     *
-     * @param Twig_LoaderInterface[] $loaders An array of loader instances
-     */
-    public function __construct(array $loaders = array())
-    {
-        $this->loaders = array();
-        foreach ($loaders as $loader) {
-            $this->addLoader($loader);
-        }
-    }
-
-    /**
-     * Adds a loader instance.
-     *
-     * @param Twig_LoaderInterface $loader A Loader instance
-     */
-    public function addLoader(Twig_LoaderInterface $loader)
-    {
-        $this->loaders[] = $loader;
-    }
-
-    /**
-     * Gets the source code of a template, given its name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The template source code
-     */
-    public function getSource($name)
-    {
-        foreach ($this->loaders as $loader) {
-            try {
-                return $loader->getSource($name);
-            } catch (Twig_Error_Loader $e) {
-            }
-        }
-
-        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-    }
-
-    /**
-     * Gets the cache key to use for the cache for a given template name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The cache key
-     */
-    public function getCacheKey($name)
-    {
-        foreach ($this->loaders as $loader) {
-            try {
-                return $loader->getCacheKey($name);
-            } catch (Twig_Error_Loader $e) {
-            }
-        }
-
-        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-    }
-
-    /**
-     * Returns true if the template is still fresh.
-     *
-     * @param string    $name The template name
-     * @param timestamp $time The last modification time of the cached template
-     */
-    public function isFresh($name, $time)
-    {
-        foreach ($this->loaders as $loader) {
-            try {
-                return $loader->isFresh($name, $time);
-            } catch (Twig_Error_Loader $e) {
-            }
-        }
-
-        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-    }
-}
diff --git a/core/vendor/Twig/Loader/Filesystem.php b/core/vendor/Twig/Loader/Filesystem.php
deleted file mode 100644
index fd93219..0000000
--- a/core/vendor/Twig/Loader/Filesystem.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Loads template from the filesystem.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Loader_Filesystem implements Twig_LoaderInterface
-{
-    protected $paths;
-    protected $cache;
-
-    /**
-     * Constructor.
-     *
-     * @param string|array $paths A path or an array of paths where to look for templates
-     */
-    public function __construct($paths)
-    {
-        $this->setPaths($paths);
-    }
-
-    /**
-     * Returns the paths to the templates.
-     *
-     * @return array The array of paths where to look for templates
-     */
-    public function getPaths()
-    {
-        return $this->paths;
-    }
-
-    /**
-     * Sets the paths where templates are stored.
-     *
-     * @param string|array $paths A path or an array of paths where to look for templates
-     */
-    public function setPaths($paths)
-    {
-        if (!is_array($paths)) {
-            $paths = array($paths);
-        }
-
-        $this->paths = array();
-        foreach ($paths as $path) {
-            $this->addPath($path);
-        }
-    }
-
-    /**
-     * Adds a path where templates are stored.
-     *
-     * @param string $path A path where to look for templates
-     */
-    public function addPath($path)
-    {
-        // invalidate the cache
-        $this->cache = array();
-
-        if (!is_dir($path)) {
-            throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path));
-        }
-
-        $this->paths[] = $path;
-    }
-
-    /**
-     * Gets the source code of a template, given its name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The template source code
-     */
-    public function getSource($name)
-    {
-        return file_get_contents($this->findTemplate($name));
-    }
-
-    /**
-     * Gets the cache key to use for the cache for a given template name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The cache key
-     */
-    public function getCacheKey($name)
-    {
-        return $this->findTemplate($name);
-    }
-
-    /**
-     * Returns true if the template is still fresh.
-     *
-     * @param string    $name The template name
-     * @param timestamp $time The last modification time of the cached template
-     */
-    public function isFresh($name, $time)
-    {
-        return filemtime($this->findTemplate($name)) <= $time;
-    }
-
-    protected function findTemplate($name)
-    {
-        // normalize name
-        $name = preg_replace('#/{2,}#', '/', strtr($name, '\\', '/'));
-
-        if (isset($this->cache[$name])) {
-            return $this->cache[$name];
-        }
-
-        $this->validateName($name);
-
-        foreach ($this->paths as $path) {
-            if (is_file($path.'/'.$name)) {
-                return $this->cache[$name] = $path.'/'.$name;
-            }
-        }
-
-        throw new Twig_Error_Loader(sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths)));
-    }
-
-    protected function validateName($name)
-    {
-        if (false !== strpos($name, "\0")) {
-            throw new Twig_Error_Loader('A template name cannot contain NUL bytes.');
-        }
-
-        $parts = explode('/', $name);
-        $level = 0;
-        foreach ($parts as $part) {
-            if ('..' === $part) {
-                --$level;
-            } elseif ('.' !== $part) {
-                ++$level;
-            }
-
-            if ($level < 0) {
-                throw new Twig_Error_Loader(sprintf('Looks like you try to load a template outside configured directories (%s).', $name));
-            }
-        }
-    }
-}
diff --git a/core/vendor/Twig/Loader/String.php b/core/vendor/Twig/Loader/String.php
deleted file mode 100644
index bc792b1..0000000
--- a/core/vendor/Twig/Loader/String.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Loads a template from a string.
- *
- * When using this loader with a cache mechanism, you should know that a new cache
- * key is generated each time a template content "changes" (the cache key being the
- * source code of the template). If you don't want to see your cache grows out of
- * control, you need to take care of clearing the old cache file by yourself.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Loader_String implements Twig_LoaderInterface
-{
-    /**
-     * Gets the source code of a template, given its name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The template source code
-     */
-    public function getSource($name)
-    {
-        return $name;
-    }
-
-    /**
-     * Gets the cache key to use for the cache for a given template name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The cache key
-     */
-    public function getCacheKey($name)
-    {
-        return $name;
-    }
-
-    /**
-     * Returns true if the template is still fresh.
-     *
-     * @param string    $name The template name
-     * @param timestamp $time The last modification time of the cached template
-     */
-    public function isFresh($name, $time)
-    {
-        return true;
-    }
-}
diff --git a/core/vendor/Twig/LoaderInterface.php b/core/vendor/Twig/LoaderInterface.php
deleted file mode 100644
index 55e3ac6..0000000
--- a/core/vendor/Twig/LoaderInterface.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface all loaders must implement.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_LoaderInterface
-{
-    /**
-     * Gets the source code of a template, given its name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The template source code
-     *
-     * @throws Twig_Error_Loader When $name is not found
-     */
-    function getSource($name);
-
-    /**
-     * Gets the cache key to use for the cache for a given template name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The cache key
-     *
-     * @throws Twig_Error_Loader When $name is not found
-     */
-    function getCacheKey($name);
-
-    /**
-     * Returns true if the template is still fresh.
-     *
-     * @param string    $name The template name
-     * @param timestamp $time The last modification time of the cached template
-     *
-     * @return Boolean true if the template is fresh, false otherwise
-     *
-     * @throws Twig_Error_Loader When $name is not found
-     */
-    function isFresh($name, $time);
-}
diff --git a/core/vendor/Twig/Markup.php b/core/vendor/Twig/Markup.php
deleted file mode 100644
index 7099b29..0000000
--- a/core/vendor/Twig/Markup.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Marks a content as safe.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Markup implements Countable
-{
-    protected $content;
-    protected $charset;
-
-    public function __construct($content, $charset)
-    {
-        $this->content = (string) $content;
-        $this->charset = $charset;
-    }
-
-    public function __toString()
-    {
-        return $this->content;
-    }
-
-    public function count()
-    {
-        return function_exists('mb_get_info') ? mb_strlen($this->content, $this->charset) : strlen($this->content);
-    }
-}
diff --git a/core/vendor/Twig/Node.php b/core/vendor/Twig/Node.php
deleted file mode 100644
index 651ffc4..0000000
--- a/core/vendor/Twig/Node.php
+++ /dev/null
@@ -1,227 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a node in the AST.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node implements Twig_NodeInterface
-{
-    protected $nodes;
-    protected $attributes;
-    protected $lineno;
-    protected $tag;
-
-    /**
-     * Constructor.
-     *
-     * The nodes are automatically made available as properties ($this->node).
-     * The attributes are automatically made available as array items ($this['name']).
-     *
-     * @param array   $nodes      An array of named nodes
-     * @param array   $attributes An array of attributes (should not be nodes)
-     * @param integer $lineno     The line number
-     * @param string  $tag        The tag name associated with the Node
-     */
-    public function __construct(array $nodes = array(), array $attributes = array(), $lineno = 0, $tag = null)
-    {
-        $this->nodes = $nodes;
-        $this->attributes = $attributes;
-        $this->lineno = $lineno;
-        $this->tag = $tag;
-    }
-
-    public function __toString()
-    {
-        $attributes = array();
-        foreach ($this->attributes as $name => $value) {
-            $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
-        }
-
-        $repr = array(get_class($this).'('.implode(', ', $attributes));
-
-        if (count($this->nodes)) {
-            foreach ($this->nodes as $name => $node) {
-                $len = strlen($name) + 4;
-                $noderepr = array();
-                foreach (explode("\n", (string) $node) as $line) {
-                    $noderepr[] = str_repeat(' ', $len).$line;
-                }
-
-                $repr[] = sprintf('  %s: %s', $name, ltrim(implode("\n", $noderepr)));
-            }
-
-            $repr[] = ')';
-        } else {
-            $repr[0] .= ')';
-        }
-
-        return implode("\n", $repr);
-    }
-
-    public function toXml($asDom = false)
-    {
-        $dom = new DOMDocument('1.0', 'UTF-8');
-        $dom->formatOutput = true;
-        $dom->appendChild($xml = $dom->createElement('twig'));
-
-        $xml->appendChild($node = $dom->createElement('node'));
-        $node->setAttribute('class', get_class($this));
-
-        foreach ($this->attributes as $name => $value) {
-            $node->appendChild($attribute = $dom->createElement('attribute'));
-            $attribute->setAttribute('name', $name);
-            $attribute->appendChild($dom->createTextNode($value));
-        }
-
-        foreach ($this->nodes as $name => $n) {
-            if (null === $n) {
-                continue;
-            }
-
-            $child = $n->toXml(true)->getElementsByTagName('node')->item(0);
-            $child = $dom->importNode($child, true);
-            $child->setAttribute('name', $name);
-
-            $node->appendChild($child);
-        }
-
-        return $asDom ? $dom : $dom->saveXml();
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        foreach ($this->nodes as $node) {
-            $node->compile($compiler);
-        }
-    }
-
-    public function getLine()
-    {
-        return $this->lineno;
-    }
-
-    public function getNodeTag()
-    {
-        return $this->tag;
-    }
-
-    /**
-     * Returns true if the attribute is defined.
-     *
-     * @param  string  The attribute name
-     *
-     * @return Boolean true if the attribute is defined, false otherwise
-     */
-    public function hasAttribute($name)
-    {
-        return array_key_exists($name, $this->attributes);
-    }
-
-    /**
-     * Gets an attribute.
-     *
-     * @param  string The attribute name
-     *
-     * @return mixed  The attribute value
-     */
-    public function getAttribute($name)
-    {
-        if (!array_key_exists($name, $this->attributes)) {
-            throw new Twig_Error_Runtime(sprintf('Attribute "%s" does not exist for Node "%s".', $name, get_class($this)));
-        }
-
-        return $this->attributes[$name];
-    }
-
-    /**
-     * Sets an attribute.
-     *
-     * @param string The attribute name
-     * @param mixed  The attribute value
-     */
-    public function setAttribute($name, $value)
-    {
-        $this->attributes[$name] = $value;
-    }
-
-    /**
-     * Removes an attribute.
-     *
-     * @param string The attribute name
-     */
-    public function removeAttribute($name)
-    {
-        unset($this->attributes[$name]);
-    }
-
-    /**
-     * Returns true if the node with the given identifier exists.
-     *
-     * @param  string  The node name
-     *
-     * @return Boolean true if the node with the given name exists, false otherwise
-     */
-    public function hasNode($name)
-    {
-        return array_key_exists($name, $this->nodes);
-    }
-
-    /**
-     * Gets a node by name.
-     *
-     * @param  string The node name
-     *
-     * @return Twig_Node A Twig_Node instance
-     */
-    public function getNode($name)
-    {
-        if (!array_key_exists($name, $this->nodes)) {
-            throw new Twig_Error_Runtime(sprintf('Node "%s" does not exist for Node "%s".', $name, get_class($this)));
-        }
-
-        return $this->nodes[$name];
-    }
-
-    /**
-     * Sets a node.
-     *
-     * @param string    The node name
-     * @param Twig_Node A Twig_Node instance
-     */
-    public function setNode($name, $node = null)
-    {
-        $this->nodes[$name] = $node;
-    }
-
-    /**
-     * Removes a node by name.
-     *
-     * @param string The node name
-     */
-    public function removeNode($name)
-    {
-        unset($this->nodes[$name]);
-    }
-
-    public function count()
-    {
-        return count($this->nodes);
-    }
-
-    public function getIterator()
-    {
-        return new ArrayIterator($this->nodes);
-    }
-}
diff --git a/core/vendor/Twig/Node/AutoEscape.php b/core/vendor/Twig/Node/AutoEscape.php
deleted file mode 100644
index a0c2ee6..0000000
--- a/core/vendor/Twig/Node/AutoEscape.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents an autoescape node.
- *
- * The value is the escaping strategy (can be html, js, ...)
- *
- * The true value is equivalent to html.
- *
- * If autoescaping is disabled, then the value is false.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_AutoEscape extends Twig_Node
-{
-    public function __construct($value, Twig_NodeInterface $body, $lineno, $tag = 'autoescape')
-    {
-        parent::__construct(array('body' => $body), array('value' => $value), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->subcompile($this->getNode('body'));
-    }
-}
diff --git a/core/vendor/Twig/Node/Block.php b/core/vendor/Twig/Node/Block.php
deleted file mode 100644
index 5548ad0..0000000
--- a/core/vendor/Twig/Node/Block.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a block node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Block extends Twig_Node
-{
-    public function __construct($name, Twig_NodeInterface $body, $lineno, $tag = null)
-    {
-        parent::__construct(array('body' => $body), array('name' => $name), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write(sprintf("public function block_%s(\$context, array \$blocks = array())\n", $this->getAttribute('name')), "{\n")
-            ->indent()
-        ;
-
-        $compiler
-            ->subcompile($this->getNode('body'))
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/BlockReference.php b/core/vendor/Twig/Node/BlockReference.php
deleted file mode 100644
index 53f6287..0000000
--- a/core/vendor/Twig/Node/BlockReference.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a block call node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_BlockReference extends Twig_Node implements Twig_NodeOutputInterface
-{
-    public function __construct($name, $lineno, $tag = null)
-    {
-        parent::__construct(array(), array('name' => $name), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write(sprintf("\$this->displayBlock('%s', \$context, \$blocks);\n", $this->getAttribute('name')))
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Body.php b/core/vendor/Twig/Node/Body.php
deleted file mode 100644
index f72bf50..0000000
--- a/core/vendor/Twig/Node/Body.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a body node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Body extends Twig_Node
-{
-}
diff --git a/core/vendor/Twig/Node/Do.php b/core/vendor/Twig/Node/Do.php
deleted file mode 100644
index aa419d9..0000000
--- a/core/vendor/Twig/Node/Do.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a do node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Do extends Twig_Node
-{
-    public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
-    {
-        parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('')
-            ->subcompile($this->getNode('expr'))
-            ->raw(";\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Embed.php b/core/vendor/Twig/Node/Embed.php
deleted file mode 100644
index 5edb953..0000000
--- a/core/vendor/Twig/Node/Embed.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2012 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents an embed node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Embed extends Twig_Node_Include
-{
-    // we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module)
-    public function __construct($filename, $index, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
-    {
-        parent::__construct(new Twig_Node_Expression_Constant('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag);
-
-        $this->setAttribute('filename', $filename);
-        $this->setAttribute('index', $index);
-    }
-
-    protected function addGetTemplate(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("\$this->env->loadTemplate(")
-            ->string($this->getAttribute('filename'))
-            ->raw(', ')
-            ->string($this->getAttribute('index'))
-            ->raw(")")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression.php b/core/vendor/Twig/Node/Expression.php
deleted file mode 100644
index 13b170e..0000000
--- a/core/vendor/Twig/Node/Expression.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Abstract class for all nodes that represents an expression.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-abstract class Twig_Node_Expression extends Twig_Node
-{
-}
diff --git a/core/vendor/Twig/Node/Expression/Array.php b/core/vendor/Twig/Node/Expression/Array.php
deleted file mode 100644
index 1da785f..0000000
--- a/core/vendor/Twig/Node/Expression/Array.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Array extends Twig_Node_Expression
-{
-    protected $index;
-
-    public function __construct(array $elements, $lineno)
-    {
-        parent::__construct($elements, array(), $lineno);
-
-        $this->index = -1;
-        foreach ($this->getKeyValuePairs() as $pair) {
-            if ($pair['key'] instanceof Twig_Node_Expression_Constant && ctype_digit((string) $pair['key']->getAttribute('value')) && $pair['key']->getAttribute('value') > $this->index) {
-                $this->index = $pair['key']->getAttribute('value');
-            }
-        }
-    }
-
-    public function getKeyValuePairs()
-    {
-        $pairs = array();
-
-        foreach (array_chunk($this->nodes, 2) as $pair) {
-            $pairs[] = array(
-                'key' => $pair[0],
-                'value' => $pair[1],
-            );
-        }
-
-        return $pairs;
-    }
-
-    public function hasElement(Twig_Node_Expression $key)
-    {
-        foreach ($this->getKeyValuePairs() as $pair) {
-            // we compare the string representation of the keys
-            // to avoid comparing the line numbers which are not relevant here.
-            if ((string) $key == (string) $pair['key']) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public function addElement(Twig_Node_Expression $value, Twig_Node_Expression $key = null)
-    {
-        if (null === $key) {
-            $key = new Twig_Node_Expression_Constant(++$this->index, $value->getLine());
-        }
-
-        array_push($this->nodes, $key, $value);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->raw('array(');
-        $first = true;
-        foreach ($this->getKeyValuePairs() as $pair) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $first = false;
-
-            $compiler
-                ->subcompile($pair['key'])
-                ->raw(' => ')
-                ->subcompile($pair['value'])
-            ;
-        }
-        $compiler->raw(')');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/AssignName.php b/core/vendor/Twig/Node/Expression/AssignName.php
deleted file mode 100644
index 2ddea78..0000000
--- a/core/vendor/Twig/Node/Expression/AssignName.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-class Twig_Node_Expression_AssignName extends Twig_Node_Expression_Name
-{
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('$context[')
-            ->string($this->getAttribute('name'))
-            ->raw(']')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary.php b/core/vendor/Twig/Node/Expression/Binary.php
deleted file mode 100644
index 9dd5de2..0000000
--- a/core/vendor/Twig/Node/Expression/Binary.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-abstract class Twig_Node_Expression_Binary extends Twig_Node_Expression
-{
-    public function __construct(Twig_NodeInterface $left, Twig_NodeInterface $right, $lineno)
-    {
-        parent::__construct(array('left' => $left, 'right' => $right), array(), $lineno);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('left'))
-            ->raw(' ')
-        ;
-        $this->operator($compiler);
-        $compiler
-            ->raw(' ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
-
-    abstract public function operator(Twig_Compiler $compiler);
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Add.php b/core/vendor/Twig/Node/Expression/Binary/Add.php
deleted file mode 100644
index 0ef8e11..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Add.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Add extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('+');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/And.php b/core/vendor/Twig/Node/Expression/Binary/And.php
deleted file mode 100644
index d5752eb..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/And.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_And extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('&&');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/BitwiseAnd.php b/core/vendor/Twig/Node/Expression/Binary/BitwiseAnd.php
deleted file mode 100644
index 9a46d84..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/BitwiseAnd.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_BitwiseAnd extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('&');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/BitwiseOr.php b/core/vendor/Twig/Node/Expression/Binary/BitwiseOr.php
deleted file mode 100644
index 058a20b..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/BitwiseOr.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_BitwiseOr extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('|');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/BitwiseXor.php b/core/vendor/Twig/Node/Expression/Binary/BitwiseXor.php
deleted file mode 100644
index f4da73d..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/BitwiseXor.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_BitwiseXor extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('^');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Concat.php b/core/vendor/Twig/Node/Expression/Binary/Concat.php
deleted file mode 100644
index f9a6462..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Concat.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Concat extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('.');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Div.php b/core/vendor/Twig/Node/Expression/Binary/Div.php
deleted file mode 100644
index e0797a6..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Div.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Div extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('/');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Equal.php b/core/vendor/Twig/Node/Expression/Binary/Equal.php
deleted file mode 100644
index 7b1236d..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Equal.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Equal extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('==');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/FloorDiv.php b/core/vendor/Twig/Node/Expression/Binary/FloorDiv.php
deleted file mode 100644
index 7fbd055..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/FloorDiv.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_FloorDiv extends Twig_Node_Expression_Binary
-{
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->raw('intval(floor(');
-        parent::compile($compiler);
-        $compiler->raw('))');
-    }
-
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('/');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Greater.php b/core/vendor/Twig/Node/Expression/Binary/Greater.php
deleted file mode 100644
index a110bd9..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Greater.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Greater extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('>');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/GreaterEqual.php b/core/vendor/Twig/Node/Expression/Binary/GreaterEqual.php
deleted file mode 100644
index 3754fed..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/GreaterEqual.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_GreaterEqual extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('>=');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/In.php b/core/vendor/Twig/Node/Expression/Binary/In.php
deleted file mode 100644
index 788f937..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/In.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_In extends Twig_Node_Expression_Binary
-{
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('twig_in_filter(')
-            ->subcompile($this->getNode('left'))
-            ->raw(', ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
-
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('in');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Less.php b/core/vendor/Twig/Node/Expression/Binary/Less.php
deleted file mode 100644
index 45fd300..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Less.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Less extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('<');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/LessEqual.php b/core/vendor/Twig/Node/Expression/Binary/LessEqual.php
deleted file mode 100644
index e38e257..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/LessEqual.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_LessEqual extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('<=');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Mod.php b/core/vendor/Twig/Node/Expression/Binary/Mod.php
deleted file mode 100644
index 9924114..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Mod.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Mod extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('%');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Mul.php b/core/vendor/Twig/Node/Expression/Binary/Mul.php
deleted file mode 100644
index c91529c..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Mul.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Mul extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('*');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/NotEqual.php b/core/vendor/Twig/Node/Expression/Binary/NotEqual.php
deleted file mode 100644
index 26867ba..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/NotEqual.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_NotEqual extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('!=');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/NotIn.php b/core/vendor/Twig/Node/Expression/Binary/NotIn.php
deleted file mode 100644
index f347b7b..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/NotIn.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_NotIn extends Twig_Node_Expression_Binary
-{
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('!twig_in_filter(')
-            ->subcompile($this->getNode('left'))
-            ->raw(', ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
-
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('not in');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Or.php b/core/vendor/Twig/Node/Expression/Binary/Or.php
deleted file mode 100644
index adba49c..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Or.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Or extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('||');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Power.php b/core/vendor/Twig/Node/Expression/Binary/Power.php
deleted file mode 100644
index b2c5904..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Power.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Power extends Twig_Node_Expression_Binary
-{
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('pow(')
-            ->subcompile($this->getNode('left'))
-            ->raw(', ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
-
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('**');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Range.php b/core/vendor/Twig/Node/Expression/Binary/Range.php
deleted file mode 100644
index bea4f2a..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Range.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Range extends Twig_Node_Expression_Binary
-{
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('range(')
-            ->subcompile($this->getNode('left'))
-            ->raw(', ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
-
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('..');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Binary/Sub.php b/core/vendor/Twig/Node/Expression/Binary/Sub.php
deleted file mode 100644
index d446399..0000000
--- a/core/vendor/Twig/Node/Expression/Binary/Sub.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Sub extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        return $compiler->raw('-');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/BlockReference.php b/core/vendor/Twig/Node/Expression/BlockReference.php
deleted file mode 100644
index 174d909..0000000
--- a/core/vendor/Twig/Node/Expression/BlockReference.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a block call node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_BlockReference extends Twig_Node_Expression
-{
-    public function __construct(Twig_NodeInterface $name, $asString = false, $lineno, $tag = null)
-    {
-        parent::__construct(array('name' => $name), array('as_string' => $asString, 'output' => false), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        if ($this->getAttribute('as_string')) {
-            $compiler->raw('(string) ');
-        }
-
-        if ($this->getAttribute('output')) {
-            $compiler
-                ->addDebugInfo($this)
-                ->write("\$this->displayBlock(")
-                ->subcompile($this->getNode('name'))
-                ->raw(", \$context, \$blocks);\n")
-            ;
-        } else {
-            $compiler
-                ->raw("\$this->renderBlock(")
-                ->subcompile($this->getNode('name'))
-                ->raw(", \$context, \$blocks)")
-            ;
-        }
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Conditional.php b/core/vendor/Twig/Node/Expression/Conditional.php
deleted file mode 100644
index edcb1e2..0000000
--- a/core/vendor/Twig/Node/Expression/Conditional.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Conditional extends Twig_Node_Expression
-{
-    public function __construct(Twig_Node_Expression $expr1, Twig_Node_Expression $expr2, Twig_Node_Expression $expr3, $lineno)
-    {
-        parent::__construct(array('expr1' => $expr1, 'expr2' => $expr2, 'expr3' => $expr3), array(), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('((')
-            ->subcompile($this->getNode('expr1'))
-            ->raw(') ? (')
-            ->subcompile($this->getNode('expr2'))
-            ->raw(') : (')
-            ->subcompile($this->getNode('expr3'))
-            ->raw('))')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Constant.php b/core/vendor/Twig/Node/Expression/Constant.php
deleted file mode 100644
index a91dc69..0000000
--- a/core/vendor/Twig/Node/Expression/Constant.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Constant extends Twig_Node_Expression
-{
-    public function __construct($value, $lineno)
-    {
-        parent::__construct(array(), array('value' => $value), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->repr($this->getAttribute('value'));
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/ExtensionReference.php b/core/vendor/Twig/Node/Expression/ExtensionReference.php
deleted file mode 100644
index cb4efad..0000000
--- a/core/vendor/Twig/Node/Expression/ExtensionReference.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents an extension call node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_ExtensionReference extends Twig_Node_Expression
-{
-    public function __construct($name, $lineno, $tag = null)
-    {
-        parent::__construct(array(), array('name' => $name), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->raw(sprintf("\$this->env->getExtension('%s')", $this->getAttribute('name')));
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Filter.php b/core/vendor/Twig/Node/Expression/Filter.php
deleted file mode 100644
index 8a0903a..0000000
--- a/core/vendor/Twig/Node/Expression/Filter.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Filter extends Twig_Node_Expression
-{
-    public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null)
-    {
-        parent::__construct(array('node' => $node, 'filter' => $filterName, 'arguments' => $arguments), array(), $lineno, $tag);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getNode('filter')->getAttribute('value');
-
-        if (false === $filter = $compiler->getEnvironment()->getFilter($name)) {
-            $message = sprintf('The filter "%s" does not exist', $name);
-            if ($alternatives = $compiler->getEnvironment()->computeAlternatives($name, array_keys($compiler->getEnvironment()->getFilters()))) {
-                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
-            }
-
-            throw new Twig_Error_Syntax($message, $this->getLine());
-        }
-
-        $this->compileFilter($compiler, $filter);
-    }
-
-    protected function compileFilter(Twig_Compiler $compiler, Twig_FilterInterface $filter)
-    {
-        $compiler
-            ->raw($filter->compile().'(')
-            ->raw($filter->needsEnvironment() ? '$this->env, ' : '')
-            ->raw($filter->needsContext() ? '$context, ' : '')
-        ;
-
-        foreach ($filter->getArguments() as $argument) {
-            $compiler
-                ->string($argument)
-                ->raw(', ')
-            ;
-        }
-
-        $compiler->subcompile($this->getNode('node'));
-
-        foreach ($this->getNode('arguments') as $node) {
-            $compiler
-                ->raw(', ')
-                ->subcompile($node)
-            ;
-        }
-
-        $compiler->raw(')');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Filter/Default.php b/core/vendor/Twig/Node/Expression/Filter/Default.php
deleted file mode 100644
index 1cb3342..0000000
--- a/core/vendor/Twig/Node/Expression/Filter/Default.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Returns the value or the default value when it is undefined or empty.
- *
- * <pre>
- *  {{ var.foo|default('foo item on var is not defined') }}
- * </pre>
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Filter_Default extends Twig_Node_Expression_Filter
-{
-    public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null)
-    {
-        $default = new Twig_Node_Expression_Filter($node, new Twig_Node_Expression_Constant('_default', $node->getLine()), $arguments, $node->getLine());
-
-        if ('default' === $filterName->getAttribute('value') && ($node instanceof Twig_Node_Expression_Name || $node instanceof Twig_Node_Expression_GetAttr)) {
-            $test = new Twig_Node_Expression_Test_Defined(clone $node, 'defined', new Twig_Node(), $node->getLine());
-            $false = count($arguments) ? $arguments->getNode(0) : new Twig_Node_Expression_Constant('', $node->getLine());
-
-            $node = new Twig_Node_Expression_Conditional($test, $default, $false, $node->getLine());
-        } else {
-            $node = $default;
-        }
-
-        parent::__construct($node, $filterName, $arguments, $lineno, $tag);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->subcompile($this->getNode('node'));
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Function.php b/core/vendor/Twig/Node/Expression/Function.php
deleted file mode 100644
index 9342bb1..0000000
--- a/core/vendor/Twig/Node/Expression/Function.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Function extends Twig_Node_Expression
-{
-    public function __construct($name, Twig_NodeInterface $arguments, $lineno)
-    {
-        parent::__construct(array('arguments' => $arguments), array('name' => $name), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getAttribute('name');
-
-        if (false === $function = $compiler->getEnvironment()->getFunction($name)) {
-            $message = sprintf('The function "%s" does not exist', $name);
-            if ($alternatives = $compiler->getEnvironment()->computeAlternatives($name, array_keys($compiler->getEnvironment()->getFunctions()))) {
-                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
-            }
-
-            throw new Twig_Error_Syntax($message, $this->getLine());
-        }
-
-        $compiler->raw($function->compile().'(');
-
-        $first = true;
-
-        if ($function->needsEnvironment()) {
-            $compiler->raw('$this->env');
-            $first = false;
-        }
-
-        if ($function->needsContext()) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $compiler->raw('$context');
-            $first = false;
-        }
-
-        foreach ($function->getArguments() as $argument) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $compiler->string($argument);
-            $first = false;
-        }
-
-        foreach ($this->getNode('arguments') as $node) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $compiler->subcompile($node);
-            $first = false;
-        }
-
-        $compiler->raw(')');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/GetAttr.php b/core/vendor/Twig/Node/Expression/GetAttr.php
deleted file mode 100644
index 6498444..0000000
--- a/core/vendor/Twig/Node/Expression/GetAttr.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_GetAttr extends Twig_Node_Expression
-{
-    public function __construct(Twig_Node_Expression $node, Twig_Node_Expression $attribute, Twig_Node_Expression_Array $arguments, $type, $lineno)
-    {
-        parent::__construct(array('node' => $node, 'attribute' => $attribute, 'arguments' => $arguments), array('type' => $type, 'is_defined_test' => false, 'ignore_strict_check' => false), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        if (function_exists('twig_template_get_attributes')) {
-            $compiler->raw('twig_template_get_attributes($this, ');
-        } else {
-            $compiler->raw('$this->getAttribute(');
-        }
-
-        if ($this->getAttribute('ignore_strict_check')) {
-            $this->getNode('node')->setAttribute('ignore_strict_check', true);
-        }
-
-        $compiler->subcompile($this->getNode('node'));
-
-        $compiler->raw(', ')->subcompile($this->getNode('attribute'));
-
-        if (count($this->getNode('arguments')) || Twig_TemplateInterface::ANY_CALL !== $this->getAttribute('type') || $this->getAttribute('is_defined_test') || $this->getAttribute('ignore_strict_check')) {
-            $compiler->raw(', ')->subcompile($this->getNode('arguments'));
-
-            if (Twig_TemplateInterface::ANY_CALL !== $this->getAttribute('type') || $this->getAttribute('is_defined_test') || $this->getAttribute('ignore_strict_check')) {
-                $compiler->raw(', ')->repr($this->getAttribute('type'));
-            }
-
-            if ($this->getAttribute('is_defined_test') || $this->getAttribute('ignore_strict_check')) {
-                $compiler->raw(', '.($this->getAttribute('is_defined_test') ? 'true' : 'false'));
-            }
-
-            if ($this->getAttribute('ignore_strict_check')) {
-                $compiler->raw(', '.($this->getAttribute('ignore_strict_check') ? 'true' : 'false'));
-            }
-        }
-
-        $compiler->raw(')');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/MethodCall.php b/core/vendor/Twig/Node/Expression/MethodCall.php
deleted file mode 100644
index 5093808..0000000
--- a/core/vendor/Twig/Node/Expression/MethodCall.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2012 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_MethodCall extends Twig_Node_Expression
-{
-    public function __construct(Twig_Node_Expression $node, $method, Twig_Node_Expression_Array $arguments, $lineno)
-    {
-        parent::__construct(array('node' => $node, 'arguments' => $arguments), array('method' => $method, 'safe' => false), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->subcompile($this->getNode('node'))
-            ->raw('->')
-            ->raw($this->getAttribute('method'))
-            ->raw('(')
-        ;
-        $first = true;
-        foreach ($this->getNode('arguments')->getKeyValuePairs() as $pair) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $first = false;
-
-            $compiler->subcompile($pair['value']);
-        }
-        $compiler->raw(')');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Name.php b/core/vendor/Twig/Node/Expression/Name.php
deleted file mode 100644
index 8f5a1ea..0000000
--- a/core/vendor/Twig/Node/Expression/Name.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Name extends Twig_Node_Expression
-{
-    protected $specialVars = array(
-        '_self'    => '$this',
-        '_context' => '$context',
-        '_charset' => '$this->env->getCharset()',
-    );
-
-    public function __construct($name, $lineno)
-    {
-        parent::__construct(array(), array('name' => $name, 'is_defined_test' => false, 'ignore_strict_check' => false), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getAttribute('name');
-
-        if ($this->getAttribute('is_defined_test')) {
-            if ($this->isSpecial()) {
-                $compiler->repr(true);
-            } else {
-                $compiler->raw('array_key_exists(')->repr($name)->raw(', $context)');
-            }
-        } elseif ($this->isSpecial()) {
-            $compiler->raw($this->specialVars[$name]);
-        } else {
-            // remove the non-PHP 5.4 version when PHP 5.3 support is dropped
-            // as the non-optimized version is just a workaround for slow ternary operator
-            // when the context has a lot of variables
-            if (version_compare(phpversion(), '5.4.0RC1', '>=') && ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables())) {
-                // PHP 5.4 ternary operator performance was optimized
-                $compiler
-                    ->raw('(isset($context[')
-                    ->string($name)
-                    ->raw(']) ? $context[')
-                    ->string($name)
-                    ->raw('] : null)')
-                ;
-            } else {
-                $compiler
-                    ->raw('$this->getContext($context, ')
-                    ->string($name)
-                ;
-
-                if ($this->getAttribute('ignore_strict_check')) {
-                    $compiler->raw(', true');
-                }
-
-                $compiler
-                    ->raw(')')
-                ;
-            }
-        }
-    }
-
-    public function isSpecial()
-    {
-        return isset($this->specialVars[$this->getAttribute('name')]);
-    }
-
-    public function isSimple()
-    {
-        return !$this->isSpecial() && !$this->getAttribute('is_defined_test');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Parent.php b/core/vendor/Twig/Node/Expression/Parent.php
deleted file mode 100644
index ea97349..0000000
--- a/core/vendor/Twig/Node/Expression/Parent.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a parent node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Parent extends Twig_Node_Expression
-{
-    public function __construct($name, $lineno, $tag = null)
-    {
-        parent::__construct(array(), array('output' => false, 'name' => $name), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        if ($this->getAttribute('output')) {
-            $compiler
-                ->addDebugInfo($this)
-                ->write("\$this->displayParentBlock(")
-                ->string($this->getAttribute('name'))
-                ->raw(", \$context, \$blocks);\n")
-            ;
-        } else {
-            $compiler
-                ->raw("\$this->renderParentBlock(")
-                ->string($this->getAttribute('name'))
-                ->raw(", \$context, \$blocks)")
-            ;
-        }
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/TempName.php b/core/vendor/Twig/Node/Expression/TempName.php
deleted file mode 100644
index e6b058e..0000000
--- a/core/vendor/Twig/Node/Expression/TempName.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_TempName extends Twig_Node_Expression
-{
-    public function __construct($name, $lineno)
-    {
-        parent::__construct(array(), array('name' => $name), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('$_')
-            ->raw($this->getAttribute('name'))
-            ->raw('_')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Test.php b/core/vendor/Twig/Node/Expression/Test.php
deleted file mode 100644
index 4e0b25e..0000000
--- a/core/vendor/Twig/Node/Expression/Test.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Test extends Twig_Node_Expression
-{
-    public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
-    {
-        parent::__construct(array('node' => $node, 'arguments' => $arguments), array('name' => $name), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getAttribute('name');
-        $testMap = $compiler->getEnvironment()->getTests();
-        if (!isset($testMap[$name])) {
-            $message = sprintf('The test "%s" does not exist', $name);
-            if ($alternatives = $compiler->getEnvironment()->computeAlternatives($name, array_keys($compiler->getEnvironment()->getTests()))) {
-                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
-            }
-
-            throw new Twig_Error_Syntax($message, $this->getLine());
-        }
-
-        $name = $this->getAttribute('name');
-        $node = $this->getNode('node');
-
-        $compiler
-            ->raw($testMap[$name]->compile().'(')
-            ->subcompile($node)
-        ;
-
-        if (null !== $this->getNode('arguments')) {
-            $compiler->raw(', ');
-
-            $max = count($this->getNode('arguments')) - 1;
-            foreach ($this->getNode('arguments') as $i => $arg) {
-                $compiler->subcompile($arg);
-
-                if ($i != $max) {
-                    $compiler->raw(', ');
-                }
-            }
-        }
-
-        $compiler->raw(')');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Test/Constant.php b/core/vendor/Twig/Node/Expression/Test/Constant.php
deleted file mode 100644
index 6e6b6fd..0000000
--- a/core/vendor/Twig/Node/Expression/Test/Constant.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Checks if a variable is the exact same value as a constant.
- *
- * <pre>
- *  {% if post.status is constant('Post::PUBLISHED') %}
- *    the status attribute is exactly the same as Post::PUBLISHED
- *  {% endif %}
- * </pre>
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Test_Constant extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('node'))
-            ->raw(' === constant(')
-            ->subcompile($this->getNode('arguments')->getNode(0))
-            ->raw('))')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Test/Defined.php b/core/vendor/Twig/Node/Expression/Test/Defined.php
deleted file mode 100644
index e7c6828..0000000
--- a/core/vendor/Twig/Node/Expression/Test/Defined.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Checks if a variable is defined in the current context.
- *
- * <pre>
- * {# defined works with variable names and variable attributes #}
- * {% if foo is defined %}
- *     {# ... #}
- * {% endif %}
- * </pre>
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test
-{
-    public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
-    {
-        parent::__construct($node, $name, $arguments, $lineno);
-
-        if ($node instanceof Twig_Node_Expression_Name) {
-            $node->setAttribute('is_defined_test', true);
-        } elseif ($node instanceof Twig_Node_Expression_GetAttr) {
-            $node->setAttribute('is_defined_test', true);
-
-            $this->changeIgnoreStrictCheck($node);
-        } else {
-            throw new Twig_Error_Syntax('The "defined" test only works with simple variables', $this->getLine());
-        }
-    }
-
-    protected function changeIgnoreStrictCheck(Twig_Node_Expression_GetAttr $node)
-    {
-        $node->setAttribute('ignore_strict_check', true);
-
-        if ($node->getNode('node') instanceof Twig_Node_Expression_GetAttr) {
-            $this->changeIgnoreStrictCheck($node->getNode('node'));
-        }
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->subcompile($this->getNode('node'));
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Test/Divisibleby.php b/core/vendor/Twig/Node/Expression/Test/Divisibleby.php
deleted file mode 100644
index 05563d5..0000000
--- a/core/vendor/Twig/Node/Expression/Test/Divisibleby.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Checks if a variable is divisible by a number.
- *
- * <pre>
- *  {% if loop.index is divisibleby(3) %}
- * </pre>
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Test_Divisibleby extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('(0 == ')
-            ->subcompile($this->getNode('node'))
-            ->raw(' % ')
-            ->subcompile($this->getNode('arguments')->getNode(0))
-            ->raw(')')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Test/Even.php b/core/vendor/Twig/Node/Expression/Test/Even.php
deleted file mode 100644
index 08e6d82..0000000
--- a/core/vendor/Twig/Node/Expression/Test/Even.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Checks if a number is even.
- *
- * <pre>
- *  {{ var is even }}
- * </pre>
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Test_Even extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('node'))
-            ->raw(' % 2 == 0')
-            ->raw(')')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Test/Null.php b/core/vendor/Twig/Node/Expression/Test/Null.php
deleted file mode 100644
index 55061db..0000000
--- a/core/vendor/Twig/Node/Expression/Test/Null.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Checks that a variable is null.
- *
- * <pre>
- *  {{ var is none }}
- * </pre>
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Test_Null extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('(null === ')
-            ->subcompile($this->getNode('node'))
-            ->raw(')')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Test/Odd.php b/core/vendor/Twig/Node/Expression/Test/Odd.php
deleted file mode 100644
index 5fecebc..0000000
--- a/core/vendor/Twig/Node/Expression/Test/Odd.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Checks if a number is odd.
- *
- * <pre>
- *  {{ var is odd }}
- * </pre>
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Test_Odd extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('node'))
-            ->raw(' % 2 == 1')
-            ->raw(')')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Test/Sameas.php b/core/vendor/Twig/Node/Expression/Test/Sameas.php
deleted file mode 100644
index 8639b96..0000000
--- a/core/vendor/Twig/Node/Expression/Test/Sameas.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Checks if a variable is the same as another one (=== in PHP).
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Expression_Test_Sameas extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('node'))
-            ->raw(' === ')
-            ->subcompile($this->getNode('arguments')->getNode(0))
-            ->raw(')')
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Unary.php b/core/vendor/Twig/Node/Expression/Unary.php
deleted file mode 100644
index c514388..0000000
--- a/core/vendor/Twig/Node/Expression/Unary.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-abstract class Twig_Node_Expression_Unary extends Twig_Node_Expression
-{
-    public function __construct(Twig_NodeInterface $node, $lineno)
-    {
-        parent::__construct(array('node' => $node), array(), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->raw('(');
-        $this->operator($compiler);
-        $compiler
-            ->subcompile($this->getNode('node'))
-            ->raw(')')
-        ;
-    }
-
-    abstract public function operator(Twig_Compiler $compiler);
-}
diff --git a/core/vendor/Twig/Node/Expression/Unary/Neg.php b/core/vendor/Twig/Node/Expression/Unary/Neg.php
deleted file mode 100644
index 2a3937e..0000000
--- a/core/vendor/Twig/Node/Expression/Unary/Neg.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Unary_Neg extends Twig_Node_Expression_Unary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        $compiler->raw('-');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Unary/Not.php b/core/vendor/Twig/Node/Expression/Unary/Not.php
deleted file mode 100644
index f94073c..0000000
--- a/core/vendor/Twig/Node/Expression/Unary/Not.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Unary_Not extends Twig_Node_Expression_Unary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        $compiler->raw('!');
-    }
-}
diff --git a/core/vendor/Twig/Node/Expression/Unary/Pos.php b/core/vendor/Twig/Node/Expression/Unary/Pos.php
deleted file mode 100644
index 04edb52..0000000
--- a/core/vendor/Twig/Node/Expression/Unary/Pos.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Unary_Pos extends Twig_Node_Expression_Unary
-{
-    public function operator(Twig_Compiler $compiler)
-    {
-        $compiler->raw('+');
-    }
-}
diff --git a/core/vendor/Twig/Node/Flush.php b/core/vendor/Twig/Node/Flush.php
deleted file mode 100644
index 8f2ab9d..0000000
--- a/core/vendor/Twig/Node/Flush.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a flush node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Flush extends Twig_Node
-{
-    public function __construct($lineno, $tag)
-    {
-        parent::__construct(array(), array(), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write("flush();\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/For.php b/core/vendor/Twig/Node/For.php
deleted file mode 100644
index d9d25b3..0000000
--- a/core/vendor/Twig/Node/For.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a for node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_For extends Twig_Node
-{
-    protected $loop;
-
-    public function __construct(Twig_Node_Expression_AssignName $keyTarget, Twig_Node_Expression_AssignName $valueTarget, Twig_Node_Expression $seq, Twig_Node_Expression $ifexpr = null, Twig_NodeInterface $body, Twig_NodeInterface $else = null, $lineno, $tag = null)
-    {
-        $body = new Twig_Node(array($body, $this->loop = new Twig_Node_ForLoop($lineno, $tag)));
-
-        if (null !== $ifexpr) {
-            $body = new Twig_Node_If(new Twig_Node(array($ifexpr, $body)), null, $lineno, $tag);
-        }
-
-        parent::__construct(array('key_target' => $keyTarget, 'value_target' => $valueTarget, 'seq' => $seq, 'body' => $body, 'else' => $else), array('with_loop' => true, 'ifexpr' => null !== $ifexpr), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            // the (array) cast bypasses a PHP 5.2.6 bug
-            ->write("\$context['_parent'] = (array) \$context;\n")
-            ->write("\$context['_seq'] = twig_ensure_traversable(")
-            ->subcompile($this->getNode('seq'))
-            ->raw(");\n")
-        ;
-
-        if (null !== $this->getNode('else')) {
-            $compiler->write("\$context['_iterated'] = false;\n");
-        }
-
-        if ($this->getAttribute('with_loop')) {
-            $compiler
-                ->write("\$context['loop'] = array(\n")
-                ->write("  'parent' => \$context['_parent'],\n")
-                ->write("  'index0' => 0,\n")
-                ->write("  'index'  => 1,\n")
-                ->write("  'first'  => true,\n")
-                ->write(");\n")
-            ;
-
-            if (!$this->getAttribute('ifexpr')) {
-                $compiler
-                    ->write("if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {\n")
-                    ->indent()
-                    ->write("\$length = count(\$context['_seq']);\n")
-                    ->write("\$context['loop']['revindex0'] = \$length - 1;\n")
-                    ->write("\$context['loop']['revindex'] = \$length;\n")
-                    ->write("\$context['loop']['length'] = \$length;\n")
-                    ->write("\$context['loop']['last'] = 1 === \$length;\n")
-                    ->outdent()
-                    ->write("}\n")
-                ;
-            }
-        }
-
-        $this->loop->setAttribute('else', null !== $this->getNode('else'));
-        $this->loop->setAttribute('with_loop', $this->getAttribute('with_loop'));
-        $this->loop->setAttribute('ifexpr', $this->getAttribute('ifexpr'));
-
-        $compiler
-            ->write("foreach (\$context['_seq'] as ")
-            ->subcompile($this->getNode('key_target'))
-            ->raw(" => ")
-            ->subcompile($this->getNode('value_target'))
-            ->raw(") {\n")
-            ->indent()
-            ->subcompile($this->getNode('body'))
-            ->outdent()
-            ->write("}\n")
-        ;
-
-        if (null !== $this->getNode('else')) {
-            $compiler
-                ->write("if (!\$context['_iterated']) {\n")
-                ->indent()
-                ->subcompile($this->getNode('else'))
-                ->outdent()
-                ->write("}\n")
-            ;
-        }
-
-        $compiler->write("\$_parent = \$context['_parent'];\n");
-
-        // remove some "private" loop variables (needed for nested loops)
-        $compiler->write('unset($context[\'_seq\'], $context[\'_iterated\'], $context[\''.$this->getNode('key_target')->getAttribute('name').'\'], $context[\''.$this->getNode('value_target')->getAttribute('name').'\'], $context[\'_parent\'], $context[\'loop\']);'."\n");
-
-        // keep the values set in the inner context for variables defined in the outer context
-        $compiler->write("\$context = array_merge(\$_parent, array_intersect_key(\$context, \$_parent));\n");
-    }
-}
diff --git a/core/vendor/Twig/Node/ForLoop.php b/core/vendor/Twig/Node/ForLoop.php
deleted file mode 100644
index 38f2e85..0000000
--- a/core/vendor/Twig/Node/ForLoop.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Internal node used by the for node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_ForLoop extends Twig_Node
-{
-    public function __construct($lineno, $tag = null)
-    {
-        parent::__construct(array(), array('with_loop' => false, 'ifexpr' => false, 'else' => false), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        if ($this->getAttribute('else')) {
-            $compiler->write("\$context['_iterated'] = true;\n");
-        }
-
-        if ($this->getAttribute('with_loop')) {
-            $compiler
-                ->write("++\$context['loop']['index0'];\n")
-                ->write("++\$context['loop']['index'];\n")
-                ->write("\$context['loop']['first'] = false;\n")
-            ;
-
-            if (!$this->getAttribute('ifexpr')) {
-                $compiler
-                    ->write("if (isset(\$context['loop']['length'])) {\n")
-                    ->indent()
-                    ->write("--\$context['loop']['revindex0'];\n")
-                    ->write("--\$context['loop']['revindex'];\n")
-                    ->write("\$context['loop']['last'] = 0 === \$context['loop']['revindex0'];\n")
-                    ->outdent()
-                    ->write("}\n")
-                ;
-            }
-        }
-    }
-}
diff --git a/core/vendor/Twig/Node/If.php b/core/vendor/Twig/Node/If.php
deleted file mode 100644
index aa12efb..0000000
--- a/core/vendor/Twig/Node/If.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents an if node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_If extends Twig_Node
-{
-    public function __construct(Twig_NodeInterface $tests, Twig_NodeInterface $else = null, $lineno, $tag = null)
-    {
-        parent::__construct(array('tests' => $tests, 'else' => $else), array(), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->addDebugInfo($this);
-        for ($i = 0; $i < count($this->getNode('tests')); $i += 2) {
-            if ($i > 0) {
-                $compiler
-                    ->outdent()
-                    ->write("} elseif (")
-                ;
-            } else {
-                $compiler
-                    ->write('if (')
-                ;
-            }
-
-            $compiler
-                ->subcompile($this->getNode('tests')->getNode($i))
-                ->raw(") {\n")
-                ->indent()
-                ->subcompile($this->getNode('tests')->getNode($i + 1))
-            ;
-        }
-
-        if ($this->hasNode('else') && null !== $this->getNode('else')) {
-            $compiler
-                ->outdent()
-                ->write("} else {\n")
-                ->indent()
-                ->subcompile($this->getNode('else'))
-            ;
-        }
-
-        $compiler
-            ->outdent()
-            ->write("}\n");
-    }
-}
diff --git a/core/vendor/Twig/Node/Import.php b/core/vendor/Twig/Node/Import.php
deleted file mode 100644
index a327411..0000000
--- a/core/vendor/Twig/Node/Import.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents an import node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Import extends Twig_Node
-{
-    public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $var, $lineno, $tag = null)
-    {
-        parent::__construct(array('expr' => $expr, 'var' => $var), array(), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('')
-            ->subcompile($this->getNode('var'))
-            ->raw(' = ')
-        ;
-
-        if ($this->getNode('expr') instanceof Twig_Node_Expression_Name && '_self' === $this->getNode('expr')->getAttribute('name')) {
-            $compiler->raw("\$this");
-        } else {
-            $compiler
-                ->raw('$this->env->loadTemplate(')
-                ->subcompile($this->getNode('expr'))
-                ->raw(")")
-            ;
-        }
-
-        $compiler->raw(";\n");
-    }
-}
diff --git a/core/vendor/Twig/Node/Include.php b/core/vendor/Twig/Node/Include.php
deleted file mode 100644
index 5b6be7a..0000000
--- a/core/vendor/Twig/Node/Include.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents an include node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Include extends Twig_Node implements Twig_NodeOutputInterface
-{
-    public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
-    {
-        parent::__construct(array('expr' => $expr, 'variables' => $variables), array('only' => (Boolean) $only, 'ignore_missing' => (Boolean) $ignoreMissing), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->addDebugInfo($this);
-
-        if ($this->getAttribute('ignore_missing')) {
-            $compiler
-                ->write("try {\n")
-                ->indent()
-            ;
-        }
-
-        $this->addGetTemplate($compiler);
-
-        $compiler->raw('->display(');
-
-        $this->addTemplateArguments($compiler);
-
-        $compiler->raw(");\n");
-
-        if ($this->getAttribute('ignore_missing')) {
-            $compiler
-                ->outdent()
-                ->write("} catch (Twig_Error_Loader \$e) {\n")
-                ->indent()
-                ->write("// ignore missing template\n")
-                ->outdent()
-                ->write("}\n\n")
-            ;
-        }
-    }
-
-    protected function addGetTemplate(Twig_Compiler $compiler)
-    {
-        if ($this->getNode('expr') instanceof Twig_Node_Expression_Constant) {
-            $compiler
-                ->write("\$this->env->loadTemplate(")
-                ->subcompile($this->getNode('expr'))
-                ->raw(")")
-            ;
-        } else {
-            $compiler
-                ->write("\$template = \$this->env->resolveTemplate(")
-                ->subcompile($this->getNode('expr'))
-                ->raw(");\n")
-                ->write('$template')
-            ;
-        }
-    }
-
-    protected function addTemplateArguments(Twig_Compiler $compiler)
-    {
-        if (false === $this->getAttribute('only')) {
-            if (null === $this->getNode('variables')) {
-                $compiler->raw('$context');
-            } else {
-                $compiler
-                    ->raw('array_merge($context, ')
-                    ->subcompile($this->getNode('variables'))
-                    ->raw(')')
-                ;
-            }
-        } else {
-            if (null === $this->getNode('variables')) {
-                $compiler->raw('array()');
-            } else {
-                $compiler->subcompile($this->getNode('variables'));
-            }
-        }
-    }
-}
diff --git a/core/vendor/Twig/Node/Macro.php b/core/vendor/Twig/Node/Macro.php
deleted file mode 100644
index e0c3dca..0000000
--- a/core/vendor/Twig/Node/Macro.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a macro node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Macro extends Twig_Node
-{
-    public function __construct($name, Twig_NodeInterface $body, Twig_NodeInterface $arguments, $lineno, $tag = null)
-    {
-        parent::__construct(array('body' => $body, 'arguments' => $arguments), array('name' => $name), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $arguments = array();
-        foreach ($this->getNode('arguments') as $argument) {
-            $arguments[] = '$'.$argument->getAttribute('name').' = null';
-        }
-
-        $compiler
-            ->addDebugInfo($this)
-            ->write(sprintf("public function get%s(%s)\n", $this->getAttribute('name'), implode(', ', $arguments)), "{\n")
-            ->indent()
-        ;
-
-        if (!count($this->getNode('arguments'))) {
-            $compiler->write("\$context = \$this->env->getGlobals();\n\n");
-        } else {
-            $compiler
-                ->write("\$context = \$this->env->mergeGlobals(array(\n")
-                ->indent()
-            ;
-
-            foreach ($this->getNode('arguments') as $argument) {
-                $compiler
-                    ->write('')
-                    ->string($argument->getAttribute('name'))
-                    ->raw(' => $'.$argument->getAttribute('name'))
-                    ->raw(",\n")
-                ;
-            }
-
-            $compiler
-                ->outdent()
-                ->write("));\n\n")
-            ;
-        }
-
-        $compiler
-            ->write("\$blocks = array();\n\n")
-            ->write("ob_start();\n")
-            ->write("try {\n")
-            ->indent()
-            ->subcompile($this->getNode('body'))
-            ->outdent()
-            ->write("} catch(Exception \$e) {\n")
-            ->indent()
-            ->write("ob_end_clean();\n\n")
-            ->write("throw \$e;\n")
-            ->outdent()
-            ->write("}\n\n")
-            ->write("return ob_get_clean();\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Module.php b/core/vendor/Twig/Node/Module.php
deleted file mode 100644
index 4c7a107..0000000
--- a/core/vendor/Twig/Node/Module.php
+++ /dev/null
@@ -1,372 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a module node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Module extends Twig_Node
-{
-    public function __construct(Twig_NodeInterface $body, Twig_Node_Expression $parent = null, Twig_NodeInterface $blocks, Twig_NodeInterface $macros, Twig_NodeInterface $traits, $embeddedTemplates, $filename)
-    {
-        // embedded templates are set as attributes so that they are only visited once by the visitors
-        parent::__construct(array('parent' => $parent, 'body' => $body, 'blocks' => $blocks, 'macros' => $macros, 'traits' => $traits), array('filename' => $filename, 'index' => null, 'embedded_templates' => $embeddedTemplates), 1);
-    }
-
-    public function setIndex($index)
-    {
-        $this->setAttribute('index', $index);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $this->compileTemplate($compiler);
-
-        foreach ($this->getAttribute('embedded_templates') as $template) {
-            $compiler->subcompile($template);
-        }
-    }
-
-    protected function compileTemplate(Twig_Compiler $compiler)
-    {
-        if (!$this->getAttribute('index')) {
-            $compiler->write('<?php');
-        }
-
-        $this->compileClassHeader($compiler);
-
-        if (count($this->getNode('blocks')) || count($this->getNode('traits')) || null === $this->getNode('parent') || $this->getNode('parent') instanceof Twig_Node_Expression_Constant) {
-            $this->compileConstructor($compiler);
-        }
-
-        $this->compileGetParent($compiler);
-
-        $this->compileDisplayHeader($compiler);
-
-        $this->compileDisplayBody($compiler);
-
-        $this->compileDisplayFooter($compiler);
-
-        $compiler->subcompile($this->getNode('blocks'));
-
-        $this->compileMacros($compiler);
-
-        $this->compileGetTemplateName($compiler);
-
-        $this->compileIsTraitable($compiler);
-
-        $this->compileDebugInfo($compiler);
-
-        $this->compileClassFooter($compiler);
-    }
-
-    protected function compileGetParent(Twig_Compiler $compiler)
-    {
-        if (null === $this->getNode('parent')) {
-            return;
-        }
-
-        $compiler
-            ->write("protected function doGetParent(array \$context)\n", "{\n")
-            ->indent()
-            ->write("return ")
-        ;
-
-        if ($this->getNode('parent') instanceof Twig_Node_Expression_Constant) {
-            $compiler->subcompile($this->getNode('parent'));
-        } else {
-            $compiler
-                ->raw("\$this->env->resolveTemplate(")
-                ->subcompile($this->getNode('parent'))
-                ->raw(")")
-            ;
-        }
-
-        $compiler
-            ->raw(";\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileDisplayBody(Twig_Compiler $compiler)
-    {
-        $compiler->subcompile($this->getNode('body'));
-
-        if (null !== $this->getNode('parent')) {
-            if ($this->getNode('parent') instanceof Twig_Node_Expression_Constant) {
-                $compiler->write("\$this->parent");
-            } else {
-                $compiler->write("\$this->getParent(\$context)");
-            }
-            $compiler->raw("->display(\$context, array_merge(\$this->blocks, \$blocks));\n");
-        }
-    }
-
-    protected function compileClassHeader(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("\n\n")
-            // if the filename contains */, add a blank to avoid a PHP parse error
-            ->write("/* ".str_replace('*/', '* /', $this->getAttribute('filename'))." */\n")
-            ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->getAttribute('filename'), $this->getAttribute('index')))
-            ->raw(sprintf(" extends %s\n", $compiler->getEnvironment()->getBaseTemplateClass()))
-            ->write("{\n")
-            ->indent()
-        ;
-    }
-
-    protected function compileConstructor(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("public function __construct(Twig_Environment \$env)\n", "{\n")
-            ->indent()
-            ->write("parent::__construct(\$env);\n\n")
-        ;
-
-        // parent
-        if (null === $this->getNode('parent')) {
-            $compiler->write("\$this->parent = false;\n\n");
-        } elseif ($this->getNode('parent') instanceof Twig_Node_Expression_Constant) {
-            $compiler
-                ->write("\$this->parent = \$this->env->loadTemplate(")
-                ->subcompile($this->getNode('parent'))
-                ->raw(");\n\n")
-            ;
-        }
-
-        $countTraits = count($this->getNode('traits'));
-        if ($countTraits) {
-            // traits
-            foreach ($this->getNode('traits') as $i => $trait) {
-                $this->compileLoadTemplate($compiler, $trait->getNode('template'), sprintf('$_trait_%s', $i));
-
-                $compiler
-                    ->addDebugInfo($trait->getNode('template'))
-                    ->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i))
-                    ->indent()
-                    ->write("throw new Twig_Error_Runtime('Template \"'.")
-                    ->subcompile($trait->getNode('template'))
-                    ->raw(".'\" cannot be used as a trait.');\n")
-                    ->outdent()
-                    ->write("}\n")
-                    ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i))
-                ;
-
-                foreach ($trait->getNode('targets') as $key => $value) {
-                    $compiler
-                        ->write(sprintf("\$_trait_%s_blocks[", $i))
-                        ->subcompile($value)
-                        ->raw(sprintf("] = \$_trait_%s_blocks[", $i))
-                        ->string($key)
-                        ->raw(sprintf("]; unset(\$_trait_%s_blocks[", $i))
-                        ->string($key)
-                        ->raw("]);\n\n")
-                    ;
-                }
-            }
-
-            if ($countTraits > 1) {
-                $compiler
-                    ->write("\$this->traits = array_merge(\n")
-                    ->indent()
-                ;
-
-                for ($i = 0; $i < $countTraits; $i++) {
-                    $compiler
-                        ->write(sprintf("\$_trait_%s_blocks".($i == $countTraits - 1 ? '' : ',')."\n", $i))
-                    ;
-                }
-
-                $compiler
-                    ->outdent()
-                    ->write(");\n\n")
-                ;
-            } else {
-                $compiler
-                    ->write("\$this->traits = \$_trait_0_blocks;\n\n")
-                ;
-            }
-
-            $compiler
-                ->write("\$this->blocks = array_merge(\n")
-                ->indent()
-                ->write("\$this->traits,\n")
-                ->write("array(\n")
-            ;
-        } else {
-            $compiler
-                ->write("\$this->blocks = array(\n")
-            ;
-        }
-
-        // blocks
-        $compiler
-            ->indent()
-        ;
-
-        foreach ($this->getNode('blocks') as $name => $node) {
-            $compiler
-                ->write(sprintf("'%s' => array(\$this, 'block_%s'),\n", $name, $name))
-            ;
-        }
-
-        if ($countTraits) {
-            $compiler
-                ->outdent()
-                ->write(")\n")
-            ;
-        }
-
-        $compiler
-            ->outdent()
-            ->write(");\n")
-            ->outdent()
-            ->write("}\n\n");
-        ;
-    }
-
-    protected function compileDisplayHeader(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("protected function doDisplay(array \$context, array \$blocks = array())\n", "{\n")
-            ->indent()
-        ;
-    }
-
-    protected function compileDisplayFooter(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileClassFooter(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->outdent()
-            ->write("}\n")
-        ;
-    }
-
-    protected function compileMacros(Twig_Compiler $compiler)
-    {
-        $compiler->subcompile($this->getNode('macros'));
-    }
-
-    protected function compileGetTemplateName(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("public function getTemplateName()\n", "{\n")
-            ->indent()
-            ->write('return ')
-            ->repr($this->getAttribute('filename'))
-            ->raw(";\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileIsTraitable(Twig_Compiler $compiler)
-    {
-        // A template can be used as a trait if:
-        //   * it has no parent
-        //   * it has no macros
-        //   * it has no body
-        //
-        // Put another way, a template can be used as a trait if it
-        // only contains blocks and use statements.
-        $traitable = null === $this->getNode('parent') && 0 === count($this->getNode('macros'));
-        if ($traitable) {
-            if ($this->getNode('body') instanceof Twig_Node_Body) {
-                $nodes = $this->getNode('body')->getNode(0);
-            } else {
-                $nodes = $this->getNode('body');
-            }
-
-            if (!count($nodes)) {
-                $nodes = new Twig_Node(array($nodes));
-            }
-
-            foreach ($nodes as $node) {
-                if (!count($node)) {
-                    continue;
-                }
-
-                if ($node instanceof Twig_Node_Text && ctype_space($node->getAttribute('data'))) {
-                    continue;
-                }
-
-                if ($node instanceof Twig_Node_BlockReference) {
-                    continue;
-                }
-
-                $traitable = false;
-                break;
-            }
-        }
-
-        if ($traitable) {
-            return;
-        }
-
-        $compiler
-            ->write("public function isTraitable()\n", "{\n")
-            ->indent()
-            ->write(sprintf("return %s;\n", $traitable ? 'true' : 'false'))
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileDebugInfo(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("public function getDebugInfo()\n", "{\n")
-            ->indent()
-            ->write(sprintf("return %s;\n", str_replace("\n", '', var_export(array_reverse($compiler->getDebugInfo(), true), true))))
-            ->outdent()
-            ->write("}\n")
-        ;
-    }
-
-    protected function compileLoadTemplate(Twig_Compiler $compiler, $node, $var)
-    {
-        if ($node instanceof Twig_Node_Expression_Constant) {
-            $compiler
-                ->write(sprintf("%s = \$this->env->loadTemplate(", $var))
-                ->subcompile($node)
-                ->raw(");\n")
-            ;
-        } else {
-            $compiler
-                ->write(sprintf("%s = ", $var))
-                ->subcompile($node)
-                ->raw(";\n")
-                ->write(sprintf("if (!%s", $var))
-                ->raw(" instanceof Twig_Template) {\n")
-                ->indent()
-                ->write(sprintf("%s = \$this->env->loadTemplate(%s);\n", $var, $var))
-                ->outdent()
-                ->write("}\n")
-            ;
-        }
-    }
-}
diff --git a/core/vendor/Twig/Node/Print.php b/core/vendor/Twig/Node/Print.php
deleted file mode 100644
index 766725f..0000000
--- a/core/vendor/Twig/Node/Print.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a node that outputs an expression.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Print extends Twig_Node implements Twig_NodeOutputInterface
-{
-    public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
-    {
-        parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('echo ')
-            ->subcompile($this->getNode('expr'))
-            ->raw(";\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Sandbox.php b/core/vendor/Twig/Node/Sandbox.php
deleted file mode 100644
index cbfcb41..0000000
--- a/core/vendor/Twig/Node/Sandbox.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a sandbox node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Sandbox extends Twig_Node
-{
-    public function __construct(Twig_NodeInterface $body, $lineno, $tag = null)
-    {
-        parent::__construct(array('body' => $body), array(), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write("\$sandbox = \$this->env->getExtension('sandbox');\n")
-            ->write("if (!\$alreadySandboxed = \$sandbox->isSandboxed()) {\n")
-            ->indent()
-            ->write("\$sandbox->enableSandbox();\n")
-            ->outdent()
-            ->write("}\n")
-            ->subcompile($this->getNode('body'))
-            ->write("if (!\$alreadySandboxed) {\n")
-            ->indent()
-            ->write("\$sandbox->disableSandbox();\n")
-            ->outdent()
-            ->write("}\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/SandboxedModule.php b/core/vendor/Twig/Node/SandboxedModule.php
deleted file mode 100644
index 6dd63e5..0000000
--- a/core/vendor/Twig/Node/SandboxedModule.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a module node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_SandboxedModule extends Twig_Node_Module
-{
-    protected $usedFilters;
-    protected $usedTags;
-    protected $usedFunctions;
-
-    public function __construct(Twig_Node_Module $node, array $usedFilters, array $usedTags, array $usedFunctions)
-    {
-        parent::__construct($node->getNode('body'), $node->getNode('parent'), $node->getNode('blocks'), $node->getNode('macros'), $node->getNode('traits'), $node->getAttribute('embedded_templates'), $node->getAttribute('filename'), $node->getLine(), $node->getNodeTag());
-
-        $this->setAttribute('index', $node->getAttribute('index'));
-
-        $this->usedFilters = $usedFilters;
-        $this->usedTags = $usedTags;
-        $this->usedFunctions = $usedFunctions;
-    }
-
-    protected function compileDisplayBody(Twig_Compiler $compiler)
-    {
-        $compiler->write("\$this->checkSecurity();\n");
-
-        parent::compileDisplayBody($compiler);
-    }
-
-    protected function compileDisplayFooter(Twig_Compiler $compiler)
-    {
-        parent::compileDisplayFooter($compiler);
-
-        $compiler
-            ->write("protected function checkSecurity() {\n")
-            ->indent()
-            ->write("\$this->env->getExtension('sandbox')->checkSecurity(\n")
-            ->indent()
-            ->write(!$this->usedTags ? "array(),\n" : "array('".implode('\', \'', $this->usedTags)."'),\n")
-            ->write(!$this->usedFilters ? "array(),\n" : "array('".implode('\', \'', $this->usedFilters)."'),\n")
-            ->write(!$this->usedFunctions ? "array()\n" : "array('".implode('\', \'', $this->usedFunctions)."')\n")
-            ->outdent()
-            ->write(");\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/SandboxedPrint.php b/core/vendor/Twig/Node/SandboxedPrint.php
deleted file mode 100644
index 77730d8..0000000
--- a/core/vendor/Twig/Node/SandboxedPrint.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Twig_Node_SandboxedPrint adds a check for the __toString() method
- * when the variable is an object and the sandbox is activated.
- *
- * When there is a simple Print statement, like {{ article }},
- * and if the sandbox is enabled, we need to check that the __toString()
- * method is allowed if 'article' is an object.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_SandboxedPrint extends Twig_Node_Print
-{
-    public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
-    {
-        parent::__construct($expr, $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('echo $this->env->getExtension(\'sandbox\')->ensureToStringAllowed(')
-            ->subcompile($this->getNode('expr'))
-            ->raw(");\n")
-        ;
-    }
-
-    /**
-     * Removes node filters.
-     *
-     * This is mostly needed when another visitor adds filters (like the escaper one).
-     *
-     * @param Twig_Node $node A Node
-     */
-    protected function removeNodeFilter($node)
-    {
-        if ($node instanceof Twig_Node_Expression_Filter) {
-            return $this->removeNodeFilter($node->getNode('node'));
-        }
-
-        return $node;
-    }
-}
diff --git a/core/vendor/Twig/Node/Set.php b/core/vendor/Twig/Node/Set.php
deleted file mode 100644
index 70bb519..0000000
--- a/core/vendor/Twig/Node/Set.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a set node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Set extends Twig_Node
-{
-    public function __construct($capture, Twig_NodeInterface $names, Twig_NodeInterface $values, $lineno, $tag = null)
-    {
-        parent::__construct(array('names' => $names, 'values' => $values), array('capture' => $capture, 'safe' => false), $lineno, $tag);
-
-        /*
-         * Optimizes the node when capture is used for a large block of text.
-         *
-         * {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig_Markup("foo");
-         */
-        if ($this->getAttribute('capture')) {
-            $this->setAttribute('safe', true);
-
-            $values = $this->getNode('values');
-            if ($values instanceof Twig_Node_Text) {
-                $this->setNode('values', new Twig_Node_Expression_Constant($values->getAttribute('data'), $values->getLine()));
-                $this->setAttribute('capture', false);
-            }
-        }
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->addDebugInfo($this);
-
-        if (count($this->getNode('names')) > 1) {
-            $compiler->write('list(');
-            foreach ($this->getNode('names') as $idx => $node) {
-                if ($idx) {
-                    $compiler->raw(', ');
-                }
-
-                $compiler->subcompile($node);
-            }
-            $compiler->raw(')');
-        } else {
-            if ($this->getAttribute('capture')) {
-                $compiler
-                    ->write("ob_start();\n")
-                    ->subcompile($this->getNode('values'))
-                ;
-            }
-
-            $compiler->subcompile($this->getNode('names'), false);
-
-            if ($this->getAttribute('capture')) {
-                $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())");
-            }
-        }
-
-        if (!$this->getAttribute('capture')) {
-            $compiler->raw(' = ');
-
-            if (count($this->getNode('names')) > 1) {
-                $compiler->write('array(');
-                foreach ($this->getNode('values') as $idx => $value) {
-                    if ($idx) {
-                        $compiler->raw(', ');
-                    }
-
-                    $compiler->subcompile($value);
-                }
-                $compiler->raw(')');
-            } else {
-                if ($this->getAttribute('safe')) {
-                    $compiler
-                        ->raw("('' === \$tmp = ")
-                        ->subcompile($this->getNode('values'))
-                        ->raw(") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())")
-                    ;
-                } else {
-                    $compiler->subcompile($this->getNode('values'));
-                }
-            }
-        }
-
-        $compiler->raw(";\n");
-    }
-}
diff --git a/core/vendor/Twig/Node/SetTemp.php b/core/vendor/Twig/Node/SetTemp.php
deleted file mode 100644
index 3bdd1cb..0000000
--- a/core/vendor/Twig/Node/SetTemp.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-class Twig_Node_SetTemp extends Twig_Node
-{
-    public function __construct($name, $lineno)
-    {
-        parent::__construct(array(), array('name' => $name), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getAttribute('name');
-        $compiler
-            ->addDebugInfo($this)
-            ->write('if (isset($context[')
-            ->string($name)
-            ->raw('])) { $_')
-            ->raw($name)
-            ->raw('_ = $context[')
-            ->repr($name)
-            ->raw(']; } else { $_')
-            ->raw($name)
-            ->raw("_ = null; }\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Spaceless.php b/core/vendor/Twig/Node/Spaceless.php
deleted file mode 100644
index 4601346..0000000
--- a/core/vendor/Twig/Node/Spaceless.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a spaceless node.
- *
- * It removes spaces between HTML tags.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Spaceless extends Twig_Node
-{
-    public function __construct(Twig_NodeInterface $body, $lineno, $tag = 'spaceless')
-    {
-        parent::__construct(array('body' => $body), array(), $lineno, $tag);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write("ob_start();\n")
-            ->subcompile($this->getNode('body'))
-            ->write("echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/Node/Text.php b/core/vendor/Twig/Node/Text.php
deleted file mode 100644
index 0c1c092..0000000
--- a/core/vendor/Twig/Node/Text.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a text node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Node_Text extends Twig_Node implements Twig_NodeOutputInterface
-{
-    public function __construct($data, $lineno)
-    {
-        parent::__construct(array(), array('data' => $data), $lineno);
-    }
-
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('echo ')
-            ->string($this->getAttribute('data'))
-            ->raw(";\n")
-        ;
-    }
-}
diff --git a/core/vendor/Twig/NodeInterface.php b/core/vendor/Twig/NodeInterface.php
deleted file mode 100644
index 29a84b0..0000000
--- a/core/vendor/Twig/NodeInterface.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a node in the AST.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_NodeInterface extends Countable, IteratorAggregate
-{
-    /**
-     * Compiles the node to PHP.
-     *
-     * @param Twig_Compiler A Twig_Compiler instance
-     */
-    function compile(Twig_Compiler $compiler);
-
-    function getLine();
-
-    function getNodeTag();
-}
diff --git a/core/vendor/Twig/NodeOutputInterface.php b/core/vendor/Twig/NodeOutputInterface.php
deleted file mode 100644
index 7183956..0000000
--- a/core/vendor/Twig/NodeOutputInterface.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a displayable node in the AST.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_NodeOutputInterface
-{
-}
diff --git a/core/vendor/Twig/NodeTraverser.php b/core/vendor/Twig/NodeTraverser.php
deleted file mode 100644
index 1e82b03..0000000
--- a/core/vendor/Twig/NodeTraverser.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Twig_NodeTraverser is a node traverser.
- *
- * It visits all nodes and their children and call the given visitor for each.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_NodeTraverser
-{
-    protected $env;
-    protected $visitors;
-
-    /**
-     * Constructor.
-     *
-     * @param Twig_Environment $env      A Twig_Environment instance
-     * @param array            $visitors An array of Twig_NodeVisitorInterface instances
-     */
-    public function __construct(Twig_Environment $env, array $visitors = array())
-    {
-        $this->env = $env;
-        $this->visitors = array();
-        foreach ($visitors as $visitor) {
-            $this->addVisitor($visitor);
-        }
-    }
-
-    /**
-     * Adds a visitor.
-     *
-     * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance
-     */
-    public function addVisitor(Twig_NodeVisitorInterface $visitor)
-    {
-        if (!isset($this->visitors[$visitor->getPriority()])) {
-            $this->visitors[$visitor->getPriority()] = array();
-        }
-
-        $this->visitors[$visitor->getPriority()][] = $visitor;
-    }
-
-    /**
-     * Traverses a node and calls the registered visitors.
-     *
-     * @param Twig_NodeInterface $node A Twig_NodeInterface instance
-     */
-    public function traverse(Twig_NodeInterface $node)
-    {
-        ksort($this->visitors);
-        foreach ($this->visitors as $visitors) {
-            foreach ($visitors as $visitor) {
-                $node = $this->traverseForVisitor($visitor, $node);
-            }
-        }
-
-        return $node;
-    }
-
-    protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null)
-    {
-        if (null === $node) {
-            return null;
-        }
-
-        $node = $visitor->enterNode($node, $this->env);
-
-        foreach ($node as $k => $n) {
-            if (false !== $n = $this->traverseForVisitor($visitor, $n)) {
-                $node->setNode($k, $n);
-            } else {
-                $node->removeNode($k);
-            }
-        }
-
-        return $visitor->leaveNode($node, $this->env);
-    }
-}
diff --git a/core/vendor/Twig/NodeVisitor/Escaper.php b/core/vendor/Twig/NodeVisitor/Escaper.php
deleted file mode 100644
index 5b1249d..0000000
--- a/core/vendor/Twig/NodeVisitor/Escaper.php
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Twig_NodeVisitor_Escaper implements output escaping.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_NodeVisitor_Escaper implements Twig_NodeVisitorInterface
-{
-    protected $statusStack = array();
-    protected $blocks = array();
-    protected $safeAnalysis;
-    protected $traverser;
-    protected $defaultStrategy = false;
-
-    public function __construct()
-    {
-        $this->safeAnalysis = new Twig_NodeVisitor_SafeAnalysis();
-    }
-
-    /**
-     * Called before child nodes are visited.
-     *
-     * @param Twig_NodeInterface $node The node to visit
-     * @param Twig_Environment   $env  The Twig environment instance
-     *
-     * @return Twig_NodeInterface The modified node
-     */
-    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_Module) {
-            if ($env->hasExtension('escaper') && $defaultStrategy = $env->getExtension('escaper')->getDefaultStrategy($node->getAttribute('filename'))) {
-                $this->defaultStrategy = $defaultStrategy;
-            }
-        } elseif ($node instanceof Twig_Node_AutoEscape) {
-            $this->statusStack[] = $node->getAttribute('value');
-        } elseif ($node instanceof Twig_Node_Block) {
-            $this->statusStack[] = isset($this->blocks[$node->getAttribute('name')]) ? $this->blocks[$node->getAttribute('name')] : $this->needEscaping($env);
-        }
-
-        return $node;
-    }
-
-    /**
-     * Called after child nodes are visited.
-     *
-     * @param Twig_NodeInterface $node The node to visit
-     * @param Twig_Environment   $env  The Twig environment instance
-     *
-     * @return Twig_NodeInterface The modified node
-     */
-    public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_Module) {
-            $this->defaultStrategy = false;
-        } elseif ($node instanceof Twig_Node_Expression_Filter) {
-            return $this->preEscapeFilterNode($node, $env);
-        } elseif ($node instanceof Twig_Node_Print) {
-            return $this->escapePrintNode($node, $env, $this->needEscaping($env));
-        }
-
-        if ($node instanceof Twig_Node_AutoEscape || $node instanceof Twig_Node_Block) {
-            array_pop($this->statusStack);
-        } elseif ($node instanceof Twig_Node_BlockReference) {
-            $this->blocks[$node->getAttribute('name')] = $this->needEscaping($env);
-        }
-
-        return $node;
-    }
-
-    protected function escapePrintNode(Twig_Node_Print $node, Twig_Environment $env, $type)
-    {
-        if (false === $type) {
-            return $node;
-        }
-
-        $expression = $node->getNode('expr');
-
-        if ($this->isSafeFor($type, $expression, $env)) {
-            return $node;
-        }
-
-        $class = get_class($node);
-
-        return new $class(
-            $this->getEscaperFilter($type, $expression),
-            $node->getLine()
-        );
-    }
-
-    protected function preEscapeFilterNode(Twig_Node_Expression_Filter $filter, Twig_Environment $env)
-    {
-        $name = $filter->getNode('filter')->getAttribute('value');
-
-        if (false !== $f = $env->getFilter($name)) {
-            $type = $f->getPreEscape();
-            if (null === $type) {
-                return $filter;
-            }
-
-            $node = $filter->getNode('node');
-            if ($this->isSafeFor($type, $node, $env)) {
-                return $filter;
-            }
-
-            $filter->setNode('node', $this->getEscaperFilter($type, $node));
-
-            return $filter;
-        }
-
-        return $filter;
-    }
-
-    protected function isSafeFor($type, Twig_NodeInterface $expression, $env)
-    {
-        $safe = $this->safeAnalysis->getSafe($expression);
-
-        if (null === $safe) {
-            if (null === $this->traverser) {
-                $this->traverser = new Twig_NodeTraverser($env, array($this->safeAnalysis));
-            }
-            $this->traverser->traverse($expression);
-            $safe = $this->safeAnalysis->getSafe($expression);
-        }
-
-        return in_array($type, $safe) || in_array('all', $safe);
-    }
-
-    protected function needEscaping(Twig_Environment $env)
-    {
-        if (count($this->statusStack)) {
-            return $this->statusStack[count($this->statusStack) - 1];
-        }
-
-        return $this->defaultStrategy ? $this->defaultStrategy : false;
-    }
-
-    protected function getEscaperFilter($type, Twig_NodeInterface $node)
-    {
-        $line = $node->getLine();
-        $name = new Twig_Node_Expression_Constant('escape', $line);
-        $args = new Twig_Node(array(new Twig_Node_Expression_Constant((string) $type, $line), new Twig_Node_Expression_Constant(null, $line), new Twig_Node_Expression_Constant(true, $line)));
-
-        return new Twig_Node_Expression_Filter($node, $name, $args, $line);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getPriority()
-    {
-        return 0;
-    }
-}
diff --git a/core/vendor/Twig/NodeVisitor/Optimizer.php b/core/vendor/Twig/NodeVisitor/Optimizer.php
deleted file mode 100644
index c9ad6bb..0000000
--- a/core/vendor/Twig/NodeVisitor/Optimizer.php
+++ /dev/null
@@ -1,247 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Twig_NodeVisitor_Optimizer tries to optimizes the AST.
- *
- * This visitor is always the last registered one.
- *
- * You can configure which optimizations you want to activate via the
- * optimizer mode.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_NodeVisitor_Optimizer implements Twig_NodeVisitorInterface
-{
-    const OPTIMIZE_ALL         = -1;
-    const OPTIMIZE_NONE        = 0;
-    const OPTIMIZE_FOR         = 2;
-    const OPTIMIZE_RAW_FILTER  = 4;
-    const OPTIMIZE_VAR_ACCESS  = 8;
-
-    protected $loops = array();
-    protected $optimizers;
-    protected $prependedNodes = array();
-    protected $inABody = false;
-
-    /**
-     * Constructor.
-     *
-     * @param integer $optimizers The optimizer mode
-     */
-    public function __construct($optimizers = -1)
-    {
-        if (!is_int($optimizers) || $optimizers > 2) {
-            throw new InvalidArgumentException(sprintf('Optimizer mode "%s" is not valid.', $optimizers));
-        }
-
-        $this->optimizers = $optimizers;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
-            $this->enterOptimizeFor($node, $env);
-        }
-
-        if (!version_compare(phpversion(), '5.4.0RC1', '>=') && self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('sandbox')) {
-            if ($this->inABody) {
-                if (!$node instanceof Twig_Node_Expression) {
-                    if (get_class($node) !== 'Twig_Node') {
-                        array_unshift($this->prependedNodes, array());
-                    }
-                } else {
-                    $node = $this->optimizeVariables($node, $env);
-                }
-            } elseif ($node instanceof Twig_Node_Body) {
-                $this->inABody = true;
-            }
-        }
-
-        return $node;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        $expression = $node instanceof Twig_Node_Expression;
-
-        if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
-            $this->leaveOptimizeFor($node, $env);
-        }
-
-        if (self::OPTIMIZE_RAW_FILTER === (self::OPTIMIZE_RAW_FILTER & $this->optimizers)) {
-            $node = $this->optimizeRawFilter($node, $env);
-        }
-
-        $node = $this->optimizePrintNode($node, $env);
-
-        if (self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('sandbox')) {
-            if ($node instanceof Twig_Node_Body) {
-                $this->inABody = false;
-            } elseif ($this->inABody) {
-                if (!$expression && get_class($node) !== 'Twig_Node' && $prependedNodes = array_shift($this->prependedNodes)) {
-                    $nodes = array();
-                    foreach (array_unique($prependedNodes) as $name) {
-                        $nodes[] = new Twig_Node_SetTemp($name, $node->getLine());
-                    }
-
-                    $nodes[] = $node;
-                    $node = new Twig_Node($nodes);
-                }
-            }
-        }
-
-        return $node;
-    }
-
-    protected function optimizeVariables($node, $env)
-    {
-        if ('Twig_Node_Expression_Name' === get_class($node) && $node->isSimple()) {
-            $this->prependedNodes[0][] = $node->getAttribute('name');
-
-            return new Twig_Node_Expression_TempName($node->getAttribute('name'), $node->getLine());
-        }
-
-        return $node;
-    }
-
-    /**
-     * Optimizes print nodes.
-     *
-     * It replaces:
-     *
-     *   * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()"
-     *
-     * @param Twig_NodeInterface $node A Node
-     * @param Twig_Environment   $env  The current Twig environment
-     */
-    protected function optimizePrintNode($node, $env)
-    {
-        if (!$node instanceof Twig_Node_Print) {
-            return $node;
-        }
-
-        if (
-            $node->getNode('expr') instanceof Twig_Node_Expression_BlockReference ||
-            $node->getNode('expr') instanceof Twig_Node_Expression_Parent
-        ) {
-            $node->getNode('expr')->setAttribute('output', true);
-
-            return $node->getNode('expr');
-        }
-
-        return $node;
-    }
-
-    /**
-     * Removes "raw" filters.
-     *
-     * @param Twig_NodeInterface $node A Node
-     * @param Twig_Environment   $env  The current Twig environment
-     */
-    protected function optimizeRawFilter($node, $env)
-    {
-        if ($node instanceof Twig_Node_Expression_Filter && 'raw' == $node->getNode('filter')->getAttribute('value')) {
-            return $node->getNode('node');
-        }
-
-        return $node;
-    }
-
-    /**
-     * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
-     *
-     * @param Twig_NodeInterface $node A Node
-     * @param Twig_Environment   $env  The current Twig environment
-     */
-    protected function enterOptimizeFor($node, $env)
-    {
-        if ($node instanceof Twig_Node_For) {
-            // disable the loop variable by default
-            $node->setAttribute('with_loop', false);
-            array_unshift($this->loops, $node);
-        } elseif (!$this->loops) {
-            // we are outside a loop
-            return;
-        }
-
-        // when do we need to add the loop variable back?
-
-        // the loop variable is referenced for the current loop
-        elseif ($node instanceof Twig_Node_Expression_Name && 'loop' === $node->getAttribute('name')) {
-            $this->addLoopToCurrent();
-        }
-
-        // block reference
-        elseif ($node instanceof Twig_Node_BlockReference || $node instanceof Twig_Node_Expression_BlockReference) {
-            $this->addLoopToCurrent();
-        }
-
-        // include without the only attribute
-        elseif ($node instanceof Twig_Node_Include && !$node->getAttribute('only')) {
-            $this->addLoopToAll();
-        }
-
-        // the loop variable is referenced via an attribute
-        elseif ($node instanceof Twig_Node_Expression_GetAttr
-            && (!$node->getNode('attribute') instanceof Twig_Node_Expression_Constant
-                || 'parent' === $node->getNode('attribute')->getAttribute('value')
-               )
-            && (true === $this->loops[0]->getAttribute('with_loop')
-                || ($node->getNode('node') instanceof Twig_Node_Expression_Name
-                    && 'loop' === $node->getNode('node')->getAttribute('name')
-                   )
-               )
-        ) {
-            $this->addLoopToAll();
-        }
-    }
-
-    /**
-     * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
-     *
-     * @param Twig_NodeInterface $node A Node
-     * @param Twig_Environment   $env  The current Twig environment
-     */
-    protected function leaveOptimizeFor($node, $env)
-    {
-        if ($node instanceof Twig_Node_For) {
-            array_shift($this->loops);
-        }
-    }
-
-    protected function addLoopToCurrent()
-    {
-        $this->loops[0]->setAttribute('with_loop', true);
-    }
-
-    protected function addLoopToAll()
-    {
-        foreach ($this->loops as $loop) {
-            $loop->setAttribute('with_loop', true);
-        }
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getPriority()
-    {
-        return 255;
-    }
-}
diff --git a/core/vendor/Twig/NodeVisitor/SafeAnalysis.php b/core/vendor/Twig/NodeVisitor/SafeAnalysis.php
deleted file mode 100644
index 7cc2e22..0000000
--- a/core/vendor/Twig/NodeVisitor/SafeAnalysis.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-
-class Twig_NodeVisitor_SafeAnalysis implements Twig_NodeVisitorInterface
-{
-    protected $data = array();
-
-    public function getSafe(Twig_NodeInterface $node)
-    {
-        $hash = spl_object_hash($node);
-        if (isset($this->data[$hash])) {
-            foreach ($this->data[$hash] as $bucket) {
-                if ($bucket['key'] === $node) {
-                    return $bucket['value'];
-                }
-            }
-        }
-
-        return null;
-    }
-
-    protected function setSafe(Twig_NodeInterface $node, array $safe)
-    {
-        $hash = spl_object_hash($node);
-        if (isset($this->data[$hash])) {
-            foreach ($this->data[$hash] as &$bucket) {
-                if ($bucket['key'] === $node) {
-                    $bucket['value'] = $safe;
-
-                    return;
-                }
-            }
-        }
-        $this->data[$hash][] = array(
-            'key' => $node,
-            'value' => $safe,
-        );
-    }
-
-    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        return $node;
-    }
-
-    public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_Expression_Constant) {
-            // constants are marked safe for all
-            $this->setSafe($node, array('all'));
-        } elseif ($node instanceof Twig_Node_Expression_BlockReference) {
-            // blocks are safe by definition
-            $this->setSafe($node, array('all'));
-        } elseif ($node instanceof Twig_Node_Expression_Parent) {
-            // parent block is safe by definition
-            $this->setSafe($node, array('all'));
-        } elseif ($node instanceof Twig_Node_Expression_Conditional) {
-            // intersect safeness of both operands
-            $safe = $this->intersectSafe($this->getSafe($node->getNode('expr2')), $this->getSafe($node->getNode('expr3')));
-            $this->setSafe($node, $safe);
-        } elseif ($node instanceof Twig_Node_Expression_Filter) {
-            // filter expression is safe when the filter is safe
-            $name = $node->getNode('filter')->getAttribute('value');
-            $args = $node->getNode('arguments');
-            if (false !== $filter = $env->getFilter($name)) {
-                $safe = $filter->getSafe($args);
-                if (null === $safe) {
-                    $safe = $this->intersectSafe($this->getSafe($node->getNode('node')), $filter->getPreservesSafety());
-                }
-                $this->setSafe($node, $safe);
-            } else {
-                $this->setSafe($node, array());
-            }
-        } elseif ($node instanceof Twig_Node_Expression_Function) {
-            // function expression is safe when the function is safe
-            $name = $node->getAttribute('name');
-            $args = $node->getNode('arguments');
-            $function = $env->getFunction($name);
-            if (false !== $function) {
-                $this->setSafe($node, $function->getSafe($args));
-            } else {
-                $this->setSafe($node, array());
-            }
-        } elseif ($node instanceof Twig_Node_Expression_MethodCall) {
-            if ($node->getAttribute('safe')) {
-                $this->setSafe($node, array('all'));
-            } else {
-                $this->setSafe($node, array());
-            }
-        } else {
-            $this->setSafe($node, array());
-        }
-
-        return $node;
-    }
-
-    protected function intersectSafe(array $a = null, array $b = null)
-    {
-        if (null === $a || null === $b) {
-            return array();
-        }
-
-        if (in_array('all', $a)) {
-            return $b;
-        }
-
-        if (in_array('all', $b)) {
-            return $a;
-        }
-
-        return array_intersect($a, $b);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getPriority()
-    {
-        return 0;
-    }
-}
diff --git a/core/vendor/Twig/NodeVisitor/Sandbox.php b/core/vendor/Twig/NodeVisitor/Sandbox.php
deleted file mode 100644
index 61ef0c6..0000000
--- a/core/vendor/Twig/NodeVisitor/Sandbox.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Twig_NodeVisitor_Sandbox implements sandboxing.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_NodeVisitor_Sandbox implements Twig_NodeVisitorInterface
-{
-    protected $inAModule = false;
-    protected $tags;
-    protected $filters;
-    protected $functions;
-
-    /**
-     * Called before child nodes are visited.
-     *
-     * @param Twig_NodeInterface $node The node to visit
-     * @param Twig_Environment   $env  The Twig environment instance
-     *
-     * @return Twig_NodeInterface The modified node
-     */
-    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        // in a sandbox tag, only include tags are allowed
-        if ($node instanceof Twig_Node_Sandbox && !$node->getNode('body') instanceof Twig_Node_Include) {
-            foreach ($node->getNode('body') as $n) {
-                if ($n instanceof Twig_Node_Text && ctype_space($n->getAttribute('data'))) {
-                    continue;
-                }
-
-                if (!$n instanceof Twig_Node_Include) {
-                    throw new Twig_Error_Syntax('Only "include" tags are allowed within a "sandbox" section', $n->getLine());
-                }
-            }
-        }
-
-        if ($node instanceof Twig_Node_Module) {
-            $this->inAModule = true;
-            $this->tags = array();
-            $this->filters = array();
-            $this->functions = array();
-
-            return $node;
-        } elseif ($this->inAModule) {
-            // look for tags
-            if ($node->getNodeTag()) {
-                $this->tags[] = $node->getNodeTag();
-            }
-
-            // look for filters
-            if ($node instanceof Twig_Node_Expression_Filter) {
-                $this->filters[] = $node->getNode('filter')->getAttribute('value');
-            }
-
-            // look for functions
-            if ($node instanceof Twig_Node_Expression_Function) {
-                $this->functions[] = $node->getAttribute('name');
-            }
-
-            // wrap print to check __toString() calls
-            if ($node instanceof Twig_Node_Print) {
-                return new Twig_Node_SandboxedPrint($node->getNode('expr'), $node->getLine(), $node->getNodeTag());
-            }
-        }
-
-        return $node;
-    }
-
-    /**
-     * Called after child nodes are visited.
-     *
-     * @param Twig_NodeInterface $node The node to visit
-     * @param Twig_Environment   $env  The Twig environment instance
-     *
-     * @return Twig_NodeInterface The modified node
-     */
-    public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_Module) {
-            $this->inAModule = false;
-
-            return new Twig_Node_SandboxedModule($node, array_unique($this->filters), array_unique($this->tags), array_unique($this->functions));
-        }
-
-        return $node;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getPriority()
-    {
-        return 0;
-    }
-}
diff --git a/core/vendor/Twig/NodeVisitorInterface.php b/core/vendor/Twig/NodeVisitorInterface.php
deleted file mode 100644
index e0123b5..0000000
--- a/core/vendor/Twig/NodeVisitorInterface.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Twig_NodeVisitorInterface is the interface the all node visitor classes must implement.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_NodeVisitorInterface
-{
-    /**
-     * Called before child nodes are visited.
-     *
-     * @param Twig_NodeInterface $node The node to visit
-     * @param Twig_Environment   $env  The Twig environment instance
-     *
-     * @return Twig_NodeInterface The modified node
-     */
-    function enterNode(Twig_NodeInterface $node, Twig_Environment $env);
-
-    /**
-     * Called after child nodes are visited.
-     *
-     * @param Twig_NodeInterface $node The node to visit
-     * @param Twig_Environment   $env  The Twig environment instance
-     *
-     * @return Twig_NodeInterface The modified node
-     */
-    function leaveNode(Twig_NodeInterface $node, Twig_Environment $env);
-
-    /**
-     * Returns the priority for this visitor.
-     *
-     * Priority should be between -10 and 10 (0 is the default).
-     *
-     * @return integer The priority level
-     */
-    function getPriority();
-}
diff --git a/core/vendor/Twig/Parser.php b/core/vendor/Twig/Parser.php
deleted file mode 100644
index 8c578fd..0000000
--- a/core/vendor/Twig/Parser.php
+++ /dev/null
@@ -1,384 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Default parser implementation.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Parser implements Twig_ParserInterface
-{
-    protected $stack = array();
-    protected $stream;
-    protected $parent;
-    protected $handlers;
-    protected $visitors;
-    protected $expressionParser;
-    protected $blocks;
-    protected $blockStack;
-    protected $macros;
-    protected $env;
-    protected $reservedMacroNames;
-    protected $importedFunctions;
-    protected $tmpVarCount;
-    protected $traits;
-    protected $embeddedTemplates = array();
-
-    /**
-     * Constructor.
-     *
-     * @param Twig_Environment $env A Twig_Environment instance
-     */
-    public function __construct(Twig_Environment $env)
-    {
-        $this->env = $env;
-    }
-
-    public function getEnvironment()
-    {
-        return $this->env;
-    }
-
-    public function getVarName()
-    {
-        return sprintf('__internal_%s_%d', substr($this->env->getTemplateClass($this->stream->getFilename()), strlen($this->env->getTemplateClassPrefix())), ++$this->tmpVarCount);
-    }
-
-    /**
-     * Converts a token stream to a node tree.
-     *
-     * @param Twig_TokenStream $stream A token stream instance
-     *
-     * @return Twig_Node_Module A node tree
-     */
-    public function parse(Twig_TokenStream $stream, $test = null, $dropNeedle = false)
-    {
-        // push all variables into the stack to keep the current state of the parser
-        $vars = get_object_vars($this);
-        unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser']);
-        $this->stack[] = $vars;
-
-        $this->tmpVarCount = 0;
-
-        // tag handlers
-        if (null === $this->handlers) {
-            $this->handlers = $this->env->getTokenParsers();
-            $this->handlers->setParser($this);
-        }
-
-        // node visitors
-        if (null === $this->visitors) {
-            $this->visitors = $this->env->getNodeVisitors();
-        }
-
-        if (null === $this->expressionParser) {
-            $this->expressionParser = new Twig_ExpressionParser($this, $this->env->getUnaryOperators(), $this->env->getBinaryOperators());
-        }
-
-        $this->stream = $stream;
-        $this->parent = null;
-        $this->blocks = array();
-        $this->macros = array();
-        $this->traits = array();
-        $this->blockStack = array();
-        $this->importedFunctions = array(array());
-        $this->embeddedTemplates = array();
-
-        try {
-            $body = $this->subparse($test, $dropNeedle);
-
-            if (null !== $this->parent) {
-                if (null === $body = $this->filterBodyNodes($body)) {
-                    $body = new Twig_Node();
-                }
-            }
-        } catch (Twig_Error_Syntax $e) {
-            if (null === $e->getTemplateFile()) {
-                $e->setTemplateFile($this->stream->getFilename());
-            }
-
-            throw $e;
-        }
-
-        $node = new Twig_Node_Module(new Twig_Node_Body(array($body)), $this->parent, new Twig_Node($this->blocks), new Twig_Node($this->macros), new Twig_Node($this->traits), $this->embeddedTemplates, $this->stream->getFilename());
-
-        $traverser = new Twig_NodeTraverser($this->env, $this->visitors);
-
-        $node = $traverser->traverse($node);
-
-        // restore previous stack so previous parse() call can resume working
-        foreach (array_pop($this->stack) as $key => $val) {
-            $this->$key = $val;
-        }
-
-        return $node;
-    }
-
-    public function subparse($test, $dropNeedle = false)
-    {
-        $lineno = $this->getCurrentToken()->getLine();
-        $rv = array();
-        while (!$this->stream->isEOF()) {
-            switch ($this->getCurrentToken()->getType()) {
-                case Twig_Token::TEXT_TYPE:
-                    $token = $this->stream->next();
-                    $rv[] = new Twig_Node_Text($token->getValue(), $token->getLine());
-                    break;
-
-                case Twig_Token::VAR_START_TYPE:
-                    $token = $this->stream->next();
-                    $expr = $this->expressionParser->parseExpression();
-                    $this->stream->expect(Twig_Token::VAR_END_TYPE);
-                    $rv[] = new Twig_Node_Print($expr, $token->getLine());
-                    break;
-
-                case Twig_Token::BLOCK_START_TYPE:
-                    $this->stream->next();
-                    $token = $this->getCurrentToken();
-
-                    if ($token->getType() !== Twig_Token::NAME_TYPE) {
-                        throw new Twig_Error_Syntax('A block must start with a tag name', $token->getLine(), $this->stream->getFilename());
-                    }
-
-                    if (null !== $test && call_user_func($test, $token)) {
-                        if ($dropNeedle) {
-                            $this->stream->next();
-                        }
-
-                        if (1 === count($rv)) {
-                            return $rv[0];
-                        }
-
-                        return new Twig_Node($rv, array(), $lineno);
-                    }
-
-                    $subparser = $this->handlers->getTokenParser($token->getValue());
-                    if (null === $subparser) {
-                        if (null !== $test) {
-                            throw new Twig_Error_Syntax(sprintf('Unexpected tag name "%s" (expecting closing tag for the "%s" tag defined near line %s)', $token->getValue(), $test[0]->getTag(), $lineno), $token->getLine(), $this->stream->getFilename());
-                        }
-
-                        $message = sprintf('Unknown tag name "%s"', $token->getValue());
-                        if ($alternatives = $this->env->computeAlternatives($token->getValue(), array_keys($this->env->getTags()))) {
-                            $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
-                        }
-
-                        throw new Twig_Error_Syntax($message, $token->getLine(), $this->stream->getFilename());
-                    }
-
-                    $this->stream->next();
-
-                    $node = $subparser->parse($token);
-                    if (null !== $node) {
-                        $rv[] = $node;
-                    }
-                    break;
-
-                default:
-                    throw new Twig_Error_Syntax('Lexer or parser ended up in unsupported state.', -1, $this->stream->getFilename());
-            }
-        }
-
-        if (1 === count($rv)) {
-            return $rv[0];
-        }
-
-        return new Twig_Node($rv, array(), $lineno);
-    }
-
-    public function addHandler($name, $class)
-    {
-        $this->handlers[$name] = $class;
-    }
-
-    public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
-    {
-        $this->visitors[] = $visitor;
-    }
-
-    public function getBlockStack()
-    {
-        return $this->blockStack;
-    }
-
-    public function peekBlockStack()
-    {
-        return $this->blockStack[count($this->blockStack) - 1];
-    }
-
-    public function popBlockStack()
-    {
-        array_pop($this->blockStack);
-    }
-
-    public function pushBlockStack($name)
-    {
-        $this->blockStack[] = $name;
-    }
-
-    public function hasBlock($name)
-    {
-        return isset($this->blocks[$name]);
-    }
-
-    public function getBlock($name)
-    {
-        return $this->blocks[$name];
-    }
-
-    public function setBlock($name, $value)
-    {
-        $this->blocks[$name] = new Twig_Node_Body(array($value), array(), $value->getLine());
-    }
-
-    public function hasMacro($name)
-    {
-        return isset($this->macros[$name]);
-    }
-
-    public function setMacro($name, Twig_Node_Macro $node)
-    {
-        if (null === $this->reservedMacroNames) {
-            $this->reservedMacroNames = array();
-            $r = new ReflectionClass($this->env->getBaseTemplateClass());
-            foreach ($r->getMethods() as $method) {
-                $this->reservedMacroNames[] = $method->getName();
-            }
-        }
-
-        if (in_array($name, $this->reservedMacroNames)) {
-            throw new Twig_Error_Syntax(sprintf('"%s" cannot be used as a macro name as it is a reserved keyword', $name), $node->getLine());
-        }
-
-        $this->macros[$name] = $node;
-    }
-
-    public function addTrait($trait)
-    {
-        $this->traits[] = $trait;
-    }
-
-    public function hasTraits()
-    {
-        return count($this->traits) > 0;
-    }
-
-    public function embedTemplate(Twig_Node_Module $template)
-    {
-        $template->setIndex(count($this->embeddedTemplates) + 1);
-
-        $this->embeddedTemplates[] = $template;
-    }
-
-    public function addImportedFunction($alias, $name, Twig_Node_Expression $node)
-    {
-        $this->importedFunctions[0][$alias] = array('name' => $name, 'node' => $node);
-    }
-
-    public function getImportedFunction($alias)
-    {
-        foreach ($this->importedFunctions as $functions) {
-            if (isset($functions[$alias])) {
-                return $functions[$alias];
-            }
-        }
-    }
-
-    public function isMainScope()
-    {
-        return 1 === count($this->importedFunctions);
-    }
-
-    public function pushLocalScope()
-    {
-        array_unshift($this->importedFunctions, array());
-    }
-
-    public function popLocalScope()
-    {
-        array_shift($this->importedFunctions);
-    }
-
-    /**
-     * Gets the expression parser.
-     *
-     * @return Twig_ExpressionParser The expression parser
-     */
-    public function getExpressionParser()
-    {
-        return $this->expressionParser;
-    }
-
-    public function getParent()
-    {
-        return $this->parent;
-    }
-
-    public function setParent($parent)
-    {
-        $this->parent = $parent;
-    }
-
-    /**
-     * Gets the token stream.
-     *
-     * @return Twig_TokenStream The token stream
-     */
-    public function getStream()
-    {
-        return $this->stream;
-    }
-
-    /**
-     * Gets the current token.
-     *
-     * @return Twig_Token The current token
-     */
-    public function getCurrentToken()
-    {
-        return $this->stream->getCurrent();
-    }
-
-    protected function filterBodyNodes(Twig_NodeInterface $node)
-    {
-        // check that the body does not contain non-empty output nodes
-        if (
-            ($node instanceof Twig_Node_Text && !ctype_space($node->getAttribute('data')))
-            ||
-            (!$node instanceof Twig_Node_Text && !$node instanceof Twig_Node_BlockReference && $node instanceof Twig_NodeOutputInterface)
-        ) {
-            if (false !== strpos((string) $node, chr(0xEF).chr(0xBB).chr(0xBF))) {
-                throw new Twig_Error_Syntax('A template that extends another one cannot have a body but a byte order mark (BOM) has been detected; it must be removed.', $node->getLine(), $this->stream->getFilename());
-            }
-
-            throw new Twig_Error_Syntax('A template that extends another one cannot have a body.', $node->getLine(), $this->stream->getFilename());
-        }
-
-        // bypass "set" nodes as they "capture" the output
-        if ($node instanceof Twig_Node_Set) {
-            return $node;
-        }
-
-        if ($node instanceof Twig_NodeOutputInterface) {
-            return;
-        }
-
-        foreach ($node as $k => $n) {
-            if (null !== $n && null === $n = $this->filterBodyNodes($n)) {
-                $node->removeNode($k);
-            }
-        }
-
-        return $node;
-    }
-}
diff --git a/core/vendor/Twig/ParserInterface.php b/core/vendor/Twig/ParserInterface.php
deleted file mode 100644
index 9659845..0000000
--- a/core/vendor/Twig/ParserInterface.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by parser classes.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_ParserInterface
-{
-    /**
-     * Converts a token stream to a node tree.
-     *
-     * @param Twig_TokenStream $stream A token stream instance
-     *
-     * @return Twig_Node_Module A node tree
-     */
-    function parse(Twig_TokenStream $stream);
-}
diff --git a/core/vendor/Twig/Sandbox/SecurityError.php b/core/vendor/Twig/Sandbox/SecurityError.php
deleted file mode 100644
index debabb7..0000000
--- a/core/vendor/Twig/Sandbox/SecurityError.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Exception thrown when a security error occurs at runtime.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Sandbox_SecurityError extends Twig_Error
-{
-}
diff --git a/core/vendor/Twig/Sandbox/SecurityPolicy.php b/core/vendor/Twig/Sandbox/SecurityPolicy.php
deleted file mode 100644
index ba912ef..0000000
--- a/core/vendor/Twig/Sandbox/SecurityPolicy.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a security policy which need to be enforced when sandbox mode is enabled.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Sandbox_SecurityPolicy implements Twig_Sandbox_SecurityPolicyInterface
-{
-    protected $allowedTags;
-    protected $allowedFilters;
-    protected $allowedMethods;
-    protected $allowedProperties;
-    protected $allowedFunctions;
-
-    public function __construct(array $allowedTags = array(), array $allowedFilters = array(), array $allowedMethods = array(), array $allowedProperties = array(), array $allowedFunctions = array())
-    {
-        $this->allowedTags = $allowedTags;
-        $this->allowedFilters = $allowedFilters;
-        $this->setAllowedMethods($allowedMethods);
-        $this->allowedProperties = $allowedProperties;
-        $this->allowedFunctions = $allowedFunctions;
-    }
-
-    public function setAllowedTags(array $tags)
-    {
-        $this->allowedTags = $tags;
-    }
-
-    public function setAllowedFilters(array $filters)
-    {
-        $this->allowedFilters = $filters;
-    }
-
-    public function setAllowedMethods(array $methods)
-    {
-        $this->allowedMethods = array();
-        foreach ($methods as $class => $m) {
-            $this->allowedMethods[$class] = array_map('strtolower', is_array($m) ? $m : array($m));
-        }
-    }
-
-    public function setAllowedProperties(array $properties)
-    {
-        $this->allowedProperties = $properties;
-    }
-
-    public function setAllowedFunctions(array $functions)
-    {
-        $this->allowedFunctions = $functions;
-    }
-
-    public function checkSecurity($tags, $filters, $functions)
-    {
-        foreach ($tags as $tag) {
-            if (!in_array($tag, $this->allowedTags)) {
-                throw new Twig_Sandbox_SecurityError(sprintf('Tag "%s" is not allowed.', $tag));
-            }
-        }
-
-        foreach ($filters as $filter) {
-            if (!in_array($filter, $this->allowedFilters)) {
-                throw new Twig_Sandbox_SecurityError(sprintf('Filter "%s" is not allowed.', $filter));
-            }
-        }
-
-        foreach ($functions as $function) {
-            if (!in_array($function, $this->allowedFunctions)) {
-                throw new Twig_Sandbox_SecurityError(sprintf('Function "%s" is not allowed.', $function));
-            }
-        }
-    }
-
-    public function checkMethodAllowed($obj, $method)
-    {
-        if ($obj instanceof Twig_TemplateInterface || $obj instanceof Twig_Markup) {
-            return true;
-        }
-
-        $allowed = false;
-        $method = strtolower($method);
-        foreach ($this->allowedMethods as $class => $methods) {
-            if ($obj instanceof $class) {
-                $allowed = in_array($method, $methods);
-
-                break;
-            }
-        }
-
-        if (!$allowed) {
-            throw new Twig_Sandbox_SecurityError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, get_class($obj)));
-        }
-    }
-
-    public function checkPropertyAllowed($obj, $property)
-    {
-        $allowed = false;
-        foreach ($this->allowedProperties as $class => $properties) {
-            if ($obj instanceof $class) {
-                $allowed = in_array($property, is_array($properties) ? $properties : array($properties));
-
-                break;
-            }
-        }
-
-        if (!$allowed) {
-            throw new Twig_Sandbox_SecurityError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, get_class($obj)));
-        }
-    }
-}
diff --git a/core/vendor/Twig/Sandbox/SecurityPolicyInterface.php b/core/vendor/Twig/Sandbox/SecurityPolicyInterface.php
deleted file mode 100644
index d5015af..0000000
--- a/core/vendor/Twig/Sandbox/SecurityPolicyInterface.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interfaces that all security policy classes must implements.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_Sandbox_SecurityPolicyInterface
-{
-    function checkSecurity($tags, $filters, $functions);
-
-    function checkMethodAllowed($obj, $method);
-
-    function checkPropertyAllowed($obj, $method);
-}
diff --git a/core/vendor/Twig/Template.php b/core/vendor/Twig/Template.php
deleted file mode 100644
index 7ecdba4..0000000
--- a/core/vendor/Twig/Template.php
+++ /dev/null
@@ -1,442 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Default base class for compiled templates.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-abstract class Twig_Template implements Twig_TemplateInterface
-{
-    static protected $cache = array();
-
-    protected $parent;
-    protected $parents;
-    protected $env;
-    protected $blocks;
-    protected $traits;
-
-    /**
-     * Constructor.
-     *
-     * @param Twig_Environment $env A Twig_Environment instance
-     */
-    public function __construct(Twig_Environment $env)
-    {
-        $this->env = $env;
-        $this->blocks = array();
-        $this->traits = array();
-    }
-
-    /**
-     * Returns the template name.
-     *
-     * @return string The template name
-     */
-    abstract public function getTemplateName();
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getEnvironment()
-    {
-        return $this->env;
-    }
-
-    /**
-     * Returns the parent template.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @return Twig_TemplateInterface|false The parent template or false if there is no parent
-     */
-    public function getParent(array $context)
-    {
-        if (null !== $this->parent) {
-            return $this->parent;
-        }
-
-        $parent = $this->doGetParent($context);
-        if (false === $parent) {
-            return false;
-        } elseif ($parent instanceof Twig_Template) {
-            $name = $parent->getTemplateName();
-            $this->parents[$name] = $parent;
-            $parent = $name;
-        } elseif (!isset($this->parents[$parent])) {
-            $this->parents[$parent] = $this->env->loadTemplate($parent);
-        }
-
-        return $this->parents[$parent];
-    }
-
-    protected function doGetParent(array $context)
-    {
-        return false;
-    }
-
-    public function isTraitable()
-    {
-        return true;
-    }
-
-    /**
-     * Displays a parent block.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name    The block name to display from the parent
-     * @param array  $context The context
-     * @param array  $blocks  The current set of blocks
-     */
-    public function displayParentBlock($name, array $context, array $blocks = array())
-    {
-        $name = (string) $name;
-
-        if (isset($this->traits[$name])) {
-            $this->traits[$name][0]->displayBlock($name, $context, $blocks);
-        } elseif (false !== $parent = $this->getParent($context)) {
-            $parent->displayBlock($name, $context, $blocks);
-        } else {
-            throw new Twig_Error_Runtime(sprintf('The template has no parent and no traits defining the "%s" block', $name), -1, $this->getTemplateName());
-        }
-    }
-
-    /**
-     * Displays a block.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name    The block name to display
-     * @param array  $context The context
-     * @param array  $blocks  The current set of blocks
-     */
-    public function displayBlock($name, array $context, array $blocks = array())
-    {
-        $name = (string) $name;
-
-        if (isset($blocks[$name])) {
-            $b = $blocks;
-            unset($b[$name]);
-            call_user_func($blocks[$name], $context, $b);
-        } elseif (isset($this->blocks[$name])) {
-            call_user_func($this->blocks[$name], $context, $blocks);
-        } elseif (false !== $parent = $this->getParent($context)) {
-            $parent->displayBlock($name, $context, array_merge($this->blocks, $blocks));
-        }
-    }
-
-    /**
-     * Renders a parent block.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name    The block name to render from the parent
-     * @param array  $context The context
-     * @param array  $blocks  The current set of blocks
-     *
-     * @return string The rendered block
-     */
-    public function renderParentBlock($name, array $context, array $blocks = array())
-    {
-        ob_start();
-        $this->displayParentBlock($name, $context, $blocks);
-
-        return ob_get_clean();
-    }
-
-    /**
-     * Renders a block.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name    The block name to render
-     * @param array  $context The context
-     * @param array  $blocks  The current set of blocks
-     *
-     * @return string The rendered block
-     */
-    public function renderBlock($name, array $context, array $blocks = array())
-    {
-        ob_start();
-        $this->displayBlock($name, $context, $blocks);
-
-        return ob_get_clean();
-    }
-
-    /**
-     * Returns whether a block exists or not.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * This method does only return blocks defined in the current template
-     * or defined in "used" traits.
-     *
-     * It does not return blocks from parent templates as the parent
-     * template name can be dynamic, which is only known based on the
-     * current context.
-     *
-     * @param string $name The block name
-     *
-     * @return Boolean true if the block exists, false otherwise
-     */
-    public function hasBlock($name)
-    {
-        return isset($this->blocks[(string) $name]);
-    }
-
-    /**
-     * Returns all block names.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @return array An array of block names
-     *
-     * @see hasBlock
-     */
-    public function getBlockNames()
-    {
-        return array_keys($this->blocks);
-    }
-
-    /**
-     * Returns all blocks.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @return array An array of blocks
-     *
-     * @see hasBlock
-     */
-    public function getBlocks()
-    {
-        return $this->blocks;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function display(array $context, array $blocks = array())
-    {
-        $this->displayWithErrorHandling($this->env->mergeGlobals($context), $blocks);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function render(array $context)
-    {
-        $level = ob_get_level();
-        ob_start();
-        try {
-            $this->display($context);
-        } catch (Exception $e) {
-            while (ob_get_level() > $level) {
-                ob_end_clean();
-            }
-
-            throw $e;
-        }
-
-        return ob_get_clean();
-    }
-
-    protected function displayWithErrorHandling(array $context, array $blocks = array())
-    {
-        try {
-            $this->doDisplay($context, $blocks);
-        } catch (Twig_Error $e) {
-            throw $e;
-        } catch (Exception $e) {
-            throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, null, $e);
-        }
-    }
-
-    /**
-     * Auto-generated method to display the template with the given context.
-     *
-     * @param array $context An array of parameters to pass to the template
-     * @param array $blocks  An array of blocks to pass to the template
-     */
-    abstract protected function doDisplay(array $context, array $blocks = array());
-
-    /**
-     * Returns a variable from the context.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * This method should not be overriden in a sub-class as this is an
-     * implementation detail that has been introduced to optimize variable
-     * access for versions of PHP before 5.4. This is not a way to override
-     * the way to get a variable value.
-     *
-     * @param array   $context           The context
-     * @param string  $item              The variable to return from the context
-     * @param Boolean $ignoreStrictCheck Whether to ignore the strict variable check or not
-     *
-     * @return The content of the context variable
-     *
-     * @throws Twig_Error_Runtime if the variable does not exist and Twig is running in strict mode
-     */
-    final protected function getContext($context, $item, $ignoreStrictCheck = false)
-    {
-        if (!array_key_exists($item, $context)) {
-            if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-                return null;
-            }
-
-            throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist', $item));
-        }
-
-        return $context[$item];
-    }
-
-    /**
-     * Returns the attribute value for a given array/object.
-     *
-     * @param mixed   $object            The object or array from where to get the item
-     * @param mixed   $item              The item to get from the array or object
-     * @param array   $arguments         An array of arguments to pass if the item is an object method
-     * @param string  $type              The type of attribute (@see Twig_TemplateInterface)
-     * @param Boolean $isDefinedTest     Whether this is only a defined check
-     * @param Boolean $ignoreStrictCheck Whether to ignore the strict attribute check or not
-     *
-     * @return mixed The attribute value, or a Boolean when $isDefinedTest is true, or null when the attribute is not set and $ignoreStrictCheck is true
-     *
-     * @throws Twig_Error_Runtime if the attribute does not exist and Twig is running in strict mode and $isDefinedTest is false
-     */
-    protected function getAttribute($object, $item, array $arguments = array(), $type = Twig_TemplateInterface::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false)
-    {
-        $item = ctype_digit((string) $item) ? (int) $item : (string) $item;
-
-        // array
-        if (Twig_TemplateInterface::METHOD_CALL !== $type) {
-            if ((is_array($object) && array_key_exists($item, $object))
-                || ($object instanceof ArrayAccess && isset($object[$item]))
-            ) {
-                if ($isDefinedTest) {
-                    return true;
-                }
-
-                return $object[$item];
-            }
-
-            if (Twig_TemplateInterface::ARRAY_CALL === $type) {
-                if ($isDefinedTest) {
-                    return false;
-                }
-
-                if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-                    return null;
-                }
-
-                if (is_object($object)) {
-                    throw new Twig_Error_Runtime(sprintf('Key "%s" in object (with ArrayAccess) of type "%s" does not exist', $item, get_class($object)));
-                } elseif (is_array($object)) {
-                    throw new Twig_Error_Runtime(sprintf('Key "%s" for array with keys "%s" does not exist', $item, implode(', ', array_keys($object))));
-                } else {
-                    throw new Twig_Error_Runtime(sprintf('Impossible to access a key ("%s") on a "%s" variable', $item, gettype($object)));
-                }
-            }
-        }
-
-        if (!is_object($object)) {
-            if ($isDefinedTest) {
-                return false;
-            }
-
-            if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-                return null;
-            }
-
-            throw new Twig_Error_Runtime(sprintf('Item "%s" for "%s" does not exist', $item, is_array($object) ? 'Array' : $object));
-        }
-
-        $class = get_class($object);
-
-        // object property
-        if (Twig_TemplateInterface::METHOD_CALL !== $type) {
-            if (isset($object->$item) || array_key_exists($item, $object)) {
-                if ($isDefinedTest) {
-                    return true;
-                }
-
-                if ($this->env->hasExtension('sandbox')) {
-                    $this->env->getExtension('sandbox')->checkPropertyAllowed($object, $item);
-                }
-
-                return $object->$item;
-            }
-        }
-
-        // object method
-        if (!isset(self::$cache[$class]['methods'])) {
-            self::$cache[$class]['methods'] = array_change_key_case(array_flip(get_class_methods($object)));
-        }
-
-        $lcItem = strtolower($item);
-        if (isset(self::$cache[$class]['methods'][$lcItem])) {
-            $method = $item;
-        } elseif (isset(self::$cache[$class]['methods']['get'.$lcItem])) {
-            $method = 'get'.$item;
-        } elseif (isset(self::$cache[$class]['methods']['is'.$lcItem])) {
-            $method = 'is'.$item;
-        } elseif (isset(self::$cache[$class]['methods']['__call'])) {
-            $method = $item;
-        } else {
-            if ($isDefinedTest) {
-                return false;
-            }
-
-            if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-                return null;
-            }
-
-            throw new Twig_Error_Runtime(sprintf('Method "%s" for object "%s" does not exist', $item, get_class($object)));
-        }
-
-        if ($isDefinedTest) {
-            return true;
-        }
-
-        if ($this->env->hasExtension('sandbox')) {
-            $this->env->getExtension('sandbox')->checkMethodAllowed($object, $method);
-        }
-
-        $ret = call_user_func_array(array($object, $method), $arguments);
-
-        // hack to be removed when macro calls are refactored
-        if ($object instanceof Twig_TemplateInterface) {
-            return $ret === '' ? '' : new Twig_Markup($ret, $this->env->getCharset());
-        }
-
-        return $ret;
-    }
-
-    /**
-     * This method is only useful when testing Twig. Do not use it.
-     */
-    static public function clearCache()
-    {
-        self::$cache = array();
-    }
-}
diff --git a/core/vendor/Twig/TemplateInterface.php b/core/vendor/Twig/TemplateInterface.php
deleted file mode 100644
index 08da116..0000000
--- a/core/vendor/Twig/TemplateInterface.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by all compiled templates.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_TemplateInterface
-{
-    const ANY_CALL    = 'any';
-    const ARRAY_CALL  = 'array';
-    const METHOD_CALL = 'method';
-
-    /**
-     * Renders the template with the given context and returns it as string.
-     *
-     * @param array $context An array of parameters to pass to the template
-     *
-     * @return string The rendered template
-     */
-    function render(array $context);
-
-    /**
-     * Displays the template with the given context.
-     *
-     * @param array $context An array of parameters to pass to the template
-     * @param array $blocks  An array of blocks to pass to the template
-     */
-    function display(array $context, array $blocks = array());
-
-    /**
-     * Returns the bound environment for this template.
-     *
-     * @return Twig_Environment The current environment
-     */
-    function getEnvironment();
-}
diff --git a/core/vendor/Twig/Test/Function.php b/core/vendor/Twig/Test/Function.php
deleted file mode 100644
index 1240a0f..0000000
--- a/core/vendor/Twig/Test/Function.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a function template test.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Test_Function implements Twig_TestInterface
-{
-    protected $function;
-
-    public function __construct($function)
-    {
-        $this->function = $function;
-    }
-
-    public function compile()
-    {
-        return $this->function;
-    }
-}
diff --git a/core/vendor/Twig/Test/Method.php b/core/vendor/Twig/Test/Method.php
deleted file mode 100644
index a8d1d9b..0000000
--- a/core/vendor/Twig/Test/Method.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a method template test.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Test_Method implements Twig_TestInterface
-{
-    protected $extension;
-    protected $method;
-
-    public function __construct(Twig_ExtensionInterface $extension, $method)
-    {
-        $this->extension = $extension;
-        $this->method = $method;
-    }
-
-    public function compile()
-    {
-        return sprintf('$this->env->getExtension(\'%s\')->%s', $this->extension->getName(), $this->method);
-    }
-}
diff --git a/core/vendor/Twig/Test/Node.php b/core/vendor/Twig/Test/Node.php
deleted file mode 100644
index 47a978e..0000000
--- a/core/vendor/Twig/Test/Node.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template test as a Node.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Test_Node implements Twig_TestInterface
-{
-    protected $class;
-
-    public function __construct($class)
-    {
-        $this->class = $class;
-    }
-
-    public function getClass()
-    {
-        return $this->class;
-    }
-
-    public function compile()
-    {
-    }
-}
diff --git a/core/vendor/Twig/TestInterface.php b/core/vendor/Twig/TestInterface.php
deleted file mode 100644
index c2ff725..0000000
--- a/core/vendor/Twig/TestInterface.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template test.
- *
- * @package    twig
- * @author     Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_TestInterface
-{
-    /**
-     * Compiles a test.
-     *
-     * @return string The PHP code for the test
-     */
-    function compile();
-}
diff --git a/core/vendor/Twig/Token.php b/core/vendor/Twig/Token.php
deleted file mode 100644
index 918bb91..0000000
--- a/core/vendor/Twig/Token.php
+++ /dev/null
@@ -1,219 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a Token.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_Token
-{
-    protected $value;
-    protected $type;
-    protected $lineno;
-
-    const EOF_TYPE                  = -1;
-    const TEXT_TYPE                 = 0;
-    const BLOCK_START_TYPE          = 1;
-    const VAR_START_TYPE            = 2;
-    const BLOCK_END_TYPE            = 3;
-    const VAR_END_TYPE              = 4;
-    const NAME_TYPE                 = 5;
-    const NUMBER_TYPE               = 6;
-    const STRING_TYPE               = 7;
-    const OPERATOR_TYPE             = 8;
-    const PUNCTUATION_TYPE          = 9;
-    const INTERPOLATION_START_TYPE  = 10;
-    const INTERPOLATION_END_TYPE    = 11;
-
-    /**
-     * Constructor.
-     *
-     * @param integer $type   The type of the token
-     * @param string  $value  The token value
-     * @param integer $lineno The line position in the source
-     */
-    public function __construct($type, $value, $lineno)
-    {
-        $this->type   = $type;
-        $this->value  = $value;
-        $this->lineno = $lineno;
-    }
-
-    /**
-     * Returns a string representation of the token.
-     *
-     * @return string A string representation of the token
-     */
-    public function __toString()
-    {
-        return sprintf('%s(%s)', self::typeToString($this->type, true, $this->lineno), $this->value);
-    }
-
-    /**
-     * Tests the current token for a type and/or a value.
-     *
-     * Parameters may be:
-     * * just type
-     * * type and value (or array of possible values)
-     * * just value (or array of possible values) (NAME_TYPE is used as type)
-     *
-     * @param array|integer     $type   The type to test
-     * @param array|string|null $values The token value
-     *
-     * @return Boolean
-     */
-    public function test($type, $values = null)
-    {
-        if (null === $values && !is_int($type)) {
-            $values = $type;
-            $type = self::NAME_TYPE;
-        }
-
-        return ($this->type === $type) && (
-            null === $values ||
-            (is_array($values) && in_array($this->value, $values)) ||
-            $this->value == $values
-        );
-    }
-
-    /**
-     * Gets the line.
-     *
-     * @return integer The source line
-     */
-    public function getLine()
-    {
-        return $this->lineno;
-    }
-
-    /**
-     * Gets the token type.
-     *
-     * @return integer The token type
-     */
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    /**
-     * Gets the token value.
-     *
-     * @return string The token value
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * Returns the constant representation (internal) of a given type.
-     *
-     * @param integer $type  The type as an integer
-     * @param Boolean $short Whether to return a short representation or not
-     * @param integer $line  The code line
-     *
-     * @return string The string representation
-     */
-    static public function typeToString($type, $short = false, $line = -1)
-    {
-        switch ($type) {
-            case self::EOF_TYPE:
-                $name = 'EOF_TYPE';
-                break;
-            case self::TEXT_TYPE:
-                $name = 'TEXT_TYPE';
-                break;
-            case self::BLOCK_START_TYPE:
-                $name = 'BLOCK_START_TYPE';
-                break;
-            case self::VAR_START_TYPE:
-                $name = 'VAR_START_TYPE';
-                break;
-            case self::BLOCK_END_TYPE:
-                $name = 'BLOCK_END_TYPE';
-                break;
-            case self::VAR_END_TYPE:
-                $name = 'VAR_END_TYPE';
-                break;
-            case self::NAME_TYPE:
-                $name = 'NAME_TYPE';
-                break;
-            case self::NUMBER_TYPE:
-                $name = 'NUMBER_TYPE';
-                break;
-            case self::STRING_TYPE:
-                $name = 'STRING_TYPE';
-                break;
-            case self::OPERATOR_TYPE:
-                $name = 'OPERATOR_TYPE';
-                break;
-            case self::PUNCTUATION_TYPE:
-                $name = 'PUNCTUATION_TYPE';
-                break;
-            case self::INTERPOLATION_START_TYPE:
-                $name = 'INTERPOLATION_START_TYPE';
-                break;
-            case self::INTERPOLATION_END_TYPE:
-                $name = 'INTERPOLATION_END_TYPE';
-                break;
-            default:
-                throw new Twig_Error_Syntax(sprintf('Token of type "%s" does not exist.', $type), $line);
-        }
-
-        return $short ? $name : 'Twig_Token::'.$name;
-    }
-
-    /**
-     * Returns the english representation of a given type.
-     *
-     * @param integer $type The type as an integer
-     * @param integer $line The code line
-     *
-     * @return string The string representation
-     */
-    static public function typeToEnglish($type, $line = -1)
-    {
-        switch ($type) {
-            case self::EOF_TYPE:
-                return 'end of template';
-            case self::TEXT_TYPE:
-                return 'text';
-            case self::BLOCK_START_TYPE:
-                return 'begin of statement block';
-            case self::VAR_START_TYPE:
-                return 'begin of print statement';
-            case self::BLOCK_END_TYPE:
-                return 'end of statement block';
-            case self::VAR_END_TYPE:
-                return 'end of print statement';
-            case self::NAME_TYPE:
-                return 'name';
-            case self::NUMBER_TYPE:
-                return 'number';
-            case self::STRING_TYPE:
-                return 'string';
-            case self::OPERATOR_TYPE:
-                return 'operator';
-            case self::PUNCTUATION_TYPE:
-                return 'punctuation';
-            case self::INTERPOLATION_START_TYPE:
-                return 'begin of string interpolation';
-            case self::INTERPOLATION_END_TYPE:
-                return 'end of string interpolation';
-            default:
-                throw new Twig_Error_Syntax(sprintf('Token of type "%s" does not exist.', $type), $line);
-        }
-    }
-}
diff --git a/core/vendor/Twig/TokenParser.php b/core/vendor/Twig/TokenParser.php
deleted file mode 100644
index ab18bfa..0000000
--- a/core/vendor/Twig/TokenParser.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Base class for all token parsers.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-abstract class Twig_TokenParser implements Twig_TokenParserInterface
-{
-    /**
-     * @var Twig_Parser
-     */
-    protected $parser;
-
-    /**
-     * Sets the parser associated with this token parser
-     *
-     * @param $parser A Twig_Parser instance
-     */
-    public function setParser(Twig_Parser $parser)
-    {
-        $this->parser = $parser;
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/AutoEscape.php b/core/vendor/Twig/TokenParser/AutoEscape.php
deleted file mode 100644
index 0040845..0000000
--- a/core/vendor/Twig/TokenParser/AutoEscape.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Marks a section of a template to be escaped or not.
- *
- * <pre>
- * {% autoescape true %}
- *   Everything will be automatically escaped in this block
- * {% endautoescape %}
- *
- * {% autoescape false %}
- *   Everything will be outputed as is in this block
- * {% endautoescape %}
- *
- * {% autoescape true js %}
- *   Everything will be automatically escaped in this block
- *   using the js escaping strategy
- * {% endautoescape %}
- * </pre>
- */
-class Twig_TokenParser_AutoEscape extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-
-        if ($this->parser->getStream()->test(Twig_Token::BLOCK_END_TYPE)) {
-            $value = 'html';
-        } else {
-            $expr = $this->parser->getExpressionParser()->parseExpression();
-            if (!$expr instanceof Twig_Node_Expression_Constant) {
-                throw new Twig_Error_Syntax('An escaping strategy must be a string or a Boolean.', $lineno);
-            }
-            $value = $expr->getAttribute('value');
-
-            $compat = true === $value || false === $value;
-
-            if (true === $value) {
-                $value = 'html';
-            }
-
-            if ($compat && $this->parser->getStream()->test(Twig_Token::NAME_TYPE)) {
-                if (false === $value) {
-                    throw new Twig_Error_Syntax('Unexpected escaping strategy as you set autoescaping to false.', $lineno);
-                }
-
-                $value = $this->parser->getStream()->next()->getValue();
-            }
-        }
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_AutoEscape($value, $body, $lineno, $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endautoescape');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'autoescape';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Block.php b/core/vendor/Twig/TokenParser/Block.php
deleted file mode 100644
index 994078e..0000000
--- a/core/vendor/Twig/TokenParser/Block.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Marks a section of a template as being reusable.
- *
- * <pre>
- *  {% block head %}
- *    <link rel="stylesheet" href="style.css" />
- *    <title>{% block title %}{% endblock %} - My Webpage</title>
- *  {% endblock %}
- * </pre>
- */
-class Twig_TokenParser_Block extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $stream = $this->parser->getStream();
-        $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-        if ($this->parser->hasBlock($name)) {
-            throw new Twig_Error_Syntax(sprintf("The block '$name' has already been defined line %d", $this->parser->getBlock($name)->getLine()), $lineno);
-        }
-        $this->parser->setBlock($name, $block = new Twig_Node_Block($name, new Twig_Node(array()), $lineno));
-        $this->parser->pushLocalScope();
-        $this->parser->pushBlockStack($name);
-
-        if ($stream->test(Twig_Token::BLOCK_END_TYPE)) {
-            $stream->next();
-
-            $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-            if ($stream->test(Twig_Token::NAME_TYPE)) {
-                $value = $stream->next()->getValue();
-
-                if ($value != $name) {
-                    throw new Twig_Error_Syntax(sprintf("Expected endblock for block '$name' (but %s given)", $value), $lineno);
-                }
-            }
-        } else {
-            $body = new Twig_Node(array(
-                new Twig_Node_Print($this->parser->getExpressionParser()->parseExpression(), $lineno),
-            ));
-        }
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $block->setNode('body', $body);
-        $this->parser->popBlockStack();
-        $this->parser->popLocalScope();
-
-        return new Twig_Node_BlockReference($name, $lineno, $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endblock');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'block';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Do.php b/core/vendor/Twig/TokenParser/Do.php
deleted file mode 100644
index 593d1c6..0000000
--- a/core/vendor/Twig/TokenParser/Do.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Evaluates an expression, disgarding the returned value.
- */
-class Twig_TokenParser_Do extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $expr = $this->parser->getExpressionParser()->parseExpression();
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_Do($expr, $token->getLine(), $this->getTag());
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'do';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Embed.php b/core/vendor/Twig/TokenParser/Embed.php
deleted file mode 100644
index 69cb5f3..0000000
--- a/core/vendor/Twig/TokenParser/Embed.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2012 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Embeds a template.
- */
-class Twig_TokenParser_Embed extends Twig_TokenParser_Include
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $stream = $this->parser->getStream();
-
-        $parent = $this->parser->getExpressionParser()->parseExpression();
-
-        list($variables, $only, $ignoreMissing) = $this->parseArguments();
-
-        // inject a fake parent to make the parent() function work
-        $stream->injectTokens(array(
-            new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', $token->getLine()),
-            new Twig_Token(Twig_Token::NAME_TYPE, 'extends', $token->getLine()),
-            new Twig_Token(Twig_Token::STRING_TYPE, '__parent__', $token->getLine()),
-            new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', $token->getLine()),
-        ));
-
-        $module = $this->parser->parse($stream, array($this, 'decideBlockEnd'), true);
-
-        // override the parent with the correct one
-        $module->setNode('parent', $parent);
-
-        $this->parser->embedTemplate($module);
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_Embed($module->getAttribute('filename'), $module->getAttribute('index'), $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endembed');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'embed';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Extends.php b/core/vendor/Twig/TokenParser/Extends.php
deleted file mode 100644
index 54f49ad..0000000
--- a/core/vendor/Twig/TokenParser/Extends.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Extends a template by another one.
- *
- * <pre>
- *  {% extends "base.html" %}
- * </pre>
- */
-class Twig_TokenParser_Extends extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        if (!$this->parser->isMainScope()) {
-            throw new Twig_Error_Syntax('Cannot extend from a block', $token->getLine());
-        }
-
-        if (null !== $this->parser->getParent()) {
-            throw new Twig_Error_Syntax('Multiple extends tags are forbidden', $token->getLine());
-        }
-        $this->parser->setParent($this->parser->getExpressionParser()->parseExpression());
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return null;
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'extends';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Filter.php b/core/vendor/Twig/TokenParser/Filter.php
deleted file mode 100644
index 2b97475..0000000
--- a/core/vendor/Twig/TokenParser/Filter.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Filters a section of a template by applying filters.
- *
- * <pre>
- * {% filter upper %}
- *  This text becomes uppercase
- * {% endfilter %}
- * </pre>
- */
-class Twig_TokenParser_Filter extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $name = $this->parser->getVarName();
-        $ref = new Twig_Node_Expression_BlockReference(new Twig_Node_Expression_Constant($name, $token->getLine()), true, $token->getLine(), $this->getTag());
-
-        $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag());
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $block = new Twig_Node_Block($name, $body, $token->getLine());
-        $this->parser->setBlock($name, $block);
-
-        return new Twig_Node_Print($filter, $token->getLine(), $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endfilter');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'filter';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Flush.php b/core/vendor/Twig/TokenParser/Flush.php
deleted file mode 100644
index 4e15e78..0000000
--- a/core/vendor/Twig/TokenParser/Flush.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Flushes the output to the client.
- *
- * @see flush()
- */
-class Twig_TokenParser_Flush extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_Flush($token->getLine(), $this->getTag());
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'flush';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/For.php b/core/vendor/Twig/TokenParser/For.php
deleted file mode 100644
index 2cbb580..0000000
--- a/core/vendor/Twig/TokenParser/For.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Loops over each item of a sequence.
- *
- * <pre>
- * <ul>
- *  {% for user in users %}
- *    <li>{{ user.username|e }}</li>
- *  {% endfor %}
- * </ul>
- * </pre>
- */
-class Twig_TokenParser_For extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $targets = $this->parser->getExpressionParser()->parseAssignmentExpression();
-        $this->parser->getStream()->expect(Twig_Token::OPERATOR_TYPE, 'in');
-        $seq = $this->parser->getExpressionParser()->parseExpression();
-
-        $ifexpr = null;
-        if ($this->parser->getStream()->test(Twig_Token::NAME_TYPE, 'if')) {
-            $this->parser->getStream()->next();
-            $ifexpr = $this->parser->getExpressionParser()->parseExpression();
-        }
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideForFork'));
-        if ($this->parser->getStream()->next()->getValue() == 'else') {
-            $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-            $else = $this->parser->subparse(array($this, 'decideForEnd'), true);
-        } else {
-            $else = null;
-        }
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        if (count($targets) > 1) {
-            $keyTarget = $targets->getNode(0);
-            $keyTarget = new Twig_Node_Expression_AssignName($keyTarget->getAttribute('name'), $keyTarget->getLine());
-            $valueTarget = $targets->getNode(1);
-            $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getLine());
-        } else {
-            $keyTarget = new Twig_Node_Expression_AssignName('_key', $lineno);
-            $valueTarget = $targets->getNode(0);
-            $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getLine());
-        }
-
-        return new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, $lineno, $this->getTag());
-    }
-
-    public function decideForFork(Twig_Token $token)
-    {
-        return $token->test(array('else', 'endfor'));
-    }
-
-    public function decideForEnd(Twig_Token $token)
-    {
-        return $token->test('endfor');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'for';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/From.php b/core/vendor/Twig/TokenParser/From.php
deleted file mode 100644
index 16999bc..0000000
--- a/core/vendor/Twig/TokenParser/From.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Imports macros.
- *
- * <pre>
- *   {% from 'forms.html' import forms %}
- * </pre>
- */
-class Twig_TokenParser_From extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $macro = $this->parser->getExpressionParser()->parseExpression();
-        $stream = $this->parser->getStream();
-        $stream->expect('import');
-
-        $targets = array();
-        do {
-            $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
-            $alias = $name;
-            if ($stream->test('as')) {
-                $stream->next();
-
-                $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-            }
-
-            $targets[$name] = $alias;
-
-            if (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ',')) {
-                break;
-            }
-
-            $stream->next();
-        } while (true);
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $node = new Twig_Node_Import($macro, new Twig_Node_Expression_AssignName($this->parser->getVarName(), $token->getLine()), $token->getLine(), $this->getTag());
-
-        foreach ($targets as $name => $alias) {
-            $this->parser->addImportedFunction($alias, 'get'.$name, $node->getNode('var'));
-        }
-
-        return $node;
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'from';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/If.php b/core/vendor/Twig/TokenParser/If.php
deleted file mode 100644
index 1a694af..0000000
--- a/core/vendor/Twig/TokenParser/If.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Tests a condition.
- *
- * <pre>
- * {% if users %}
- *  <ul>
- *    {% for user in users %}
- *      <li>{{ user.username|e }}</li>
- *    {% endfor %}
- *  </ul>
- * {% endif %}
- * </pre>
- */
-class Twig_TokenParser_If extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $expr = $this->parser->getExpressionParser()->parseExpression();
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideIfFork'));
-        $tests = array($expr, $body);
-        $else = null;
-
-        $end = false;
-        while (!$end) {
-            switch ($this->parser->getStream()->next()->getValue()) {
-                case 'else':
-                    $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-                    $else = $this->parser->subparse(array($this, 'decideIfEnd'));
-                    break;
-
-                case 'elseif':
-                    $expr = $this->parser->getExpressionParser()->parseExpression();
-                    $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-                    $body = $this->parser->subparse(array($this, 'decideIfFork'));
-                    $tests[] = $expr;
-                    $tests[] = $body;
-                    break;
-
-                case 'endif':
-                    $end = true;
-                    break;
-
-                default:
-                    throw new Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d)', $lineno), -1);
-            }
-        }
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_If(new Twig_Node($tests), $else, $lineno, $this->getTag());
-    }
-
-    public function decideIfFork(Twig_Token $token)
-    {
-        return $token->test(array('elseif', 'else', 'endif'));
-    }
-
-    public function decideIfEnd(Twig_Token $token)
-    {
-        return $token->test(array('endif'));
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'if';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Import.php b/core/vendor/Twig/TokenParser/Import.php
deleted file mode 100644
index 5219289..0000000
--- a/core/vendor/Twig/TokenParser/Import.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Imports macros.
- *
- * <pre>
- *   {% import 'forms.html' as forms %}
- * </pre>
- */
-class Twig_TokenParser_Import extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $macro = $this->parser->getExpressionParser()->parseExpression();
-        $this->parser->getStream()->expect('as');
-        $var = new Twig_Node_Expression_AssignName($this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue(), $token->getLine());
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_Import($macro, $var, $token->getLine(), $this->getTag());
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'import';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Include.php b/core/vendor/Twig/TokenParser/Include.php
deleted file mode 100644
index 4a31786..0000000
--- a/core/vendor/Twig/TokenParser/Include.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Includes a template.
- *
- * <pre>
- *   {% include 'header.html' %}
- *     Body
- *   {% include 'footer.html' %}
- * </pre>
- */
-class Twig_TokenParser_Include extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $expr = $this->parser->getExpressionParser()->parseExpression();
-
-        list($variables, $only, $ignoreMissing) = $this->parseArguments();
-
-        return new Twig_Node_Include($expr, $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
-    }
-
-    protected function parseArguments()
-    {
-        $stream = $this->parser->getStream();
-
-        $ignoreMissing = false;
-        if ($stream->test(Twig_Token::NAME_TYPE, 'ignore')) {
-            $stream->next();
-            $stream->expect(Twig_Token::NAME_TYPE, 'missing');
-
-            $ignoreMissing = true;
-        }
-
-        $variables = null;
-        if ($stream->test(Twig_Token::NAME_TYPE, 'with')) {
-            $stream->next();
-
-            $variables = $this->parser->getExpressionParser()->parseExpression();
-        }
-
-        $only = false;
-        if ($stream->test(Twig_Token::NAME_TYPE, 'only')) {
-            $stream->next();
-
-            $only = true;
-        }
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return array($variables, $only, $ignoreMissing);
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'include';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Macro.php b/core/vendor/Twig/TokenParser/Macro.php
deleted file mode 100644
index ffd5848..0000000
--- a/core/vendor/Twig/TokenParser/Macro.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Defines a macro.
- *
- * <pre>
- * {% macro input(name, value, type, size) %}
- *    <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
- * {% endmacro %}
- * </pre>
- */
-class Twig_TokenParser_Macro extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $name = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue();
-
-        $arguments = $this->parser->getExpressionParser()->parseArguments();
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-        $this->parser->pushLocalScope();
-        $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-        if ($this->parser->getStream()->test(Twig_Token::NAME_TYPE)) {
-            $value = $this->parser->getStream()->next()->getValue();
-
-            if ($value != $name) {
-                throw new Twig_Error_Syntax(sprintf("Expected endmacro for macro '$name' (but %s given)", $value), $lineno);
-            }
-        }
-        $this->parser->popLocalScope();
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $this->parser->setMacro($name, new Twig_Node_Macro($name, new Twig_Node_Body(array($body)), $arguments, $lineno, $this->getTag()));
-
-        return null;
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endmacro');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'macro';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Sandbox.php b/core/vendor/Twig/TokenParser/Sandbox.php
deleted file mode 100644
index 0277c70..0000000
--- a/core/vendor/Twig/TokenParser/Sandbox.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Marks a section of a template as untrusted code that must be evaluated in the sandbox mode.
- *
- * <pre>
- * {% sandbox %}
- *     {% include 'user.html' %}
- * {% endsandbox %}
- * </pre>
- *
- * @see http://www.twig-project.org/doc/api.html#sandbox-extension for details
- */
-class Twig_TokenParser_Sandbox extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_Sandbox($body, $token->getLine(), $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endsandbox');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'sandbox';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Set.php b/core/vendor/Twig/TokenParser/Set.php
deleted file mode 100644
index 3b4479c..0000000
--- a/core/vendor/Twig/TokenParser/Set.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Defines a variable.
- *
- * <pre>
- *  {% set foo = 'foo' %}
- *
- *  {% set foo = [1, 2] %}
- *
- *  {% set foo = {'foo': 'bar'} %}
- *
- *  {% set foo = 'foo' ~ 'bar' %}
- *
- *  {% set foo, bar = 'foo', 'bar' %}
- *
- *  {% set foo %}Some content{% endset %}
- * </pre>
- */
-class Twig_TokenParser_Set extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $stream = $this->parser->getStream();
-        $names = $this->parser->getExpressionParser()->parseAssignmentExpression();
-
-        $capture = false;
-        if ($stream->test(Twig_Token::OPERATOR_TYPE, '=')) {
-            $stream->next();
-            $values = $this->parser->getExpressionParser()->parseMultitargetExpression();
-
-            $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-            if (count($names) !== count($values)) {
-                throw new Twig_Error_Syntax("When using set, you must have the same number of variables and assignements.", $lineno);
-            }
-        } else {
-            $capture = true;
-
-            if (count($names) > 1) {
-                throw new Twig_Error_Syntax("When using set with a block, you cannot have a multi-target.", $lineno);
-            }
-
-            $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-            $values = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-            $stream->expect(Twig_Token::BLOCK_END_TYPE);
-        }
-
-        return new Twig_Node_Set($capture, $names, $values, $lineno, $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endset');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'set';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Spaceless.php b/core/vendor/Twig/TokenParser/Spaceless.php
deleted file mode 100644
index 1e3fa8f..0000000
--- a/core/vendor/Twig/TokenParser/Spaceless.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Remove whitespaces between HTML tags.
- *
- * <pre>
- * {% spaceless %}
- *      <div>
- *          <strong>foo</strong>
- *      </div>
- * {% endspaceless %}
- *
- * {# output will be <div><strong>foo</strong></div> #}
- * </pre>
- */
-class Twig_TokenParser_Spaceless extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideSpacelessEnd'), true);
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_Spaceless($body, $lineno, $this->getTag());
-    }
-
-    public function decideSpacelessEnd(Twig_Token $token)
-    {
-        return $token->test('endspaceless');
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'spaceless';
-    }
-}
diff --git a/core/vendor/Twig/TokenParser/Use.php b/core/vendor/Twig/TokenParser/Use.php
deleted file mode 100644
index beafc80..0000000
--- a/core/vendor/Twig/TokenParser/Use.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2011 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Imports blocks defined in another template into the current template.
- *
- * <pre>
- * {% extends "base.html" %}
- *
- * {% use "blocks.html" %}
- *
- * {% block title %}{% endblock %}
- * {% block content %}{% endblock %}
- * </pre>
- *
- * @see http://www.twig-project.org/doc/templates.html#horizontal-reuse for details.
- */
-class Twig_TokenParser_Use extends Twig_TokenParser
-{
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    public function parse(Twig_Token $token)
-    {
-        $template = $this->parser->getExpressionParser()->parseExpression();
-
-        if (!$template instanceof Twig_Node_Expression_Constant) {
-            throw new Twig_Error_Syntax('The template references in a "use" statement must be a string.', $token->getLine());
-        }
-
-        $stream = $this->parser->getStream();
-
-        $targets = array();
-        if ($stream->test('with')) {
-            $stream->next();
-
-            do {
-                $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
-                $alias = $name;
-                if ($stream->test('as')) {
-                    $stream->next();
-
-                    $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-                }
-
-                $targets[$name] = new Twig_Node_Expression_Constant($alias, -1);
-
-                if (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ',')) {
-                    break;
-                }
-
-                $stream->next();
-            } while (true);
-        }
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $this->parser->addTrait(new Twig_Node(array('template' => $template, 'targets' => new Twig_Node($targets))));
-
-        return null;
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag()
-    {
-        return 'use';
-    }
-}
diff --git a/core/vendor/Twig/TokenParserBroker.php b/core/vendor/Twig/TokenParserBroker.php
deleted file mode 100644
index b214e99..0000000
--- a/core/vendor/Twig/TokenParserBroker.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- * (c) 2010 Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Default implementation of a token parser broker.
- *
- * @package twig
- * @author  Arnaud Le Blanc <arnaud.lb@gmail.com>
- */
-class Twig_TokenParserBroker implements Twig_TokenParserBrokerInterface
-{
-    protected $parser;
-    protected $parsers = array();
-    protected $brokers = array();
-
-    /**
-     * Constructor.
-     *
-     * @param array|Traversable $parsers A Traversable of Twig_TokenParserInterface instances
-     * @param array|Traversable $brokers A Traversable of Twig_TokenParserBrokerInterface instances
-     */
-    public function __construct($parsers = array(), $brokers = array())
-    {
-        foreach ($parsers as $parser) {
-            if (!$parser instanceof Twig_TokenParserInterface) {
-                throw new Twig_Error('$parsers must a an array of Twig_TokenParserInterface');
-            }
-            $this->parsers[$parser->getTag()] = $parser;
-        }
-        foreach ($brokers as $broker) {
-            if (!$broker instanceof Twig_TokenParserBrokerInterface) {
-                throw new Twig_Error('$brokers must a an array of Twig_TokenParserBrokerInterface');
-            }
-            $this->brokers[] = $broker;
-        }
-    }
-
-    /**
-     * Adds a TokenParser.
-     *
-     * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance
-     */
-    public function addTokenParser(Twig_TokenParserInterface $parser)
-    {
-        $this->parsers[$parser->getTag()] = $parser;
-    }
-
-    /**
-     * Adds a TokenParserBroker.
-     *
-     * @param Twig_TokenParserBroker $broker A Twig_TokenParserBroker instance
-     */
-    public function addTokenParserBroker(Twig_TokenParserBroker $broker)
-    {
-        $this->brokers[] = $broker;
-    }
-
-    /**
-     * Gets a suitable TokenParser for a tag.
-     *
-     * First looks in parsers, then in brokers.
-     *
-     * @param string $tag A tag name
-     *
-     * @return null|Twig_TokenParserInterface A Twig_TokenParserInterface or null if no suitable TokenParser was found
-     */
-    public function getTokenParser($tag)
-    {
-        if (isset($this->parsers[$tag])) {
-            return $this->parsers[$tag];
-        }
-        $broker = end($this->brokers);
-        while (false !== $broker) {
-            $parser = $broker->getTokenParser($tag);
-            if (null !== $parser) {
-                return $parser;
-            }
-            $broker = prev($this->brokers);
-        }
-
-        return null;
-    }
-
-    public function getParsers()
-    {
-        return $this->parsers;
-    }
-
-    public function getParser()
-    {
-        return $this->parser;
-    }
-
-    public function setParser(Twig_ParserInterface $parser)
-    {
-        $this->parser = $parser;
-        foreach ($this->parsers as $tokenParser) {
-            $tokenParser->setParser($parser);
-        }
-        foreach ($this->brokers as $broker) {
-            $broker->setParser($parser);
-        }
-    }
-}
diff --git a/core/vendor/Twig/TokenParserBrokerInterface.php b/core/vendor/Twig/TokenParserBrokerInterface.php
deleted file mode 100644
index c2df729..0000000
--- a/core/vendor/Twig/TokenParserBrokerInterface.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- * (c) 2010 Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by token parser brokers.
- *
- * Token parser brokers allows to implement custom logic in the process of resolving a token parser for a given tag name.
- *
- * @package twig
- * @author  Arnaud Le Blanc <arnaud.lb@gmail.com>
- */
-interface Twig_TokenParserBrokerInterface
-{
-    /**
-     * Gets a TokenParser suitable for a tag.
-     *
-     * @param string $tag A tag name
-     *
-     * @return null|Twig_TokenParserInterface A Twig_TokenParserInterface or null if no suitable TokenParser was found
-     */
-    function getTokenParser($tag);
-
-    /**
-     * Calls Twig_TokenParserInterface::setParser on all parsers the implementation knows of.
-     *
-     * @param Twig_ParserInterface $parser A Twig_ParserInterface interface
-     */
-    function setParser(Twig_ParserInterface $parser);
-
-    /**
-     * Gets the Twig_ParserInterface.
-     *
-     * @return null|Twig_ParserInterface A Twig_ParserInterface instance or null
-     */
-    function getParser();
-}
diff --git a/core/vendor/Twig/TokenParserInterface.php b/core/vendor/Twig/TokenParserInterface.php
deleted file mode 100644
index 192c018..0000000
--- a/core/vendor/Twig/TokenParserInterface.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2010 Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by token parsers.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-interface Twig_TokenParserInterface
-{
-    /**
-     * Sets the parser associated with this token parser
-     *
-     * @param $parser A Twig_Parser instance
-     */
-    function setParser(Twig_Parser $parser);
-
-    /**
-     * Parses a token and returns a node.
-     *
-     * @param Twig_Token $token A Twig_Token instance
-     *
-     * @return Twig_NodeInterface A Twig_NodeInterface instance
-     */
-    function parse(Twig_Token $token);
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    function getTag();
-}
diff --git a/core/vendor/Twig/TokenStream.php b/core/vendor/Twig/TokenStream.php
deleted file mode 100644
index 5708091..0000000
--- a/core/vendor/Twig/TokenStream.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a token stream.
- *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
- */
-class Twig_TokenStream
-{
-    protected $tokens;
-    protected $current;
-    protected $filename;
-
-    /**
-     * Constructor.
-     *
-     * @param array  $tokens   An array of tokens
-     * @param string $filename The name of the filename which tokens are associated with
-     */
-    public function __construct(array $tokens, $filename = null)
-    {
-        $this->tokens     = $tokens;
-        $this->current    = 0;
-        $this->filename   = $filename;
-    }
-
-    /**
-     * Returns a string representation of the token stream.
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return implode("\n", $this->tokens);
-    }
-
-    public function injectTokens(array $tokens)
-    {
-        $this->tokens = array_merge(array_slice($this->tokens, 0, $this->current), $tokens, array_slice($this->tokens, $this->current));
-    }
-
-    /**
-     * Sets the pointer to the next token and returns the old one.
-     *
-     * @return Twig_Token
-     */
-    public function next()
-    {
-        if (!isset($this->tokens[++$this->current])) {
-            throw new Twig_Error_Syntax('Unexpected end of template', -1, $this->filename);
-        }
-
-        return $this->tokens[$this->current - 1];
-    }
-
-    /**
-     * Tests a token and returns it or throws a syntax error.
-     *
-     * @return Twig_Token
-     */
-    public function expect($type, $value = null, $message = null)
-    {
-        $token = $this->tokens[$this->current];
-        if (!$token->test($type, $value)) {
-            $line = $token->getLine();
-            throw new Twig_Error_Syntax(sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s)',
-                $message ? $message.'. ' : '',
-                Twig_Token::typeToEnglish($token->getType(), $line), $token->getValue(),
-                Twig_Token::typeToEnglish($type, $line), $value ? sprintf(' with value "%s"', $value) : ''),
-                $line,
-                $this->filename
-            );
-        }
-        $this->next();
-
-        return $token;
-    }
-
-    /**
-     * Looks at the next token.
-     *
-     * @param integer $number
-     *
-     * @return Twig_Token
-     */
-    public function look($number = 1)
-    {
-        if (!isset($this->tokens[$this->current + $number])) {
-            throw new Twig_Error_Syntax('Unexpected end of template', -1, $this->filename);
-        }
-
-        return $this->tokens[$this->current + $number];
-    }
-
-    /**
-     * Tests the current token
-     *
-     * @return bool
-     */
-    public function test($primary, $secondary = null)
-    {
-        return $this->tokens[$this->current]->test($primary, $secondary);
-    }
-
-    /**
-     * Checks if end of stream was reached
-     *
-     * @return bool
-     */
-    public function isEOF()
-    {
-        return $this->tokens[$this->current]->getType() === Twig_Token::EOF_TYPE;
-    }
-
-    /**
-     * Gets the current token
-     *
-     * @return Twig_Token
-     */
-    public function getCurrent()
-    {
-        return $this->tokens[$this->current];
-    }
-
-    /**
-     * Gets the filename associated with this stream
-     *
-     * @return string
-     */
-    public function getFilename()
-    {
-        return $this->filename;
-    }
-}
