diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index fa1335b..2309d26 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -1732,9 +1732,33 @@ function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NO
       'timestamp'   => REQUEST_TIME,
     );
 
-    // Call the logging hooks to log/process the message
-    foreach (module_implements('watchdog') as $module) {
-      module_invoke($module, 'watchdog', $log_entry);
+    // Call the logging system to log/process the message.
+    $logger = drupal_container()->get('logger');
+    switch ($severity) {
+      case WATCHDOG_EMERGENCY:
+        $logger->addEmergency($message, $log_entry);
+        break;
+      case WATCHDOG_ALERT:
+        $logger->addAlert($message, $log_entry);
+        break;
+      case WATCHDOG_CRITICAL:
+        $logger->addCritical($message, $log_entry);
+        break;
+      case WATCHDOG_ERROR:
+        $logger->addError($message, $log_entry);
+        break;
+      case WATCHDOG_WARNING:
+        $logger->addWarning($message, $log_entry);
+        break;
+      case WATCHDOG_NOTICE:
+        $logger->addNotice($message, $log_entry);
+        break;
+      case WATCHDOG_INFO:
+        $logger->addInfo($message, $log_entry);
+        break;
+      case WATCHDOG_DEBUG:
+        $logger->addDebug($message, $log_entry);
+        break;
     }
 
     // It is critical that the semaphore is only cleared here, in the parent
@@ -3017,6 +3041,8 @@ function drupal_classloader() {
     $loader->registerNamespaces(array(
       // All Symfony-borrowed code lives in /core/vendor/Symfony.
       'Symfony' => DRUPAL_ROOT . '/core/vendor',
+      // All Monolog-borrowed code lives in /core/vendor/Monolog.
+      'Monolog' => DRUPAL_ROOT . '/core/vendor',
     ));
     // Register PEAR-style vendor namespaces.
     $loader->registerPrefixes(array(
diff --git a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
index aa73ace..51efea4 100644
--- a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
+++ b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
@@ -20,6 +20,10 @@ class ContainerBuilder extends BaseContainerBuilder {
   public function __construct() {
     parent::__construct();
 
+    // Register the watchdog logger.
+    $this->register('logger', 'Monolog\\Logger')
+      ->addArgument('drupal');
+
     // An interface language always needs to be available for t() and other
     // functions. This default is overridden by drupal_language_initialize()
     // during language negotiation.
diff --git a/core/modules/dblog/dblog.module b/core/modules/dblog/dblog.module
index a43e0a5..40f7cae 100644
--- a/core/modules/dblog/dblog.module
+++ b/core/modules/dblog/dblog.module
@@ -13,6 +13,8 @@ use Drupal\Core\Database\Database;
  * @see watchdog()
  */
 
+use Drupal\dblog\DbLogHandler;
+
 /**
  * Implements hook_help().
  */
@@ -93,6 +95,9 @@ function dblog_init() {
     // Add the CSS for this module
     drupal_add_css(drupal_get_path('module', 'dblog') . '/dblog.css');
   }
+
+  // @todo Register this in an event subscriber: http://drupal.org/node/1509164
+  drupal_container()->get('logger')->pushHandler(new DbLogHandler());
 }
 
 /**
@@ -135,28 +140,6 @@ function _dblog_get_message_types() {
 }
 
 /**
- * Implements hook_watchdog().
- *
- * Note some values may be truncated for database column size restrictions.
- */
-function dblog_watchdog(array $log_entry) {
-  Database::getConnection('default', 'default')->insert('watchdog')
-    ->fields(array(
-      'uid' => $log_entry['uid'],
-      'type' => substr($log_entry['type'], 0, 64),
-      'message' => $log_entry['message'],
-      'variables' => serialize($log_entry['variables']),
-      'severity' => $log_entry['severity'],
-      'link' => substr($log_entry['link'], 0, 255),
-      'location' => $log_entry['request_uri'],
-      'referer' => $log_entry['referer'],
-      'hostname' => substr($log_entry['ip'], 0, 128),
-      'timestamp' => $log_entry['timestamp'],
-    ))
-    ->execute();
-}
-
-/**
  * Implements hook_form_FORM_ID_alter().
  */
 function dblog_form_system_logging_settings_alter(&$form, $form_state) {
diff --git a/core/modules/system/lib/Drupal/system/Tests/Database/CaseSensitivityTest.php b/core/modules/dblog/lib/Drupal/dblog/DbLogHandler.php
similarity index 6%
copy from core/modules/system/lib/Drupal/system/Tests/Database/CaseSensitivityTest.php
copy to core/modules/dblog/lib/Drupal/dblog/DbLogHandler.php
index 65a3854..5c15b96 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Database/CaseSensitivityTest.php
+++ b/core/modules/dblog/lib/Drupal/dblog/DbLogHandler.php
@@ -2,40 +2,41 @@
 
 /**
  * @file
- * Definition of Drupal\system\Tests\Database\CaseSensitivityTest.
+ * Definition of Drupal\dblog\DbLogHandler.
  */
 
-namespace Drupal\system\Tests\Database;
+namespace Drupal\dblog;
+
+use Drupal\Core\Database\Database;
+use Monolog\Handler\AbstractProcessingHandler;
 
 /**
- * Test case sensitivity handling.
+ * Database logger for Monolog.
  */
-class CaseSensitivityTest extends DatabaseTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Case sensitivity',
-      'description' => 'Test handling case sensitive collation.',
-      'group' => 'Database',
-    );
-  }
-
+class DbLogHandler extends AbstractProcessingHandler {
   /**
-   * Test BINARY collation in MySQL.
+   * Writes the record down to the log of the implementing handler
+   *
+   * @param  array $record
+   * @return void
    */
-  function testCaseSensitiveInsert() {
-    $num_records_before = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
-
-    $john = db_insert('test')
-      ->fields(array(
-        'name' => 'john', // <- A record already exists with name 'John'.
-        'age' => 2,
-        'job' => 'Baby',
-      ))
+  protected function write(array $record) {
+    // Translate the record to an entry to be stored in the database.
+    $fields = array(
+      'uid' => $record['context']['user']->uid,
+      'type' => substr($record['context']['type'], 0, 64),
+      'message' => $record['message'],
+      'variables' => serialize($record['context']['variables']),
+      'severity' => $record['context']['severity'],
+      'link' => substr($record['context']['link'], 0, 255),
+      'location' => isset($record['context']['request_uri']) ? $record['context']['request_uri'] : NULL,
+      'referer' => $record['context']['referer'],
+      'hostname' => substr($record['context']['ip'], 0, 128),
+      'timestamp' => $record['context']['timestamp'],
+    );
+    Database::getConnection('default', 'default')
+      ->insert('watchdog')
+      ->fields($fields)
       ->execute();
-
-    $num_records_after = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
-    $this->assertIdentical($num_records_before + 1, (int) $num_records_after, t('Record inserts correctly.'));
-    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'john'))->fetchField();
-    $this->assertIdentical($saved_age, '2', t('Can retrieve after inserting.'));
   }
 }
diff --git a/core/modules/syslog/syslog.install b/core/modules/syslog/syslog.install
index 12ff4fb..6050842 100644
--- a/core/modules/syslog/syslog.install
+++ b/core/modules/syslog/syslog.install
@@ -11,5 +11,4 @@
 function syslog_uninstall() {
   variable_del('syslog_identity');
   variable_del('syslog_facility');
-  variable_del('syslog_format');
 }
diff --git a/core/modules/syslog/syslog.module b/core/modules/syslog/syslog.module
index 1327606..135ed71 100644
--- a/core/modules/syslog/syslog.module
+++ b/core/modules/syslog/syslog.module
@@ -5,6 +5,8 @@
  * Redirects logging messages to syslog.
  */
 
+use Monolog\Handler\SyslogHandler;
+
 if (defined('LOG_LOCAL0')) {
   /**
    * Sets the proper logging facility.
@@ -42,6 +44,17 @@ function syslog_help($path, $arg) {
 }
 
 /**
+ * Implements hook_init().
+ */
+function syslog_init() {
+  // @todo Register this in an event subscriber: http://drupal.org/node/1509164
+  $identity = variable_get('syslog_identity', 'drupal');
+  $facility = defined('LOG_LOCAL0') ? variable_get('syslog_facility', LOG_LOCAL0) : LOG_USER;
+  $handler = new SyslogHandler($identity, $facility);
+  drupal_container()->get('logger')->pushHandler($handler);
+}
+
+/**
  * Implements hook_form_FORM_ID_alter().
  */
 function syslog_form_system_logging_settings_alter(&$form, &$form_state) {
@@ -61,12 +74,6 @@ function syslog_form_system_logging_settings_alter(&$form, &$form_state) {
       '#description'   => t('Depending on the system configuration, Syslog and other logging tools use this code to identify or filter messages from within the entire system log.') . $help,
      );
   }
-  $form['syslog_format'] = array(
-    '#type'          => 'textarea',
-    '#title'         => t('Syslog format'),
-    '#default_value' => variable_get('syslog_format', '!base_url|!timestamp|!type|!ip|!request_uri|!referer|!uid|!link|!message'),
-    '#description'   => t('Specify the format of the syslog entry. Available variables are: <dl><dt><code>!base_url</code></dt><dd>Base URL of the site.</dd><dt><code>!timestamp</code></dt><dd>Unix timestamp of the log entry.</dd><dt><code>!type</code></dt><dd>The category to which this message belongs.</dd><dt><code>!ip</code></dt><dd>IP address of the user triggering the message.</dd><dt><code>!request_uri</code></dt><dd>The requested URI.</dd><dt><code>!referer</code></dt><dd>HTTP Referer if available.</dd><dt><code>!uid</code></dt><dd>User ID.</dd><dt><code>!link</code></dt><dd>A link to associate with the message.</dd><dt><code>!message</code></dt><dd>The message to store in the log.</dd></dl>'),
-  );
   $form['actions']['#weight'] = 1;
 }
 
@@ -87,32 +94,3 @@ function syslog_facility_list() {
     LOG_LOCAL7 => 'LOG_LOCAL7',
   );
 }
-
-/**
- * Implements hook_watchdog().
- */
-function syslog_watchdog(array $log_entry) {
-  global $base_url;
-
-  $log_init = &drupal_static(__FUNCTION__, FALSE);
-
-  if (!$log_init) {
-    $log_init = TRUE;
-    $default_facility = defined('LOG_LOCAL0') ? LOG_LOCAL0 : LOG_USER;
-    openlog(variable_get('syslog_identity', 'drupal'), LOG_NDELAY, variable_get('syslog_facility', $default_facility));
-  }
-
-  $message = strtr(variable_get('syslog_format', '!base_url|!timestamp|!type|!ip|!request_uri|!referer|!uid|!link|!message'), array(
-    '!base_url'    => $base_url,
-    '!timestamp'   => $log_entry['timestamp'],
-    '!type'        => $log_entry['type'],
-    '!ip'          => $log_entry['ip'],
-    '!request_uri' => $log_entry['request_uri'],
-    '!referer'     => $log_entry['referer'],
-    '!uid'         => $log_entry['uid'],
-    '!link'        => strip_tags($log_entry['link']),
-    '!message'     => strip_tags(!isset($log_entry['variables']) ? $log_entry['message'] : strtr($log_entry['message'], $log_entry['variables'])),
-  ));
-
-  syslog($log_entry['severity'], $message);
-}
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index a9f6c41..4ec1d20 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -1860,94 +1860,6 @@ function hook_custom_theme() {
 }
 
 /**
- * Log an event message.
- *
- * This hook allows modules to route log events to custom destinations, such as
- * SMS, Email, pager, syslog, ...etc.
- *
- * @param array $log_entry
- *   An associative array containing the following keys:
- *   - type: The type of message for this entry.
- *   - user: The user object for the user who was logged in when the event
- *     happened.
- *   - uid: The user ID for the user who was logged in when the event happened.
- *   - request_uri: The request URI for the page the event happened in.
- *   - referer: The page that referred the user to the page where the event
- *     occurred.
- *   - ip: The IP address where the request for the page came from.
- *   - timestamp: The UNIX timestamp of the date/time the event occurred.
- *   - severity: The severity of the message; one of the following values as
- *     defined in @link http://www.faqs.org/rfcs/rfc3164.html RFC 3164: @endlink
- *     - WATCHDOG_EMERGENCY: Emergency, system is unusable.
- *     - WATCHDOG_ALERT: Alert, action must be taken immediately.
- *     - WATCHDOG_CRITICAL: Critical conditions.
- *     - WATCHDOG_ERROR: Error conditions.
- *     - WATCHDOG_WARNING: Warning conditions.
- *     - WATCHDOG_NOTICE: Normal but significant conditions.
- *     - WATCHDOG_INFO: Informational messages.
- *     - WATCHDOG_DEBUG: Debug-level messages.
- *   - link: An optional link provided by the module that called the watchdog()
- *     function.
- *   - message: The text of the message to be logged. Variables in the message
- *     are indicated by using placeholder strings alongside the variables
- *     argument to declare the value of the placeholders. See t() for
- *     documentation on how the message and variable parameters interact.
- *   - variables: An array of variables to be inserted into the message on
- *     display. Will be NULL or missing if a message is already translated or if
- *     the message is not possible to translate.
- */
-function hook_watchdog(array $log_entry) {
-  global $base_url;
-  $language_interface = drupal_container()->get(LANGUAGE_TYPE_INTERFACE);
-
-  $severity_list = array(
-    WATCHDOG_EMERGENCY     => t('Emergency'),
-    WATCHDOG_ALERT     => t('Alert'),
-    WATCHDOG_CRITICAL     => t('Critical'),
-    WATCHDOG_ERROR       => t('Error'),
-    WATCHDOG_WARNING   => t('Warning'),
-    WATCHDOG_NOTICE    => t('Notice'),
-    WATCHDOG_INFO      => t('Info'),
-    WATCHDOG_DEBUG     => t('Debug'),
-  );
-
-  $to = 'someone@example.com';
-  $params = array();
-  $params['subject'] = t('[@site_name] @severity_desc: Alert from your web site', array(
-    '@site_name' => variable_get('site_name', 'Drupal'),
-    '@severity_desc' => $severity_list[$log_entry['severity']],
-  ));
-
-  $params['message']  = "\nSite:         @base_url";
-  $params['message'] .= "\nSeverity:     (@severity) @severity_desc";
-  $params['message'] .= "\nTimestamp:    @timestamp";
-  $params['message'] .= "\nType:         @type";
-  $params['message'] .= "\nIP Address:   @ip";
-  $params['message'] .= "\nRequest URI:  @request_uri";
-  $params['message'] .= "\nReferrer URI: @referer_uri";
-  $params['message'] .= "\nUser:         (@uid) @name";
-  $params['message'] .= "\nLink:         @link";
-  $params['message'] .= "\nMessage:      \n\n@message";
-
-  $params['message'] = t($params['message'], array(
-    '@base_url'      => $base_url,
-    '@severity'      => $log_entry['severity'],
-    '@severity_desc' => $severity_list[$log_entry['severity']],
-    '@timestamp'     => format_date($log_entry['timestamp']),
-    '@type'          => $log_entry['type'],
-    '@ip'            => $log_entry['ip'],
-    '@request_uri'   => $log_entry['request_uri'],
-    '@referer_uri'   => $log_entry['referer'],
-    '@uid'           => $log_entry['uid'],
-    '@name'          => $log_entry['user']->name,
-    '@link'          => strip_tags($log_entry['link']),
-    '@message'       => strip_tags($log_entry['message']),
-  ));
-
-  drupal_mail('emaillog', 'entry', $to, $language_interface, $params);
-}
-
-/**
  * Prepare a message based on parameters; called from drupal_mail().
  *
  * Note that hook_mail(), unlike hook_mail_alter(), is only called on the
diff --git a/core/vendor/Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php b/core/vendor/Monolog/Formatter/ChromePHPFormatter.php
similarity index 13%
copy from core/vendor/Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php
copy to core/vendor/Monolog/Formatter/ChromePHPFormatter.php
index 699b2f4..56d3e27 100644
--- a/core/vendor/Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php
+++ b/core/vendor/Monolog/Formatter/ChromePHPFormatter.php
@@ -1,69 +1,79 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\Profiler;
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
 
 /**
- * A ProfilerStorage for Mysql
+ * Formats a log message according to the ChromePHP array format
  *
- * @author Jan Schumann <js@schumann-it.com>
+ * @author Christophe Coevoet <stof@notk.org>
  */
-class MysqlProfilerStorage extends PdoProfilerStorage
+class ChromePHPFormatter implements FormatterInterface
 {
     /**
-     * {@inheritdoc}
+     * Translates Monolog log levels to Wildfire levels.
      */
-    protected function initDb()
-    {
-        if (null === $this->db) {
-            if (0 !== strpos($this->dsn, 'mysql')) {
-                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Mysql with an invalid dsn "%s". The expected format is "mysql:dbname=database_name;host=host_name".', $this->dsn));
-            }
-
-            if (!class_exists('PDO') || !in_array('mysql', \PDO::getAvailableDrivers(), true)) {
-                throw new \RuntimeException('You need to enable PDO_Mysql extension for the profiler to run properly.');
-            }
-
-            $db = new \PDO($this->dsn, $this->username, $this->password);
-            $db->exec('CREATE TABLE IF NOT EXISTS sf_profiler_data (token VARCHAR(255) PRIMARY KEY, data LONGTEXT, ip VARCHAR(64), method VARCHAR(6), url VARCHAR(255), time INTEGER UNSIGNED, parent VARCHAR(255), created_at INTEGER UNSIGNED, KEY (created_at), KEY (ip), KEY (method), KEY (url), KEY (parent))');
-
-            $this->db = $db;
-        }
-
-        return $this->db;
-    }
+    private $logLevels = array(
+        Logger::DEBUG     => 'log',
+        Logger::INFO      => 'info',
+        Logger::NOTICE    => 'info',
+        Logger::WARNING   => 'warn',
+        Logger::ERROR     => 'error',
+        Logger::CRITICAL  => 'error',
+        Logger::ALERT     => 'error',
+        Logger::EMERGENCY => 'error',
+    );
 
     /**
      * {@inheritdoc}
      */
-    protected function buildCriteria($ip, $url, $limit, $method)
+    public function format(array $record)
     {
-        $criteria = array();
-        $args = array();
-
-        if ($ip = preg_replace('/[^\d\.]/', '', $ip)) {
-            $criteria[] = 'ip LIKE :ip';
-            $args[':ip'] = '%'.$ip.'%';
+        // Retrieve the line and file if set and remove them from the formatted extra
+        $backtrace = 'unknown';
+        if (isset($record['extra']['file']) && isset($record['extra']['line'])) {
+            $backtrace = $record['extra']['file'].' : '.$record['extra']['line'];
+            unset($record['extra']['file']);
+            unset($record['extra']['line']);
         }
 
-        if ($url) {
-            $criteria[] = 'url LIKE :url';
-            $args[':url'] = '%'.addcslashes($url, '%_\\').'%';
+        $message = array('message' => $record['message']);
+        if ($record['context']) {
+            $message['context'] = $record['context'];
+        }
+        if ($record['extra']) {
+            $message['extra'] = $record['extra'];
+        }
+        if (count($message) === 1) {
+            $message = reset($message);
         }
 
-        if ($method) {
-            $criteria[] = 'method = :method';
-            $args[':method'] = $method;
+        return array(
+            $record['channel'],
+            $message,
+            $backtrace,
+            $this->logLevels[$record['level']],
+        );
+    }
+
+    public function formatBatch(array $records)
+    {
+        $formatted = array();
+
+        foreach ($records as $record) {
+            $formatted[] = $this->format($record);
         }
 
-        return array($criteria, $args);
+        return $formatted;
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php b/core/vendor/Monolog/Formatter/FormatterInterface.php
similarity index 26%
copy from core/vendor/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php
copy to core/vendor/Monolog/Formatter/FormatterInterface.php
index 11102bd..b5de751 100644
--- a/core/vendor/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php
+++ b/core/vendor/Monolog/Formatter/FormatterInterface.php
@@ -1,34 +1,36 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\Exception;
+namespace Monolog\Formatter;
 
 /**
- * Interface for HTTP error exceptions.
+ * Interface for formatters
  *
- * @author Kris Wallsmith <kris@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-interface HttpExceptionInterface
+interface FormatterInterface
 {
     /**
-     * Returns the status code.
+     * Formats a log record.
      *
-     * @return integer An HTTP response status code
+     * @param  array $record A record to format
+     * @return mixed The formatted record
      */
-    function getStatusCode();
+    public function format(array $record);
 
     /**
-     * Returns response headers.
+     * Formats a set of log records.
      *
-     * @return array Response headers
+     * @param  array $records A set of records to format
+     * @return mixed The formatted set of records
      */
-    function getHeaders();
+    public function formatBatch(array $records);
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php b/core/vendor/Monolog/Formatter/GelfMessageFormatter.php
similarity index 12%
copy from core/vendor/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php
copy to core/vendor/Monolog/Formatter/GelfMessageFormatter.php
index a91e91c..0856f86 100644
--- a/core/vendor/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php
+++ b/core/vendor/Monolog/Formatter/GelfMessageFormatter.php
@@ -1,109 +1,94 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\DataCollector;
+namespace Monolog\Formatter;
 
-use Symfony\Component\HttpKernel\DataCollector\DataCollector;
-use Symfony\Component\HttpKernel\KernelInterface;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
+use Monolog\Logger;
+use Gelf\Message;
 
 /**
- * TimeDataCollector.
+ * Serializes a log message to GELF
+ * @see http://www.graylog2.org/about/gelf
  *
- * @author Fabien Potencier <fabien@symfony.com>
+ * @author Matt Lehner <mlehner@gmail.com>
  */
-class TimeDataCollector extends DataCollector
+class GelfMessageFormatter extends NormalizerFormatter
 {
-    protected $kernel;
-
-    public function __construct(KernelInterface $kernel = null)
-    {
-        $this->kernel = $kernel;
-    }
-
     /**
-     * {@inheritdoc}
+     * @var string the name of the system for the Gelf log message
      */
-    public function collect(Request $request, Response $response, \Exception $exception = null)
-    {
-        $this->data = array(
-            'start_time' => (null !== $this->kernel ? $this->kernel->getStartTime() : $_SERVER['REQUEST_TIME']) * 1000,
-            'events'     => array(),
-        );
-    }
+    protected $systemName;
 
     /**
-     * Sets the request events.
-     *
-     * @param array $events The request events
+     * @var string a prefix for 'extra' fields from the Monolog record (optional)
      */
-    public function setEvents(array $events)
-    {
-        foreach ($events as $event) {
-            $event->ensureStopped();
-        }
-
-        $this->data['events'] = $events;
-    }
+    protected $extraPrefix;
 
     /**
-     * Gets the request events.
-     *
-     * @return array The request events
+     * @var string a prefix for 'context' fields from the Monolog record (optional)
      */
-    public function getEvents()
-    {
-        return $this->data['events'];
-    }
+    protected $contextPrefix;
 
     /**
-     * Gets the request elapsed time.
-     *
-     * @return float The elapsed time
+     * Translates Monolog log levels to Graylog2 log priorities.
      */
-    public function getTotalTime()
-    {
-        $lastEvent = $this->data['events']['__section__'];
+    private $logLevels = array(
+        Logger::DEBUG     => LOG_DEBUG,
+        Logger::INFO      => LOG_INFO,
+        Logger::NOTICE    => LOG_NOTICE,
+        Logger::WARNING   => LOG_WARNING,
+        Logger::ERROR     => LOG_ERR,
+        Logger::CRITICAL  => LOG_CRIT,
+        Logger::ALERT     => LOG_ALERT,
+        Logger::EMERGENCY => LOG_EMERG,
+    );
 
-        return $lastEvent->getOrigin() + $lastEvent->getTotalTime() - $this->data['start_time'];
-    }
-
-    /**
-     * Gets the initialization time.
-     *
-     * This is the time spent until the beginning of the request handling.
-     *
-     * @return float The elapsed time
-     */
-    public function getInitTime()
+    public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_')
     {
-        return $this->data['events']['__section__']->getOrigin() - $this->getStartTime();
-    }
+        parent::__construct('U.u');
 
-    /**
-     * Gets the request time.
-     *
-     * @return integer The time
-     */
-    public function getStartTime()
-    {
-        return $this->data['start_time'];
+        $this->systemName = $systemName ?: gethostname();
+
+        $this->extraPrefix = $extraPrefix;
+        $this->contextPrefix = $contextPrefix;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getName()
+    public function format(array $record)
     {
-        return 'time';
+        $record = parent::format($record);
+        $message = new Message();
+        $message
+            ->setTimestamp($record['datetime'])
+            ->setShortMessage((string) $record['message'])
+            ->setFacility($record['channel'])
+            ->setHost($this->systemName)
+            ->setLine(isset($record['extra']['line']) ? $record['extra']['line'] : null)
+            ->setFile(isset($record['extra']['file']) ? $record['extra']['file'] : null)
+            ->setLevel($this->logLevels[$record['level']]);
+
+        // Do not duplicate these values in the additional fields
+        unset($record['extra']['line']);
+        unset($record['extra']['file']);
+
+        foreach ($record['extra'] as $key => $val) {
+            $message->setAdditional($this->extraPrefix . $key, is_scalar($val) ? $val : $this->toJson($val));
+        }
+
+        foreach ($record['context'] as $key => $val) {
+            $message->setAdditional($this->contextPrefix . $key, is_scalar($val) ? $val : $this->toJson($val));
+        }
+
+        return $message;
     }
 }
diff --git a/core/vendor/Twig/Extension/Optimizer.php b/core/vendor/Monolog/Formatter/JsonFormatter.php
similarity index 33%
copy from core/vendor/Twig/Extension/Optimizer.php
copy to core/vendor/Monolog/Formatter/JsonFormatter.php
index 013fcb6..822af0e 100644
--- a/core/vendor/Twig/Extension/Optimizer.php
+++ b/core/vendor/Monolog/Formatter/JsonFormatter.php
@@ -1,35 +1,38 @@
 <?php
 
 /*
- * This file is part of Twig.
+ * This file is part of the Monolog package.
  *
- * (c) 2010 Fabien Potencier
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * 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;
-    }
+namespace Monolog\Formatter;
 
+/**
+ * Encodes whatever record data is passed to it as json
+ *
+ * This can be useful to log to databases or remote APIs
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class JsonFormatter implements FormatterInterface
+{
     /**
      * {@inheritdoc}
      */
-    public function getNodeVisitors()
+    public function format(array $record)
     {
-        return array(new Twig_NodeVisitor_Optimizer($this->optimizers));
+        return json_encode($record);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getName()
+    public function formatBatch(array $records)
     {
-        return 'optimizer';
+        return json_encode($records);
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php b/core/vendor/Monolog/Formatter/LineFormatter.php
similarity index 14%
copy from core/vendor/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php
copy to core/vendor/Monolog/Formatter/LineFormatter.php
index 97f7165..1054dbb 100644
--- a/core/vendor/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php
+++ b/core/vendor/Monolog/Formatter/LineFormatter.php
@@ -1,106 +1,90 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\DataCollector;
-
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
+namespace Monolog\Formatter;
 
 /**
- * LogDataCollector.
+ * Formats incoming records into a one-line string
+ *
+ * This is especially useful for logging to files
  *
- * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Christophe Coevoet <stof@notk.org>
  */
-class LoggerDataCollector extends DataCollector
+class LineFormatter extends NormalizerFormatter
 {
-    private $logger;
+    const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n";
 
-    public function __construct($logger = null)
-    {
-        if (null !== $logger && $logger instanceof DebugLoggerInterface) {
-            $this->logger = $logger;
-        }
-    }
+    protected $format;
 
     /**
-     * {@inheritdoc}
+     * @param string $format     The format of the message
+     * @param string $dateFormat The format of the timestamp: one supported by DateTime::format
      */
-    public function collect(Request $request, Response $response, \Exception $exception = null)
+    public function __construct($format = null, $dateFormat = null)
     {
-        if (null !== $this->logger) {
-            $this->data = array(
-                'error_count' => $this->logger->countErrors(),
-                'logs'        => $this->sanitizeLogs($this->logger->getLogs()),
-            );
-        }
+        $this->format = $format ?: static::SIMPLE_FORMAT;
+        parent::__construct($dateFormat);
     }
 
     /**
-     * Gets the called events.
-     *
-     * @return array An array of called events
-     *
-     * @see TraceableEventDispatcherInterface
+     * {@inheritdoc}
      */
-    public function countErrors()
+    public function format(array $record)
     {
-        return isset($this->data['error_count']) ? $this->data['error_count'] : 0;
-    }
+        $vars = parent::format($record);
 
-    /**
-     * Gets the logs.
-     *
-     * @return array An array of logs
-     */
-    public function getLogs()
-    {
-        return isset($this->data['logs']) ? $this->data['logs'] : array();
-    }
+        $output = $this->format;
+        foreach ($vars['extra'] as $var => $val) {
+            if (false !== strpos($output, '%extra.'.$var.'%')) {
+                $output = str_replace('%extra.'.$var.'%', $this->convertToString($val), $output);
+                unset($vars['extra'][$var]);
+            }
+        }
+        foreach ($vars as $var => $val) {
+            $output = str_replace('%'.$var.'%', $this->convertToString($val), $output);
+        }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getName()
-    {
-        return 'logger';
+        return $output;
     }
 
-    private function sanitizeLogs($logs)
+    public function formatBatch(array $records)
     {
-        foreach ($logs as $i => $log) {
-            $logs[$i]['context'] = $this->sanitizeContext($log['context']);
+        $message = '';
+        foreach ($records as $record) {
+            $message .= $this->format($record);
         }
 
-        return $logs;
+        return $message;
     }
 
-    private function sanitizeContext($context)
+    protected function normalize($data)
     {
-        if (is_array($context)) {
-            foreach ($context as $key => $value) {
-                $context[$key] = $this->sanitizeContext($value);
-            }
-
-            return $context;
+        if (is_bool($data) || is_null($data)) {
+            return var_export($data, true);
         }
 
-        if (is_resource($context)) {
-            return sprintf('Resource(%s)', get_resource_type($context));
+        return parent::normalize($data);
+    }
+
+    protected function convertToString($data)
+    {
+        if (null === $data || is_scalar($data)) {
+            return (string) $data;
         }
 
-        if (is_object($context)) {
-            return sprintf('Object(%s)', get_class($context));
+        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
+            return json_encode($this->normalize($data), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
         }
 
-        return $context;
+        return stripslashes(json_encode($this->normalize($data)));
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php b/core/vendor/Monolog/Formatter/NormalizerFormatter.php
similarity index 16%
copy from core/vendor/Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php
copy to core/vendor/Monolog/Formatter/NormalizerFormatter.php
index 4b45c6b..6ce4a2e 100644
--- a/core/vendor/Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php
+++ b/core/vendor/Monolog/Formatter/NormalizerFormatter.php
@@ -1,95 +1,92 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\Profiler;
-
-use Memcached;
+namespace Monolog\Formatter;
 
 /**
- * Memcached Profiler Storage
+ * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets
  *
- * @author Andrej Hudec <pulzarraider@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class MemcachedProfilerStorage extends BaseMemcacheProfilerStorage
+class NormalizerFormatter implements FormatterInterface
 {
+    const SIMPLE_DATE = "Y-m-d H:i:s";
 
-    /**
-     * @var Memcached
-     */
-    private $memcached;
+    protected $dateFormat;
 
     /**
-     * Internal convenience method that returns the instance of the Memcached
-     *
-     * @return Memcached
+     * @param string $dateFormat The format of the timestamp: one supported by DateTime::format
      */
-    protected function getMemcached()
+    public function __construct($dateFormat = null)
     {
-        if (null === $this->memcached) {
-            if (!preg_match('#^memcached://(?(?=\[.*\])\[(.*)\]|(.*)):(.*)$#', $this->dsn, $matches)) {
-                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Memcached with an invalid dsn "%s". The expected format is "memcached://[host]:port".', $this->dsn));
-            }
-
-            $host = $matches[1] ?: $matches[2];
-            $port = $matches[3];
-
-            $memcached = new Memcached;
-
-            //disable compression to allow appending
-            $memcached->setOption(Memcached::OPT_COMPRESSION, false);
-
-            $memcached->addServer($host, $port);
-
-            $this->memcached = $memcached;
-        }
-
-        return $this->memcached;
+        $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE;
     }
 
     /**
      * {@inheritdoc}
      */
-    protected function getValue($key)
+    public function format(array $record)
     {
-        return $this->getMemcached()->get($key);
+        return $this->normalize($record);
     }
 
     /**
      * {@inheritdoc}
      */
-    protected function setValue($key, $value, $expiration = 0)
+    public function formatBatch(array $records)
     {
-        return $this->getMemcached()->set($key, $value, time() + $expiration);
-    }
+        foreach ($records as $key => $record) {
+            $records[$key] = $this->format($record);
+        }
 
-    /**
-     * {@inheritdoc}
-     */
-    protected function flush()
-    {
-        return $this->getMemcached()->flush();
+        return $records;
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    protected function appendValue($key, $value, $expiration = 0)
+    protected function normalize($data)
     {
-        $memcached = $this->getMemcached();
+        if (null === $data || is_scalar($data)) {
+            return $data;
+        }
+
+        if (is_array($data) || $data instanceof \Traversable) {
+            $normalized = array();
+
+            foreach ($data as $key => $value) {
+                $normalized[$key] = $this->normalize($value);
+            }
+
+            return $normalized;
+        }
 
-        if (!$result = $memcached->append($key, $value)) {
-            return $memcached->set($key, $value, $expiration);
+        if ($data instanceof \DateTime) {
+            return $data->format($this->dateFormat);
         }
 
-        return $result;
+        if (is_object($data)) {
+            return sprintf("[object] (%s: %s)", get_class($data), $this->toJson($data));
+        }
+
+        if (is_resource($data)) {
+            return '[resource]';
+        }
+
+        return '[unknown('.gettype($data).')]';
     }
 
+    protected function toJson($data)
+    {
+        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
+            return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
+        }
+
+        return json_encode($data);
+    }
 }
diff --git a/core/vendor/Symfony/Component/ClassLoader/DebugClassLoader.php b/core/vendor/Monolog/Formatter/WildfireFormatter.php
similarity index 11%
copy from core/vendor/Symfony/Component/ClassLoader/DebugClassLoader.php
copy to core/vendor/Monolog/Formatter/WildfireFormatter.php
index b6f7968..8ca6f2b 100644
--- a/core/vendor/Symfony/Component/ClassLoader/DebugClassLoader.php
+++ b/core/vendor/Monolog/Formatter/WildfireFormatter.php
@@ -1,90 +1,99 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\ClassLoader;
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
 
 /**
- * Autoloader checking if the class is really defined in the file found.
- *
- * The DebugClassLoader will wrap all registered autoloaders providing a
- * findFile method and will throw an exception if a file is found but does
- * not declare the class.
+ * Serializes a log message according to Wildfire's header requirements
  *
- * @author Fabien Potencier <fabien@symfony.com>
+ * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>
  * @author Christophe Coevoet <stof@notk.org>
- *
- * @api
+ * @author Kirill chEbba Chebunin <iam@chebba.org>
  */
-class DebugClassLoader
+class WildfireFormatter extends NormalizerFormatter
 {
-    private $classFinder;
-
     /**
-     * Constructor.
-     *
-     * @param object $classFinder
-     *
-     * @api
+     * Translates Monolog log levels to Wildfire levels.
      */
-    public function __construct($classFinder)
-    {
-        $this->classFinder = $classFinder;
-    }
+    private $logLevels = array(
+        Logger::DEBUG     => 'LOG',
+        Logger::INFO      => 'INFO',
+        Logger::NOTICE    => 'INFO',
+        Logger::WARNING   => 'WARN',
+        Logger::ERROR     => 'ERROR',
+        Logger::CRITICAL  => 'ERROR',
+        Logger::ALERT     => 'ERROR',
+        Logger::EMERGENCY => 'ERROR',
+    );
 
     /**
-     * Replaces all autoloaders implementing a findFile method by a DebugClassLoader wrapper.
+     * {@inheritdoc}
      */
-    static public function enable()
+    public function format(array $record)
     {
-        if (!is_array($functions = spl_autoload_functions())) {
-            return;
+        // Retrieve the line and file if set and remove them from the formatted extra
+        $file = $line = '';
+        if (isset($record['extra']['file'])) {
+            $file = $record['extra']['file'];
+            unset($record['extra']['file']);
+        }
+        if (isset($record['extra']['line'])) {
+            $line = $record['extra']['line'];
+            unset($record['extra']['line']);
         }
 
-        foreach ($functions as $function) {
-            spl_autoload_unregister($function);
+        $record = $this->normalize($record);
+        $message = array('message' => $record['message']);
+        if ($record['context']) {
+            $message['context'] = $record['context'];
+        }
+        if ($record['extra']) {
+            $message['extra'] = $record['extra'];
+        }
+        if (count($message) === 1) {
+            $message = reset($message);
         }
 
-        foreach ($functions as $function) {
-            if (is_array($function) && method_exists($function[0], 'findFile')) {
-                $function = array(new static($function[0]), 'loadClass');
-            }
+        // Create JSON object describing the appearance of the message in the console
+        $json = json_encode(array(
+            array(
+                'Type'  => $this->logLevels[$record['level']],
+                'File'  => $file,
+                'Line'  => $line,
+                'Label' => $record['channel'],
+            ),
+            $message,
+        ));
 
-            spl_autoload_register($function);
-        }
+        // The message itself is a serialization of the above JSON object + it's length
+        return sprintf(
+            '%s|%s|',
+            strlen($json),
+            $json
+        );
     }
 
-    /**
-     * Unregisters this instance as an autoloader.
-     */
-    public function unregister()
+    public function formatBatch(array $records)
     {
-        spl_autoload_unregister(array($this, 'loadClass'));
+        throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter');
     }
 
-    /**
-     * Loads the given class or interface.
-     *
-     * @param string $class The name of the class
-     * @return Boolean|null True, if loaded
-     */
-    public function loadClass($class)
+    protected function normalize($data)
     {
-        if ($file = $this->classFinder->findFile($class)) {
-            require $file;
-
-            if (!class_exists($class, false) && !interface_exists($class, false) && (!function_exists('trait_exists') || !trait_exists($class, false))) {
-                throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
-            }
-
-            return true;
+        if (is_object($data) && !$data instanceof \DateTime) {
+            return $data;
         }
+
+        return parent::normalize($data);
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php b/core/vendor/Monolog/Handler/AbstractHandler.php
similarity index 19%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php
copy to core/vendor/Monolog/Handler/AbstractHandler.php
index ce9308e..2ea9f55 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php
+++ b/core/vendor/Monolog/Handler/AbstractHandler.php
@@ -1,186 +1,174 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Flash;
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\Formatter\FormatterInterface;
+use Monolog\Formatter\LineFormatter;
 
 /**
- * FlashBag flash message container.
+ * Base Handler class providing the Handler structure
  *
- * @author Drak <drak@zikula.org>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class FlashBag implements FlashBagInterface, \IteratorAggregate, \Countable
+abstract class AbstractHandler implements HandlerInterface
 {
-    private $name = 'flashes';
+    protected $level = Logger::DEBUG;
+    protected $bubble = false;
 
     /**
-     * Flash messages.
-     *
-     * @var array
+     * @var FormatterInterface
      */
-    private $flashes = array();
+    protected $formatter;
+    protected $processors = array();
 
     /**
-     * The storage key for flashes in the session
-     *
-     * @var string
+     * @param integer $level  The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
      */
-    private $storageKey;
-
-    /**
-     * Constructor.
-     *
-     * @param string $storageKey The key used to store flashes in the session.
-     */
-    public function __construct($storageKey = '_sf2_flashes')
+    public function __construct($level = Logger::DEBUG, $bubble = true)
     {
-        $this->storageKey = $storageKey;
+        $this->level = $level;
+        $this->bubble = $bubble;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getName()
+    public function isHandling(array $record)
     {
-        return $this->name;
-    }
-
-    public function setName($name)
-    {
-        $this->name = $name;
+        return $record['level'] >= $this->level;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function initialize(array &$flashes)
+    public function handleBatch(array $records)
     {
-        $this->flashes = &$flashes;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function add($type, $message)
-    {
-        $this->flashes[$type][] = $message;
+        foreach ($records as $record) {
+            $this->handle($record);
+        }
     }
 
     /**
-     * {@inheritdoc}
+     * Closes the handler.
+     *
+     * This will be called automatically when the object is destroyed
      */
-    public function peek($type, array $default =array())
+    public function close()
     {
-        return $this->has($type) ? $this->flashes[$type] : $default;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function peekAll()
+    public function pushProcessor($callback)
     {
-        return $this->flashes;
+        if (!is_callable($callback)) {
+            throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');
+        }
+        array_unshift($this->processors, $callback);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function get($type, array $default = array())
+    public function popProcessor()
     {
-        if (!$this->has($type)) {
-            return $default;
+        if (!$this->processors) {
+            throw new \LogicException('You tried to pop from an empty processor stack.');
         }
 
-        $return = $this->flashes[$type];
-
-        unset($this->flashes[$type]);
-
-        return $return;
+        return array_shift($this->processors);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function all()
+    public function setFormatter(FormatterInterface $formatter)
     {
-        $return = $this->peekAll();
-        $this->flashes = array();
-
-        return $return;
+        $this->formatter = $formatter;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function set($type, $messages)
+    public function getFormatter()
     {
-        $this->flashes[$type] = (array) $messages;
-    }
+        if (!$this->formatter) {
+            $this->formatter = $this->getDefaultFormatter();
+        }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function setAll(array $messages)
-    {
-        $this->flashes = $messages;
+        return $this->formatter;
     }
 
     /**
-     * {@inheritdoc}
+     * Sets minimum logging level at which this handler will be triggered.
+     *
+     * @param integer $level
      */
-    public function has($type)
+    public function setLevel($level)
     {
-        return array_key_exists($type, $this->flashes) && $this->flashes[$type];
+        $this->level = $level;
     }
 
     /**
-     * {@inheritdoc}
+     * Gets minimum logging level at which this handler will be triggered.
+     *
+     * @return integer
      */
-    public function keys()
+    public function getLevel()
     {
-        return array_keys($this->flashes);
+        return $this->level;
     }
 
     /**
-     * {@inheritdoc}
+     * Sets the bubbling behavior.
+     *
+     * @param Boolean $bubble True means that bubbling is not permitted.
+     *                        False means that this handler allows bubbling.
      */
-    public function getStorageKey()
+    public function setBubble($bubble)
     {
-        return $this->storageKey;
+        $this->bubble = $bubble;
     }
 
     /**
-     * {@inheritdoc}
+     * Gets the bubbling behavior.
+     *
+     * @return Boolean True means that bubbling is not permitted.
+     *                 False means that this handler allows bubbling.
      */
-    public function clear()
+    public function getBubble()
     {
-        return $this->all();
+        return $this->bubble;
     }
 
-    /**
-     * Returns an iterator for flashes.
-     *
-     * @return \ArrayIterator An \ArrayIterator instance
-     */
-    public function getIterator()
+    public function __destruct()
     {
-        return new \ArrayIterator($this->all());
+        try {
+            $this->close();
+        } catch (\Exception $e) {
+            // do nothing
+        }
     }
 
     /**
-     * Returns the number of flashes.
+     * Gets the default formatter.
      *
-     * @return int The number of flashes
+     * @return FormatterInterface
      */
-    public function count()
+    protected function getDefaultFormatter()
     {
-        return count($this->flashes);
+        return new LineFormatter();
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php b/core/vendor/Monolog/Handler/AbstractProcessingHandler.php
similarity index 19%
copy from core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php
copy to core/vendor/Monolog/Handler/AbstractProcessingHandler.php
index 6848f78..e1e5b89 100644
--- a/core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php
+++ b/core/vendor/Monolog/Handler/AbstractProcessingHandler.php
@@ -1,72 +1,66 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\Event;
-
-use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\EventDispatcher\Event;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
+namespace Monolog\Handler;
 
 /**
- * Allows to execute logic after a response was sent
+ * Base Handler class providing the Handler structure
+ *
+ * Classes extending it should (in most cases) only implement write($record)
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Christophe Coevoet <stof@notk.org>
  */
-class PostResponseEvent extends Event
+abstract class AbstractProcessingHandler extends AbstractHandler
 {
     /**
-     * The kernel in which this event was thrown
-     * @var HttpKernelInterface
+     * {@inheritdoc}
      */
-    private $kernel;
+    public function handle(array $record)
+    {
+        if ($record['level'] < $this->level) {
+            return false;
+        }
 
-    private $request;
+        $record = $this->processRecord($record);
 
-    private $response;
+        $record['formatted'] = $this->getFormatter()->format($record);
 
-    public function __construct(HttpKernelInterface $kernel, Request $request, Response $response)
-    {
-        $this->kernel = $kernel;
-        $this->request = $request;
-        $this->response = $response;
-    }
+        $this->write($record);
 
-    /**
-     * Returns the kernel in which this event was thrown.
-     *
-     * @return HttpKernelInterface
-     */
-    public function getKernel()
-    {
-        return $this->kernel;
+        return false === $this->bubble;
     }
 
     /**
-     * Returns the request for which this event was thrown.
+     * Writes the record down to the log of the implementing handler
      *
-     * @return Request
+     * @param  array $record
+     * @return void
      */
-    public function getRequest()
-    {
-        return $this->request;
-    }
+    abstract protected function write(array $record);
 
     /**
-     * Returns the reponse for which this event was thrown.
+     * Processes a record.
      *
-     * @return Response
+     * @param  array $record
+     * @return array
      */
-    public function getResponse()
+    protected function processRecord(array $record)
     {
-        return $this->response;
+        if ($this->processors) {
+            foreach ($this->processors as $processor) {
+                $record = call_user_func($processor, $record);
+            }
+        }
+
+        return $record;
     }
 }
diff --git a/core/vendor/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php b/core/vendor/Monolog/Handler/AmqpHandler.php
similarity index 17%
copy from core/vendor/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php
copy to core/vendor/Monolog/Handler/AmqpHandler.php
index 9664b13..09b1333 100644
--- a/core/vendor/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php
+++ b/core/vendor/Monolog/Handler/AmqpHandler.php
@@ -1,72 +1,70 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\DependencyInjection\ParameterBag;
+namespace Monolog\Handler;
 
-use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Monolog\Logger;
+use Monolog\Formatter\JsonFormatter;
 
-/**
- * Holds read-only parameters.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
-class FrozenParameterBag extends ParameterBag
+class AmqpHandler extends AbstractProcessingHandler
 {
     /**
-     * Constructor.
-     *
-     * For performance reasons, the constructor assumes that
-     * all keys are already lowercased.
-     *
-     * This is always the case when used internally.
-     *
-     * @param array $parameters An array of parameters
-     *
-     * @api
+     * @var \AMQPExchange $exchange
      */
-    public function __construct(array $parameters = array())
-    {
-        $this->parameters = $parameters;
-        $this->resolved = true;
-    }
+    protected $exchange;
 
     /**
-     * {@inheritDoc}
-     *
-     * @api
+     * @param \AMQPExchange $exchange     AMQP exchange, ready for use
+     * @param string        $exchangeName
+     * @param string        $issuer       issuer name
+     * @param int           $level
+     * @param bool          $bubble       Whether the messages that are handled can bubble up the stack or not
      */
-    public function clear()
+    public function __construct(\AMQPExchange $exchange, $exchangeName = 'log', $level = Logger::DEBUG, $bubble = true)
     {
-        throw new LogicException('Impossible to call clear() on a frozen ParameterBag.');
+        $this->exchange = $exchange;
+        $this->exchange->setName($exchangeName);
+
+        parent::__construct($level, $bubble);
     }
 
     /**
      * {@inheritDoc}
-     *
-     * @api
      */
-    public function add(array $parameters)
+    protected function write(array $record)
     {
-        throw new LogicException('Impossible to call add() on a frozen ParameterBag.');
+        $data = $record["formatted"];
+
+        $routingKey = sprintf(
+            '%s.%s',
+            substr($record['level_name'], 0, 4),
+            $record['channel']
+        );
+
+        $this->exchange->publish(
+            $data,
+            strtolower($routingKey),
+            0,
+            array(
+                'delivery_mode' => 2,
+                'Content-type' => 'application/json'
+            )
+        );
     }
 
     /**
      * {@inheritDoc}
-     *
-     * @api
      */
-    public function set($name, $value)
+    protected function getDefaultFormatter()
     {
-        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
+        return new JsonFormatter();
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php b/core/vendor/Monolog/Handler/BufferHandler.php
similarity index 19%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php
copy to core/vendor/Monolog/Handler/BufferHandler.php
index e925d62..afbb4a6 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php
+++ b/core/vendor/Monolog/Handler/BufferHandler.php
@@ -1,54 +1,63 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
+namespace Monolog\Handler;
+
+use Monolog\Logger;
 
 /**
- * SessionHandler proxy.
+ * Buffers all records until closing the handler and then pass them as batch.
+ *
+ * This is useful for a MailHandler to send only one mail per request instead of
+ * sending one per log message.
  *
- * @author Drak <drak@zikula.org>
+ * @author Christophe Coevoet <stof@notk.org>
  */
-class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface
+class BufferHandler extends AbstractHandler
 {
-    /**
-     * @var \SessionHandlerInterface
-     */
     protected $handler;
+    protected $bufferSize;
+    protected $buffer = array();
 
     /**
-     * Constructor.
-     *
-     * @param \SessionHandlerInterface $handler
+     * @param HandlerInterface $handler    Handler.
+     * @param integer          $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
+     * @param integer          $level      The minimum logging level at which this handler will be triggered
+     * @param Boolean          $bubble     Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(\SessionHandlerInterface $handler)
+    public function __construct(HandlerInterface $handler, $bufferSize = 0, $level = Logger::DEBUG, $bubble = true)
     {
+        parent::__construct($level, $bubble);
         $this->handler = $handler;
-        $this->wrapper = ($handler instanceof \SessionHandler);
-        $this->saveHandlerName = $this->wrapper ? ini_get('session.save_handler') : 'user';
-    }
+        $this->bufferSize = $bufferSize;
 
-    // \SessionHandlerInterface
+        // __destructor() doesn't get called on Fatal errors
+        register_shutdown_function(array($this, 'close'));
+    }
 
     /**
      * {@inheritdoc}
      */
-    public function open($savePath, $sessionName)
+    public function handle(array $record)
     {
-        $return = (bool)$this->handler->open($savePath, $sessionName);
+        if ($record['level'] < $this->level) {
+            return false;
+        }
 
-        if (true === $return) {
-            $this->active = true;
+        $this->buffer[] = $record;
+        if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) {
+            array_shift($this->buffer);
         }
 
-        return $return;
+        return false === $this->bubble;
     }
 
     /**
@@ -56,40 +65,9 @@ class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterf
      */
     public function close()
     {
-        $this->active = false;
-
-        return (bool) $this->handler->close();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function read($id)
-    {
-        return (string) $this->handler->read($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function write($id, $data)
-    {
-        return (bool) $this->handler->write($id, $data);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function destroy($id)
-    {
-        return (bool) $this->handler->destroy($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function gc($maxlifetime)
-    {
-        return (bool) $this->handler->gc($maxlifetime);
+        if ($this->buffer) {
+            $this->handler->handleBatch($this->buffer);
+            $this->buffer = array();
+        }
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php b/core/vendor/Monolog/Handler/ChromePHPHandler.php
similarity index 15%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php
copy to core/vendor/Monolog/Handler/ChromePHPHandler.php
index 5bf2962..86d7feb 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php
+++ b/core/vendor/Monolog/Handler/ChromePHPHandler.php
@@ -1,130 +1,126 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Storage;
+namespace Monolog\Handler;
+
+use Monolog\Formatter\ChromePHPFormatter;
 
 /**
- * MockFileSessionStorage is used to mock sessions for
- * functional testing when done in a single PHP process.
- *
- * No PHP session is actually started since a session can be initialized
- * and shutdown only once per PHP execution cycle and this class does
- * not pollute any session related globals, including session_*() functions
- * or session.* PHP ini directives.
+ * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/)
  *
- * @author Drak <drak@zikula.org>
+ * @author Christophe Coevoet <stof@notk.org>
  */
-class MockFileSessionStorage extends MockArraySessionStorage
+class ChromePHPHandler extends AbstractProcessingHandler
 {
     /**
-     * @var string
+     * Version of the extension
      */
-    private $savePath;
-
-    private $sessionData;
+    const VERSION = '3.0';
 
     /**
-     * Constructor.
-     *
-     * @param string $savePath Path of directory to save session files.
-     * @param string $name     Session name.
+     * Header name
      */
-    public function __construct($savePath = null, $name = 'MOCKSESSID')
-    {
-        if (null === $savePath) {
-            $savePath = sys_get_temp_dir();
-        }
+    const HEADER_NAME = 'X-ChromePhp-Data';
 
-        if (!is_dir($savePath)) {
-            mkdir($savePath, 0777, true);
-        }
+    protected static $initialized = false;
 
-        $this->savePath = $savePath;
+    protected static $json = array(
+        'version' => self::VERSION,
+        'columns' => array('label', 'log', 'backtrace', 'type'),
+        'rows' => array(),
+    );
 
-        parent::__construct($name);
-    }
+    protected $sendHeaders = true;
 
     /**
      * {@inheritdoc}
      */
-    public function start()
+    public function handleBatch(array $records)
     {
-        if ($this->started) {
-            return true;
-        }
+        $messages = array();
 
-        if (!$this->id) {
-            $this->id = $this->generateId();
+        foreach ($records as $record) {
+            if ($record['level'] < $this->level) {
+                continue;
+            }
+            $messages[] = $this->processRecord($record);
         }
 
-        $this->read();
-
-        $this->started = true;
-
-        return true;
+        if (!empty($messages)) {
+            $messages = $this->getFormatter()->formatBatch($messages);
+            self::$json['rows'] = array_merge(self::$json['rows'], $messages);
+            $this->send();
+        }
     }
 
     /**
-     * {@inheritdoc}
+     * {@inheritDoc}
      */
-    public function regenerate($destroy = false, $lifetime = null)
+    protected function getDefaultFormatter()
     {
-        if (!$this->started) {
-            $this->start();
-        }
-
-        if ($destroy) {
-            $this->destroy();
-        }
-
-        return parent::regenerate($destroy, $lifetime);
+        return new ChromePHPFormatter();
     }
 
     /**
-     * {@inheritdoc}
+     * Creates & sends header for a record
+     *
+     * @see sendHeader()
+     * @see send()
+     * @param array $record
      */
-    public function save()
+    protected function write(array $record)
     {
-        file_put_contents($this->getFilePath(), serialize($this->data));
+        self::$json['rows'][] = $record['formatted'];
+
+        $this->send();
     }
 
     /**
-     * Deletes a session from persistent storage.
-     * Deliberately leaves session data in memory intact.
+     * Sends the log header
+     *
+     * @see sendHeader()
      */
-    private function destroy()
+    protected function send()
     {
-        if (is_file($this->getFilePath())) {
-            unlink($this->getFilePath());
+        if (!self::$initialized) {
+            $this->sendHeaders = $this->headersAccepted();
+            self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
+
+            self::$initialized = true;
         }
+
+        $this->sendHeader(self::HEADER_NAME, base64_encode(utf8_encode(json_encode(self::$json))));
     }
 
     /**
-     * Calculate path to file.
+     * Send header string to the client
      *
-     * @return string File path
+     * @param string $header
+     * @param string $content
      */
-    private function getFilePath()
+    protected function sendHeader($header, $content)
     {
-        return $this->savePath.'/'.$this->id.'.mocksess';
+        if (!headers_sent() && $this->sendHeaders) {
+            header(sprintf('%s: %s', $header, $content));
+        }
     }
 
     /**
-     * Reads session from storage and loads session.
+     * Verifies if the headers are accepted by the current user agent
+     *
+     * @return Boolean
      */
-    private function read()
+    protected function headersAccepted()
     {
-        $filePath = $this->getFilePath();
-        $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : array();
-
-        $this->loadSession();
+        return !isset($_SERVER['HTTP_USER_AGENT'])
+               || preg_match('{\bChrome/\d+[\.\d+]*\b}', $_SERVER['HTTP_USER_AGENT']);
     }
 }
diff --git a/core/vendor/Symfony/Component/DependencyInjection/ScopeInterface.php b/core/vendor/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
similarity index 35%
copy from core/vendor/Symfony/Component/DependencyInjection/ScopeInterface.php
copy to core/vendor/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
index 44b8c5d..c3e42ef 100644
--- a/core/vendor/Symfony/Component/DependencyInjection/ScopeInterface.php
+++ b/core/vendor/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
@@ -1,32 +1,28 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\DependencyInjection;
+namespace Monolog\Handler\FingersCrossed;
 
 /**
- * Scope Interface.
+ * Interface for activation strategies for the FingersCrossedHandler.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
-interface ScopeInterface
+interface ActivationStrategyInterface
 {
     /**
-     * @api
-     */
-    function getName();
-
-    /**
-     * @api
+     * Returns whether the given record activates the handler.
+     *
+     * @param  array   $record
+     * @return Boolean
      */
-    function getParentName();
+    public function isHandlerActivated(array $record);
 }
diff --git a/core/vendor/Symfony/Component/DependencyInjection/ScopeInterface.php b/core/vendor/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php
similarity index 30%
copy from core/vendor/Symfony/Component/DependencyInjection/ScopeInterface.php
copy to core/vendor/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php
index 44b8c5d..7cd8ef1 100644
--- a/core/vendor/Symfony/Component/DependencyInjection/ScopeInterface.php
+++ b/core/vendor/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php
@@ -1,32 +1,32 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\DependencyInjection;
+namespace Monolog\Handler\FingersCrossed;
 
 /**
- * Scope Interface.
+ * Error level based activation strategy.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
-interface ScopeInterface
+class ErrorLevelActivationStrategy implements ActivationStrategyInterface
 {
-    /**
-     * @api
-     */
-    function getName();
+    private $actionLevel;
+
+    public function __construct($actionLevel)
+    {
+        $this->actionLevel = $actionLevel;
+    }
 
-    /**
-     * @api
-     */
-    function getParentName();
+    public function isHandlerActivated(array $record)
+    {
+        return $record['level'] >= $this->actionLevel;
+    }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php b/core/vendor/Monolog/Handler/FingersCrossedHandler.php
similarity index 10%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php
copy to core/vendor/Monolog/Handler/FingersCrossedHandler.php
index 138aa36..561ee7c 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php
+++ b/core/vendor/Monolog/Handler/FingersCrossedHandler.php
@@ -1,154 +1,104 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Attribute;
+namespace Monolog\Handler;
+
+use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
+use Monolog\Handler\FingersCrossed\ActivationStrategyInterface;
+use Monolog\Logger;
 
 /**
- * This class provides structured storage of session attributes using
- * a name spacing character in the key.
+ * Buffers all records until a certain level is reached
+ *
+ * The advantage of this approach is that you don't get any clutter in your log files.
+ * Only requests which actually trigger an error (or whatever your actionLevel is) will be
+ * in the logs, but they will contain all records, not only those above the level threshold.
  *
- * @author Drak <drak@zikula.org>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class NamespacedAttributeBag extends AttributeBag
+class FingersCrossedHandler extends AbstractHandler
 {
-    /**
-     * Namespace character.
-     *
-     * @var string
-     */
-    private $namespaceCharacter;
-
-    /**
-     * Constructor.
-     *
-     * @param string $storageKey         Session storage key.
-     * @param string $namespaceCharacter Namespace character to use in keys.
-     */
-    public function __construct($storageKey = '_sf2_attributes', $namespaceCharacter = '/')
-    {
-        $this->namespaceCharacter = $namespaceCharacter;
-        parent::__construct($storageKey);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function has($name)
-    {
-        $attributes = $this->resolveAttributePath($name);
-        $name = $this->resolveKey($name);
-
-        return array_key_exists($name, $attributes);
-    }
+    protected $handler;
+    protected $activationStrategy;
+    protected $buffering = true;
+    protected $bufferSize;
+    protected $buffer = array();
+    protected $stopBuffering;
 
     /**
-     * {@inheritdoc}
+     * @param callback|HandlerInterface       $handler            Handler or factory callback($record, $fingersCrossedHandler).
+     * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action
+     * @param int                             $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
+     * @param Boolean                         $bubble             Whether the messages that are handled can bubble up the stack or not
+     * @param Boolean                         $stopBuffering      Whether the handler should stop buffering after being triggered (default true)
      */
-    public function get($name, $default = null)
+    public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true)
     {
-        $attributes = $this->resolveAttributePath($name);
-        $name = $this->resolveKey($name);
+        if (null === $activationStrategy) {
+            $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING);
+        }
+        if (!$activationStrategy instanceof ActivationStrategyInterface) {
+            $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy);
+        }
 
-        return array_key_exists($name, $attributes) ? $attributes[$name] : $default;
+        $this->handler = $handler;
+        $this->activationStrategy = $activationStrategy;
+        $this->bufferSize = $bufferSize;
+        $this->bubble = $bubble;
+        $this->stopBuffering = $stopBuffering;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function set($name, $value)
+    public function isHandling(array $record)
     {
-        $attributes = & $this->resolveAttributePath($name, true);
-        $name = $this->resolveKey($name);
-        $attributes[$name] = $value;
+        return true;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function remove($name)
-    {
-        $retval = null;
-        $attributes = & $this->resolveAttributePath($name);
-        $name = $this->resolveKey($name);
-        if (array_key_exists($name, $attributes)) {
-            $retval = $attributes[$name];
-            unset($attributes[$name]);
-        }
-
-        return $retval;
-    }
-
-    /**
-     * Resolves a path in attributes property and returns it as a reference.
-     *
-     * This method allows structured namespacing of session attributes.
-     *
-     * @param string  $name         Key name
-     * @param boolean $writeContext Write context, default false
-     *
-     * @return array
-     */
-    protected function &resolveAttributePath($name, $writeContext = false)
+    public function handle(array $record)
     {
-        $array = & $this->attributes;
-        $name = (strpos($name, $this->namespaceCharacter) === 0) ? substr($name, 1) : $name;
-
-        // Check if there is anything to do, else return
-        if (!$name) {
-            return $array;
-        }
-
-        $parts = explode($this->namespaceCharacter, $name);
-        if (count($parts) < 2) {
-            if (!$writeContext) {
-                return $array;
+        if ($this->buffering) {
+            $this->buffer[] = $record;
+            if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) {
+                array_shift($this->buffer);
             }
-
-            $array[$parts[0]] = array();
-
-            return $array;
-        }
-
-        unset($parts[count($parts)-1]);
-
-        foreach ($parts as $part) {
-            if (!array_key_exists($part, $array)) {
-                if (!$writeContext) {
-                    return $array;
+            if ($this->activationStrategy->isHandlerActivated($record)) {
+                if ($this->stopBuffering) {
+                    $this->buffering = false;
                 }
-
-                $array[$part] = array();
+                if (!$this->handler instanceof HandlerInterface) {
+                    $this->handler = call_user_func($this->handler, $record, $this);
+                }
+                if (!$this->handler instanceof HandlerInterface) {
+                    throw new \RuntimeException("The factory callback should return a HandlerInterface");
+                }
+                $this->handler->handleBatch($this->buffer);
+                $this->buffer = array();
             }
-
-            $array = & $array[$part];
+        } else {
+            $this->handler->handle($record);
         }
 
-        return $array;
+        return false === $this->bubble;
     }
 
     /**
-     * Resolves the key from the name.
-     *
-     * This is the last part in a dot separated string.
-     *
-     * @param string $name
-     *
-     * @return string
+     * Resets the state of the handler. Stops forwarding records to the wrapped handler.
      */
-    protected function resolveKey($name)
+    public function reset()
     {
-        if (strpos($name, $this->namespaceCharacter) !== false) {
-            $name = substr($name, strrpos($name, $this->namespaceCharacter)+1, strlen($name));
-        }
-
-        return $name;
+        $this->buffering = true;
     }
 }
diff --git a/core/vendor/Symfony/Component/EventDispatcher/GenericEvent.php b/core/vendor/Monolog/Handler/FirePHPHandler.php
similarity index 12%
copy from core/vendor/Symfony/Component/EventDispatcher/GenericEvent.php
copy to core/vendor/Monolog/Handler/FirePHPHandler.php
index 0e792d0..0909218 100644
--- a/core/vendor/Symfony/Component/EventDispatcher/GenericEvent.php
+++ b/core/vendor/Monolog/Handler/FirePHPHandler.php
@@ -1,180 +1,160 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\EventDispatcher;
+namespace Monolog\Handler;
+
+use Monolog\Formatter\WildfireFormatter;
 
 /**
- * Event encapsulation class.
- *
- * Encapsulates events thus decoupling the observer from the subject they encapsulate.
+ * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol.
  *
- * @author Drak <drak@zikula.org>
+ * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>
  */
-class GenericEvent extends Event implements \ArrayAccess
+class FirePHPHandler extends AbstractProcessingHandler
 {
     /**
-     * Observer pattern subject.
-     *
-     * @var mixed usually object or callable
+     * WildFire JSON header message format
      */
-    protected $subject;
+    const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2';
 
     /**
-     * Array of arguments.
-     *
-     * @var array
+     * FirePHP structure for parsing messages & their presentation
      */
-    protected $arguments;
+    const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1';
 
     /**
-     * Encapsulate an event with $subject, $args, and $data.
-     *
-     * @param mixed  $subject   The subject of the event, usually an object.
-     * @param array  $arguments Arguments to store in the event.
+     * Must reference a "known" plugin, otherwise headers won't display in FirePHP
      */
-    public function __construct($subject = null, array $arguments = array())
-    {
-        $this->subject = $subject;
-        $this->arguments = $arguments;
-    }
+    const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3';
 
     /**
-     * Getter for subject property.
-     *
-     * @return mixed $subject The observer subject.
+     * Header prefix for Wildfire to recognize & parse headers
      */
-    public function getSubject()
-    {
-        return $this->subject;
-    }
+    const HEADER_PREFIX = 'X-Wf';
 
     /**
-     * Get argument by key.
-     *
-     * @param string $key Key.
-     *
-     * @throws \InvalidArgumentException If key is not found.
-     *
-     * @return mixed Contents of array key.
+     * Whether or not Wildfire vendor-specific headers have been generated & sent yet
      */
-    public function getArgument($key)
-    {
-        if ($this->hasArgument($key)) {
-            return $this->arguments[$key];
-        }
-
-        throw new \InvalidArgumentException(sprintf('%s not found in %s', $key, $this->getName()));
-    }
+    protected static $initialized = false;
 
     /**
-     * Add argument to event.
-     *
-     * @param string $key   Argument name.
-     * @param mixed  $value Value.
-     *
-     * @return GenericEvent
+     * Shared static message index between potentially multiple handlers
+     * @var int
      */
-    public function setArgument($key, $value)
-    {
-        $this->arguments[$key] = $value;
+    protected static $messageIndex = 1;
 
-        return $this;
-    }
+    protected $sendHeaders = true;
 
     /**
-     * Getter for all arguments.
+     * Base header creation function used by init headers & record headers
      *
-     * @return array
+     * @param  array  $meta    Wildfire Plugin, Protocol & Structure Indexes
+     * @param  string $message Log message
+     * @return array  Complete header string ready for the client as key and message as value
      */
-    public function getArguments()
+    protected function createHeader(array $meta, $message)
     {
-        return $this->arguments;
+        $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta));
+
+        return array($header => $message);
     }
 
     /**
-     * Set args property.
-     *
-     * @param array $args Arguments.
+     * Creates message header from record
      *
-     * @return GenericEvent
+     * @see createHeader()
+     * @param  array  $record
+     * @return string
      */
-    public function setArguments(array $args = array())
+    protected function createRecordHeader(array $record)
     {
-        $this->arguments = $args;
-
-        return $this;
+        // Wildfire is extensible to support multiple protocols & plugins in a single request,
+        // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake.
+        return $this->createHeader(
+            array(1, 1, 1, self::$messageIndex++),
+            $record['formatted']
+        );
     }
 
     /**
-     * Has argument.
-     *
-     * @param string $key Key of arguments array.
-     *
-     * @return boolean
+     * {@inheritDoc}
      */
-    public function hasArgument($key)
+    protected function getDefaultFormatter()
     {
-        return array_key_exists($key, $this->arguments);
+        return new WildfireFormatter();
     }
 
     /**
-     * ArrayAccess for argument getter.
-     *
-     * @param string $key Array key.
+     * Wildfire initialization headers to enable message parsing
      *
-     * @throws \InvalidArgumentException If key does not exist in $this->args.
-     *
-     * @return mixed
+     * @see createHeader()
+     * @see sendHeader()
+     * @return array
      */
-    public function offsetGet($key)
+    protected function getInitHeaders()
     {
-        return $this->getArgument($key);
+        // Initial payload consists of required headers for Wildfire
+        return array_merge(
+            $this->createHeader(array('Protocol', 1), self::PROTOCOL_URI),
+            $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI),
+            $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI)
+        );
     }
 
     /**
-     * ArrayAccess for argument setter.
-     *
-     * @param string $key   Array key to set.
-     * @param mixed  $value Value.
+     * Send header string to the client
      *
-     * @return void
+     * @param string $header
+     * @param string $content
      */
-    public function offsetSet($key, $value)
+    protected function sendHeader($header, $content)
     {
-        $this->setArgument($key, $value);
+        if (!headers_sent() && $this->sendHeaders) {
+            header(sprintf('%s: %s', $header, $content));
+        }
     }
 
     /**
-     * ArrayAccess for unset argument.
-     *
-     * @param string $key Array key.
+     * Creates & sends header for a record, ensuring init headers have been sent prior
      *
-     * @return void
+     * @see sendHeader()
+     * @see sendInitHeaders()
+     * @param array $record
      */
-    public function offsetUnset($key)
+    protected function write(array $record)
     {
-        if ($this->hasArgument($key)) {
-            unset($this->arguments[$key]);
+        // WildFire-specific headers must be sent prior to any messages
+        if (!self::$initialized) {
+            $this->sendHeaders = $this->headersAccepted();
+
+            foreach ($this->getInitHeaders() as $header => $content) {
+                $this->sendHeader($header, $content);
+            }
+
+            self::$initialized = true;
         }
+
+        $header = $this->createRecordHeader($record);
+        $this->sendHeader(key($header), current($header));
     }
 
     /**
-     * ArrayAccess has argument.
-     *
-     * @param string $key Array key.
+     * Verifies if the headers are accepted by the current user agent
      *
-     * @return boolean
+     * @return Boolean
      */
-    public function offsetExists($key)
+    protected function headersAccepted()
     {
-        return $this->hasArgument($key);
+        return !isset($_SERVER['HTTP_USER_AGENT'])
+               || preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])
+               || isset($_SERVER['HTTP_X_FIREPHP_VERSION']);
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php b/core/vendor/Monolog/Handler/GelfHandler.php
similarity index 22%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php
copy to core/vendor/Monolog/Handler/GelfHandler.php
index dd9f0c7..34d48e7 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php
+++ b/core/vendor/Monolog/Handler/GelfHandler.php
@@ -1,72 +1,66 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+namespace Monolog\Handler;
+
+use Gelf\IMessagePublisher;
+use Monolog\Logger;
+use Monolog\Handler\AbstractProcessingHandler;
+use Monolog\Formatter\GelfMessageFormatter;
 
 /**
- * NullSessionHandler.
- *
- * Can be used in unit testing or in a sitation where persisted sessions are not desired.
+ * Handler to send messages to a Graylog2 (http://www.graylog2.org) server
  *
- * @author Drak <drak@zikula.org>
- *
- * @api
+ * @author Matt Lehner <mlehner@gmail.com>
  */
-class NullSessionHandler implements \SessionHandlerInterface
+class GelfHandler extends AbstractProcessingHandler
 {
     /**
-     * {@inheritdoc}
+     * @var Gelf\IMessagePublisher the publisher object that sends the message to the server
      */
-    public function open($savePath, $sessionName)
-    {
-        return true;
-    }
+    protected $publisher;
 
     /**
-     * {@inheritdoc}
+     * @param Gelf\IMessagePublisher $publisher a publisher object
+     * @param integer                $level     The minimum logging level at which this handler will be triggered
+     * @param Boolean                $bubble    Whether the messages that are handled can bubble up the stack or not
      */
-    public function close()
+    public function __construct(IMessagePublisher $publisher, $level = Logger::DEBUG, $bubble = true)
     {
-        return true;
-    }
+        parent::__construct($level, $bubble);
 
-    /**
-     * {@inheritdoc}
-     */
-    public function read($sessionId)
-    {
-        return '';
+        $this->publisher = $publisher;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function write($sessionId, $data)
+    public function close()
     {
-        return true;
+        $this->publisher = null;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function destroy($sessionId)
+    protected function write(array $record)
     {
-        return true;
+        $this->publisher->publish($record['formatted']);
     }
 
     /**
-     * {@inheritdoc}
+     * {@inheritDoc}
      */
-    public function gc($lifetime)
+    protected function getDefaultFormatter()
     {
-        return true;
+        return new GelfMessageFormatter();
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php b/core/vendor/Monolog/Handler/GroupHandler.php
similarity index 20%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php
copy to core/vendor/Monolog/Handler/GroupHandler.php
index dd9f0c7..cd29531 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php
+++ b/core/vendor/Monolog/Handler/GroupHandler.php
@@ -1,72 +1,74 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+namespace Monolog\Handler;
 
 /**
- * NullSessionHandler.
+ * Forwards records to multiple handlers
  *
- * Can be used in unit testing or in a sitation where persisted sessions are not desired.
- *
- * @author Drak <drak@zikula.org>
- *
- * @api
+ * @author Lenar Lõhmus <lenar@city.ee>
  */
-class NullSessionHandler implements \SessionHandlerInterface
+class GroupHandler extends AbstractHandler
 {
-    /**
-     * {@inheritdoc}
-     */
-    public function open($savePath, $sessionName)
-    {
-        return true;
-    }
+    protected $handlers;
 
     /**
-     * {@inheritdoc}
+     * @param array   $handlers Array of Handlers.
+     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
      */
-    public function close()
+    public function __construct(array $handlers, $bubble = true)
     {
-        return true;
-    }
+        foreach ($handlers as $handler) {
+            if (!$handler instanceof HandlerInterface) {
+                throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.');
+            }
+        }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function read($sessionId)
-    {
-        return '';
+        $this->handlers = $handlers;
+        $this->bubble = $bubble;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function write($sessionId, $data)
+    public function isHandling(array $record)
     {
-        return true;
+        foreach ($this->handlers as $handler) {
+            if ($handler->isHandling($record)) {
+                return true;
+            }
+        }
+
+        return false;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function destroy($sessionId)
+    public function handle(array $record)
     {
-        return true;
+        foreach ($this->handlers as $handler) {
+            $handler->handle($record);
+        }
+
+        return false === $this->bubble;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function gc($lifetime)
+    public function handleBatch(array $records)
     {
-        return true;
+        foreach ($this->handlers as $handler) {
+            $handler->handleBatch($records);
+        }
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php b/core/vendor/Monolog/Handler/HandlerInterface.php
similarity index 17%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php
copy to core/vendor/Monolog/Handler/HandlerInterface.php
index 7da1227..d24dc77 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php
+++ b/core/vendor/Monolog/Handler/HandlerInterface.php
@@ -1,93 +1,77 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Flash;
+namespace Monolog\Handler;
 
-use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
+use Monolog\Formatter\FormatterInterface;
 
 /**
- * FlashBagInterface.
+ * Interface that all Monolog Handlers must implement
  *
- * @author Drak <drak@zikula.org>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-interface FlashBagInterface extends SessionBagInterface
+interface HandlerInterface
 {
     /**
-     * Adds a flash message for type.
+     * Checks whether the given record will be handled by this handler.
      *
-     * @param string $type
-     * @param string $message
-     */
-    public function add($type, $message);
-
-    /**
-     * Registers a message for a given type.
+     * This is mostly done for performance reasons, to avoid calling processors for nothing.
      *
-     * @param string $type
-     * @param string $message
+     * @return Boolean
      */
-    function set($type, $message);
+    public function isHandling(array $record);
 
     /**
-     * Gets flash message for a given type.
+     * Handles a record.
      *
-     * @param string $type    Message category type.
-     * @param array  $default Default value if $type doee not exist.
+     * The return value of this function controls the bubbling process of the handler stack.
      *
-     * @return string
+     * @param  array   $record The record to handle
+     * @return Boolean True means that this handler handled the record, and that bubbling is not permitted.
+     *                 False means the record was either not processed or that this handler allows bubbling.
      */
-    function peek($type, array $default = array());
+    public function handle(array $record);
 
     /**
-     * Gets all flash messages.
+     * Handles a set of records at once.
      *
-     * @return array
+     * @param array $records The records to handle (an array of record arrays)
      */
-    function peekAll();
+    public function handleBatch(array $records);
 
     /**
-     * Gets and clears flash from the stack.
-     *
-     * @param string $type
-     * @param array  $default Default value if $type doee not exist.
+     * Adds a processor in the stack.
      *
-     * @return string
+     * @param callable $callback
      */
-    function get($type, array $default = array());
+    public function pushProcessor($callback);
 
     /**
-     * Gets and clears flashes from the stack.
+     * Removes the processor on top of the stack and returns it.
      *
-     * @return array
+     * @return callable
      */
-    function all();
+    public function popProcessor();
 
     /**
-     * Sets all flash messages.
-     */
-    function setAll(array $messages);
-
-    /**
-     * Has flash messages for a given type?
-     *
-     * @param string $type
+     * Sets the formatter.
      *
-     * @return boolean
+     * @param FormatterInterface $formatter
      */
-    function has($type);
+    public function setFormatter(FormatterInterface $formatter);
 
     /**
-     * Returns a list of all defined types.
+     * Gets the formatter.
      *
-     * @return array
+     * @return FormatterInterface
      */
-    function keys();
+    public function getFormatter();
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php b/core/vendor/Monolog/Handler/MailHandler.php
similarity index 23%
copy from core/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php
copy to core/vendor/Monolog/Handler/MailHandler.php
index ca8f8ee..8629272 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php
+++ b/core/vendor/Monolog/Handler/MailHandler.php
@@ -1,51 +1,55 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation;
+namespace Monolog\Handler;
 
 /**
- * Request represents an HTTP request from an Apache server.
+ * Base class for all mail handlers
  *
- * @author Fabien Potencier <fabien@symfony.com>
+ * @author Gyula Sallai
  */
-class ApacheRequest extends Request
+abstract class MailHandler extends AbstractProcessingHandler
 {
     /**
      * {@inheritdoc}
      */
-    protected function prepareRequestUri()
+    public function handleBatch(array $records)
     {
-        return $this->server->get('REQUEST_URI');
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function prepareBaseUrl()
-    {
-        $baseUrl = $this->server->get('SCRIPT_NAME');
+        $messages = array();
 
-        if (false === strpos($this->server->get('REQUEST_URI'), $baseUrl)) {
-            // assume mod_rewrite
-            return rtrim(dirname($baseUrl), '/\\');
+        foreach ($records as $record) {
+            if ($record['level'] < $this->level) {
+                continue;
+            }
+            $messages[] = $this->processRecord($record);
         }
 
-        return $baseUrl;
+        if (!empty($messages)) {
+            $this->send((string) $this->getFormatter()->formatBatch($messages), $messages);
+        }
     }
 
     /**
+     * Send a mail with the given content
+     *
+     * @param string $content
+     * @param array  $records the array of log records that formed this content
+     */
+    abstract protected function send($content, array $records);
+
+    /**
      * {@inheritdoc}
      */
-    protected function preparePathInfo()
+    protected function write(array $record)
     {
-        return $this->server->get('PATH_INFO') ?: substr($this->prepareRequestUri(), strlen($this->prepareBaseUrl())) ?: '/';
+        $this->send((string) $record['formatted'], array($record));
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php b/core/vendor/Monolog/Handler/MongoDBHandler.php
similarity index 19%
copy from core/vendor/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php
copy to core/vendor/Monolog/Handler/MongoDBHandler.php
index 7b492d0..210bb19 100644
--- a/core/vendor/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php
+++ b/core/vendor/Monolog/Handler/MongoDBHandler.php
@@ -1,55 +1,51 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Thomas Tourlourat <thomas@tourlourat.com>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\CacheClearer;
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\Formatter\NormalizerFormatter;
 
 /**
- * ChainCacheClearer.
+ * Logs to a MongoDB database.
+ *
+ * usage example:
+ *
+ *   $log = new Logger('application');
+ *   $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod");
+ *   $log->pushHandler($mongodb);
  *
- * @author Dustin Dobervich <ddobervich@gmail.com>
+ * @author Thomas Tourlourat <thomas@tourlourat.com>
  */
-class ChainCacheClearer implements CacheClearerInterface
+class MongoDBHandler extends AbstractProcessingHandler
 {
-    /**
-     * @var array $clearers
-     */
-    protected $clearers;
+    private $mongoCollection;
 
-    /**
-     * Constructs a new instance of ChainCacheClearer.
-     *
-     * @param array $clearers The initial clearers.
-     */
-    public function __construct(array $clearers = array())
+    public function __construct(\Mongo $mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true)
     {
-        $this->clearers = $clearers;
+        $this->mongoCollection = $mongo->selectCollection($database, $collection);
+
+        parent::__construct($level, $bubble);
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    public function clear($cacheDir)
+    protected function write(array $record)
     {
-        foreach ($this->clearers as $clearer) {
-            $clearer->clear($cacheDir);
-        }
+        $this->mongoCollection->save($record["formatted"]);
     }
 
     /**
-     * Adds a cache clearer to the aggregate.
-     *
-     * @param CacheClearerInterface $clearer
+     * {@inheritDoc}
      */
-    public function add(CacheClearerInterface $clearer)
+    protected function getDefaultFormatter()
     {
-        $this->clearers[] = $clearer;
+        return new NormalizerFormatter();
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php b/core/vendor/Monolog/Handler/NativeMailerHandler.php
similarity index 15%
copy from core/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php
copy to core/vendor/Monolog/Handler/NativeMailerHandler.php
index ca8f8ee..c954de5 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php
+++ b/core/vendor/Monolog/Handler/NativeMailerHandler.php
@@ -1,51 +1,65 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation;
+namespace Monolog\Handler;
+
+use Monolog\Logger;
 
 /**
- * Request represents an HTTP request from an Apache server.
+ * NativeMailerHandler uses the mail() function to send the emails
  *
- * @author Fabien Potencier <fabien@symfony.com>
+ * @author Christophe Coevoet <stof@notk.org>
  */
-class ApacheRequest extends Request
+class NativeMailerHandler extends MailHandler
 {
+    protected $to;
+    protected $subject;
+    protected $headers = array(
+        'Content-type: text/plain; charset=utf-8'
+    );
+
     /**
-     * {@inheritdoc}
+     * @param string|array $to      The receiver of the mail
+     * @param string       $subject The subject of the mail
+     * @param string       $from    The sender of the mail
+     * @param integer      $level   The minimum logging level at which this handler will be triggered
+     * @param boolean      $bubble  Whether the messages that are handled can bubble up the stack or not
      */
-    protected function prepareRequestUri()
+    public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = true)
     {
-        return $this->server->get('REQUEST_URI');
+        parent::__construct($level, $bubble);
+        $this->to = is_array($to) ? $to : array($to);
+        $this->subject = $subject;
+        $this->headers[] = sprintf('From: %s', $from);
     }
 
     /**
-     * {@inheritdoc}
+     * @param string|array $header Custom added headers
      */
-    protected function prepareBaseUrl()
+    public function addHeader($headers)
     {
-        $baseUrl = $this->server->get('SCRIPT_NAME');
-
-        if (false === strpos($this->server->get('REQUEST_URI'), $baseUrl)) {
-            // assume mod_rewrite
-            return rtrim(dirname($baseUrl), '/\\');
+        if (is_array($headers)) {
+            $this->headers = array_merge($this->headers, $headers);
+        } else {
+            $this->headers[] = $headers;
         }
-
-        return $baseUrl;
     }
 
     /**
      * {@inheritdoc}
      */
-    protected function preparePathInfo()
+    protected function send($content, array $records)
     {
-        return $this->server->get('PATH_INFO') ?: substr($this->prepareRequestUri(), strlen($this->prepareBaseUrl())) ?: '/';
+        foreach ($this->to as $to) {
+            mail($to, $this->subject, wordwrap($content, 70), implode("\r\n", $this->headers) . "\r\n");
+        }
     }
 }
diff --git a/core/vendor/Twig/Extension/Optimizer.php b/core/vendor/Monolog/Handler/NullHandler.php
similarity index 24%
copy from core/vendor/Twig/Extension/Optimizer.php
copy to core/vendor/Monolog/Handler/NullHandler.php
index 013fcb6..3754e45 100644
--- a/core/vendor/Twig/Extension/Optimizer.php
+++ b/core/vendor/Monolog/Handler/NullHandler.php
@@ -1,35 +1,45 @@
 <?php
 
 /*
- * This file is part of Twig.
+ * This file is part of the Monolog package.
  *
- * (c) 2010 Fabien Potencier
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * 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;
-    }
+namespace Monolog\Handler;
 
+use Monolog\Logger;
+
+/**
+ * Blackhole
+ *
+ * Any record it can handle will be thrown away. This can be used
+ * to put on top of an existing stack to override it temporarily.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class NullHandler extends AbstractHandler
+{
     /**
-     * {@inheritdoc}
+     * @param integer $level The minimum logging level at which this handler will be triggered
      */
-    public function getNodeVisitors()
+    public function __construct($level = Logger::DEBUG)
     {
-        return array(new Twig_NodeVisitor_Optimizer($this->optimizers));
+        parent::__construct($level, false);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getName()
+    public function handle(array $record)
     {
-        return 'optimizer';
+        if ($record['level'] < $this->level) {
+            return false;
+        }
+
+        return true;
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php b/core/vendor/Monolog/Handler/RotatingFileHandler.php
similarity index 14%
copy from core/vendor/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php
copy to core/vendor/Monolog/Handler/RotatingFileHandler.php
index 97f7165..682542c 100644
--- a/core/vendor/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php
+++ b/core/vendor/Monolog/Handler/RotatingFileHandler.php
@@ -1,106 +1,109 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\DataCollector;
+namespace Monolog\Handler;
 
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
+use Monolog\Logger;
 
 /**
- * LogDataCollector.
+ * Stores logs to files that are rotated every day and a limited number of files are kept.
  *
- * @author Fabien Potencier <fabien@symfony.com>
+ * This rotation is only intended to be used as a workaround. Using logrotate to
+ * handle the rotation is strongly encouraged when you can use it.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
  */
-class LoggerDataCollector extends DataCollector
+class RotatingFileHandler extends StreamHandler
 {
-    private $logger;
-
-    public function __construct($logger = null)
-    {
-        if (null !== $logger && $logger instanceof DebugLoggerInterface) {
-            $this->logger = $logger;
-        }
-    }
+    protected $filename;
+    protected $maxFiles;
+    protected $mustRotate;
 
     /**
-     * {@inheritdoc}
+     * @param string  $filename
+     * @param integer $maxFiles The maximal amount of files to keep (0 means unlimited)
+     * @param integer $level    The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
      */
-    public function collect(Request $request, Response $response, \Exception $exception = null)
+    public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true)
     {
-        if (null !== $this->logger) {
-            $this->data = array(
-                'error_count' => $this->logger->countErrors(),
-                'logs'        => $this->sanitizeLogs($this->logger->getLogs()),
-            );
+        $this->filename = $filename;
+        $this->maxFiles = (int) $maxFiles;
+
+        $fileInfo = pathinfo($this->filename);
+        $timedFilename = $fileInfo['dirname'].'/'.$fileInfo['filename'].'-'.date('Y-m-d');
+        if (!empty($fileInfo['extension'])) {
+            $timedFilename .= '.'.$fileInfo['extension'];
         }
-    }
 
-    /**
-     * Gets the called events.
-     *
-     * @return array An array of called events
-     *
-     * @see TraceableEventDispatcherInterface
-     */
-    public function countErrors()
-    {
-        return isset($this->data['error_count']) ? $this->data['error_count'] : 0;
+        // disable rotation upfront if files are unlimited
+        if (0 === $this->maxFiles) {
+            $this->mustRotate = false;
+        }
+
+        parent::__construct($timedFilename, $level, $bubble);
     }
 
     /**
-     * Gets the logs.
-     *
-     * @return array An array of logs
+     * {@inheritdoc}
      */
-    public function getLogs()
+    public function close()
     {
-        return isset($this->data['logs']) ? $this->data['logs'] : array();
+        parent::close();
+
+        if (true === $this->mustRotate) {
+            $this->rotate();
+        }
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getName()
+    protected function write(array $record)
     {
-        return 'logger';
-    }
-
-    private function sanitizeLogs($logs)
-    {
-        foreach ($logs as $i => $log) {
-            $logs[$i]['context'] = $this->sanitizeContext($log['context']);
+        // on the first record written, if the log is new, we should rotate (once per day)
+        if (null === $this->mustRotate) {
+            $this->mustRotate = !file_exists($this->url);
         }
 
-        return $logs;
+        parent::write($record);
     }
 
-    private function sanitizeContext($context)
+    /**
+     * Rotates the files.
+     */
+    protected function rotate()
     {
-        if (is_array($context)) {
-            foreach ($context as $key => $value) {
-                $context[$key] = $this->sanitizeContext($value);
-            }
-
-            return $context;
+        $fileInfo = pathinfo($this->filename);
+        $glob = $fileInfo['dirname'].'/'.$fileInfo['filename'].'-*';
+        if (!empty($fileInfo['extension'])) {
+            $glob .= '.'.$fileInfo['extension'];
         }
-
-        if (is_resource($context)) {
-            return sprintf('Resource(%s)', get_resource_type($context));
+        $iterator = new \GlobIterator($glob);
+        $count = $iterator->count();
+        if ($this->maxFiles >= $count) {
+            // no files to remove
+            return;
         }
 
-        if (is_object($context)) {
-            return sprintf('Object(%s)', get_class($context));
-        }
+        // Sorting the files by name to remove the older ones
+        $array = iterator_to_array($iterator);
+        usort($array, function($a, $b) {
+            return strcmp($b->getFilename(), $a->getFilename());
+        });
 
-        return $context;
+        foreach (array_slice($array, $this->maxFiles) as $file) {
+            if ($file->isWritable()) {
+                unlink($file->getRealPath());
+            }
+        }
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Session.php b/core/vendor/Monolog/Handler/SocketHandler.php
similarity index 11%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Session.php
copy to core/vendor/Monolog/Handler/SocketHandler.php
index 0c40c1c..b44fad7 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Session.php
+++ b/core/vendor/Monolog/Handler/SocketHandler.php
@@ -1,335 +1,272 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session;
+namespace Monolog\Handler;
 
-use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface;
-use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
-use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
-use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
-use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
-use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
-use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
+use Monolog\Logger;
 
 /**
- * Session.
+ * Stores to any socket - uses fsockopen() or pfsockopen().
  *
- * @author Fabien Potencier <fabien@symfony.com>
- * @author Drak <drak@zikula.org>
- *
- * @api
+ * @author Pablo de Leon Belloc <pablolb@gmail.com>
+ * @see    http://php.net/manual/en/function.fsockopen.php
  */
-class Session implements SessionInterface, \IteratorAggregate, \Countable
+class SocketHandler extends AbstractProcessingHandler
 {
-    /**
-     * Storage driver.
-     *
-     * @var SessionStorageInterface
-     */
-    protected $storage;
-
-    /**
-     * @var string
-     */
-    private $flashName;
-
-    /**
-     * @var string
-     */
-    private $attributeName;
+    private $connectionString;
+    private $connectionTimeout;
+    private $resource;
+    private $timeout = 0;
+    private $persistent = false;
+    private $errno;
+    private $errstr;
 
     /**
-     * Constructor.
-     *
-     * @param SessionStorageInterface $storage    A SessionStorageInterface instance.
-     * @param AttributeBagInterface   $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag)
-     * @param FlashBagInterface       $flashes    A FlashBagInterface instance (defaults null for default FlashBag)
+     * @param string  $connectionString Socket connection string
+     * @param integer $level            The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble           Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(SessionStorageInterface $storage = null, AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null)
+    public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true)
     {
-        $this->storage = $storage ?: new NativeSessionStorage();
-
-        $attributes = $attributes ?: new AttributeBag();
-        $this->attributeName = $attributes->getName();
-        $this->registerBag($attributes);
-
-        $flashes = $flashes ?: new FlashBag();
-        $this->flashName = $flashes->getName();
-        $this->registerBag($flashes);
+        parent::__construct($level, $bubble);
+        $this->connectionString = $connectionString;
+        $this->connectionTimeout = (float) ini_get('default_socket_timeout');
     }
 
     /**
-     * {@inheritdoc}
+     * Connect (if necessary) and write to the socket
+     *
+     * @param array $record
+     *
+     * @throws \UnexpectedValueException
+     * @throws \RuntimeException
      */
-    public function start()
+    public function write(array $record)
     {
-        return $this->storage->start();
+        $this->connectIfNotConnected();
+        $this->writeToSocket((string) $record['formatted']);
     }
 
     /**
-     * {@inheritdoc}
+     * We will not close a PersistentSocket instance so it can be reused in other requests.
      */
-    public function has($name)
+    public function close()
     {
-        return $this->storage->getBag($this->attributeName)->has($name);
+        if (!$this->isPersistent()) {
+            $this->closeSocket();
+        }
     }
 
     /**
-     * {@inheritdoc}
+     * Close socket, if open
      */
-    public function get($name, $default = null)
+    public function closeSocket()
     {
-        return $this->storage->getBag($this->attributeName)->get($name, $default);
+        if (is_resource($this->resource)) {
+            fclose($this->resource);
+            $this->resource = null;
+        }
     }
 
     /**
-     * {@inheritdoc}
+     * Set socket connection to nbe persistent. It only has effect before the connection is initiated.
+     *
+     * @param type $boolean
      */
-    public function set($name, $value)
+    public function setPersistent($boolean)
     {
-        $this->storage->getBag($this->attributeName)->set($name, $value);
+        $this->persistent = (boolean) $boolean;
     }
 
     /**
-     * {@inheritdoc}
+     * Set connection timeout.  Only has effect before we connect.
+     *
+     * @param integer $seconds
+     *
+     * @see http://php.net/manual/en/function.fsockopen.php
      */
-    public function all()
+    public function setConnectionTimeout($seconds)
     {
-        return $this->storage->getBag($this->attributeName)->all();
+        $this->validateTimeout($seconds);
+        $this->connectionTimeout = (float) $seconds;
     }
 
     /**
-     * {@inheritdoc}
+     * Set write timeout. Only has effect before we connect.
+     *
+     * @param type $seconds
+     *
+     * @see http://php.net/manual/en/function.stream-set-timeout.php
      */
-    public function replace(array $attributes)
+    public function setTimeout($seconds)
     {
-        $this->storage->getBag($this->attributeName)->replace($attributes);
+        $this->validateTimeout($seconds);
+        $this->timeout = (int) $seconds;
     }
 
     /**
-     * {@inheritdoc}
+     * Get current connection string
+     *
+     * @return string
      */
-    public function remove($name)
+    public function getConnectionString()
     {
-        return $this->storage->getBag($this->attributeName)->remove($name);
+        return $this->connectionString;
     }
 
     /**
-     * {@inheritdoc}
+     * Get persistent setting
+     *
+     * @return boolean
      */
-    public function clear()
+    public function isPersistent()
     {
-        $this->storage->getBag($this->attributeName)->clear();
+        return $this->persistent;
     }
 
     /**
-     * Returns an iterator for attributes.
+     * Get current connection timeout setting
      *
-     * @return \ArrayIterator An \ArrayIterator instance
+     * @return float
      */
-    public function getIterator()
+    public function getConnectionTimeout()
     {
-        return new \ArrayIterator($this->storage->getBag($this->attributeName)->all());
+        return $this->connectionTimeout;
     }
 
     /**
-     * Returns the number of attributes.
+     * Get current in-transfer timeout
      *
-     * @return int The number of attributes
+     * @return float
      */
-    public function count()
+    public function getTimeout()
     {
-        return count($this->storage->getBag($this->attributeName)->all());
+        return $this->timeout;
     }
 
     /**
-     * {@inheritdoc}
+     * Check to see if the socket is currently available.
+     *
+     * UDP might appear to be connected but might fail when writing.  See http://php.net/fsockopen for details.
+     *
+     * @return boolean
      */
-    public function invalidate($lifetime = null)
+    public function isConnected()
     {
-        $this->storage->clear();
-
-        return $this->migrate(true, $lifetime);
+        return is_resource($this->resource)
+            && !feof($this->resource);  // on TCP - other party can close connection.
     }
 
     /**
-     * {@inheritdoc}
+     * Wrapper to allow mocking
      */
-    public function migrate($destroy = false, $lifetime = null)
+    protected function pfsockopen()
     {
-        return $this->storage->regenerate($destroy, $lifetime);
+        return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);
     }
 
     /**
-     * {@inheritdoc}
+     * Wrapper to allow mocking
      */
-    public function save()
+    protected function fsockopen()
     {
-        $this->storage->save();
+        return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);
     }
 
     /**
-     * {@inheritdoc}
+     * Wrapper to allow mocking
      */
-    public function getId()
+    protected function streamSetTimeout()
     {
-        return $this->storage->getId();
+        return stream_set_timeout($this->resource, $this->timeout);
     }
 
     /**
-     * {@inheritdoc}
+     * Wrapper to allow mocking
      */
-    public function setId($id)
+    protected function fwrite($data)
     {
-        $this->storage->setId($id);
+        return @fwrite($this->resource, $data);
     }
 
     /**
-     * {@inheritdoc}
+     * Wrapper to allow mocking
      */
-    public function getName()
+    protected function streamGetMetadata()
     {
-        return $this->storage->getName();
+        return stream_get_meta_data($this->resource);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function setName($name)
+    private function validateTimeout($value)
     {
-        $this->storage->setName($name);
+        $ok = filter_var($value, FILTER_VALIDATE_INT, array('options' => array(
+                'min_range' => 0,
+                )));
+        if ($ok === false) {
+            throw new \InvalidArgumentException("Timeout must be 0 or a positive integer (got $value)");
+        }
     }
 
-    /**
-     * {@iheritdoc}
-     */
-    public function getMetadataBag()
+    private function connectIfNotConnected()
     {
-        return $this->storage->getMetadataBag();
+        if ($this->isConnected()) {
+            return;
+        }
+        $this->connect();
     }
 
-    /**
-     * {@iheritdoc}
-     */
-    public function registerBag(SessionBagInterface $bag)
+    private function connect()
     {
-        $this->storage->registerBag($bag);
+        $this->createSocketResource();
+        $this->setSocketTimeout();
     }
 
-    /**
-     * {@iheritdoc}
-     */
-    public function getBag($name)
+    private function createSocketResource()
     {
-        return $this->storage->getBag($name);
+        if ($this->isPersistent()) {
+            $resource = $this->pfsockopen();
+        } else {
+            $resource = $this->fsockopen();
+        }
+        if (!$resource) {
+            throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)");
+        }
+        $this->resource = $resource;
     }
 
-    /**
-     * Gets the flashbag interface.
-     *
-     * @return FlashBagInterface
-     */
-    public function getFlashBag()
+    private function setSocketTimeout()
     {
-        return $this->getBag($this->flashName);
+        if (!$this->streamSetTimeout()) {
+            throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()");
+        }
     }
 
-    // the following methods are kept for compatibility with Symfony 2.0 (they will be removed for Symfony 2.3)
-
-    /**
-     * @return array
-     *
-     * @deprecated since 2.1, will be removed from 2.3
-     */
-    public function getFlashes()
+    private function writeToSocket($data)
     {
-        $all = $this->getBag($this->flashName)->all();
-
-        $return = array();
-        if ($all) {
-            foreach ($all as $name => $array) {
-                $return[$name] = reset($array);
+        $length = strlen($data);
+        $sent = 0;
+        while ($this->isConnected() && $sent < $length) {
+            $chunk = $this->fwrite(substr($data, $sent));
+            if ($chunk === false) {
+                throw new \RuntimeException("Could not write to socket");
+            }
+            $sent += $chunk;
+            $socketInfo = $this->streamGetMetadata();
+            if ($socketInfo['timed_out']) {
+                throw new \RuntimeException("Write timed-out");
             }
         }
-
-        return $return;
-    }
-
-    /**
-     * @param array $values
-     *
-     * @deprecated since 2.1, will be removed from 2.3
-     */
-    public function setFlashes($values)
-    {
-        foreach ($values as $name => $value) {
-            $this->getBag($this->flashName)->set($name, $value);
+        if (!$this->isConnected() && $sent < $length) {
+            throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)");
         }
     }
 
-    /**
-     * @param string $name
-     * @param string $default
-     *
-     * @return string
-     *
-     * @deprecated since 2.1, will be removed from 2.3
-     */
-    public function getFlash($name, $default = null)
-    {
-        $return = $this->getBag($this->flashName)->get($name);
-
-        return empty($return) ? $default : reset($return);
-    }
-
-    /**
-     * @param string $name
-     * @param string $value
-     *
-     * @deprecated since 2.1, will be removed from 2.3
-     */
-    public function setFlash($name, $value)
-    {
-        $this->getBag($this->flashName)->set($name, $value);
-    }
-
-    /**
-     * @param string $name
-     *
-     * @return Boolean
-     *
-     * @deprecated since 2.1, will be removed from 2.3
-     */
-    public function hasFlash($name)
-    {
-        return $this->getBag($this->flashName)->has($name);
-    }
-
-    /**
-     * @param string $name
-     *
-     * @deprecated since 2.1, will be removed from 2.3
-     */
-    public function removeFlash($name)
-    {
-        $this->getBag($this->flashName)->get($name);
-    }
-
-    /**
-     * @return array
-     *
-     * @deprecated since 2.1, will be removed from 2.3
-     */
-    public function clearFlashes()
-    {
-        return $this->getBag($this->flashName)->clear();
-    }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php b/core/vendor/Monolog/Handler/StreamHandler.php
similarity index 16%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php
copy to core/vendor/Monolog/Handler/StreamHandler.php
index e925d62..a437030 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php
+++ b/core/vendor/Monolog/Handler/StreamHandler.php
@@ -1,54 +1,43 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
+namespace Monolog\Handler;
+
+use Monolog\Logger;
 
 /**
- * SessionHandler proxy.
+ * Stores to any stream resource
+ *
+ * Can be used to store into php://stderr, remote and local files, etc.
  *
- * @author Drak <drak@zikula.org>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface
+class StreamHandler extends AbstractProcessingHandler
 {
-    /**
-     * @var \SessionHandlerInterface
-     */
-    protected $handler;
+    protected $stream;
+    protected $url;
 
     /**
-     * Constructor.
-     *
-     * @param \SessionHandlerInterface $handler
+     * @param string  $stream
+     * @param integer $level  The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(\SessionHandlerInterface $handler)
+    public function __construct($stream, $level = Logger::DEBUG, $bubble = true)
     {
-        $this->handler = $handler;
-        $this->wrapper = ($handler instanceof \SessionHandler);
-        $this->saveHandlerName = $this->wrapper ? ini_get('session.save_handler') : 'user';
-    }
-
-    // \SessionHandlerInterface
-
-    /**
-     * {@inheritdoc}
-     */
-    public function open($savePath, $sessionName)
-    {
-        $return = (bool)$this->handler->open($savePath, $sessionName);
-
-        if (true === $return) {
-            $this->active = true;
+        parent::__construct($level, $bubble);
+        if (is_resource($stream)) {
+            $this->stream = $stream;
+        } else {
+            $this->url = $stream;
         }
-
-        return $return;
     }
 
     /**
@@ -56,40 +45,27 @@ class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterf
      */
     public function close()
     {
-        $this->active = false;
-
-        return (bool) $this->handler->close();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function read($id)
-    {
-        return (string) $this->handler->read($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function write($id, $data)
-    {
-        return (bool) $this->handler->write($id, $data);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function destroy($id)
-    {
-        return (bool) $this->handler->destroy($id);
+        if (is_resource($this->stream)) {
+            fclose($this->stream);
+        }
+        $this->stream = null;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function gc($maxlifetime)
+    protected function write(array $record)
     {
-        return (bool) $this->handler->gc($maxlifetime);
+        if (null === $this->stream) {
+            if (!$this->url) {
+                throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().');
+            }
+            $this->stream = @fopen($this->url, 'a');
+            if (!is_resource($this->stream)) {
+                $this->stream = null;
+                throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened; it may be invalid or not writable.', $this->url));
+            }
+        }
+        fwrite($this->stream, (string) $record['formatted']);
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/Config/FileLocator.php b/core/vendor/Monolog/Handler/SwiftMailerHandler.php
similarity index 15%
copy from core/vendor/Symfony/Component/HttpKernel/Config/FileLocator.php
copy to core/vendor/Monolog/Handler/SwiftMailerHandler.php
index 6cc615c..56bf9a2 100644
--- a/core/vendor/Symfony/Component/HttpKernel/Config/FileLocator.php
+++ b/core/vendor/Monolog/Handler/SwiftMailerHandler.php
@@ -1,54 +1,55 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\Config;
+namespace Monolog\Handler;
 
-use Symfony\Component\Config\FileLocator as BaseFileLocator;
-use Symfony\Component\HttpKernel\KernelInterface;
+use Monolog\Logger;
 
 /**
- * FileLocator uses the KernelInterface to locate resources in bundles.
+ * SwiftMailerHandler uses Swift_Mailer to send the emails
  *
- * @author Fabien Potencier <fabien@symfony.com>
+ * @author Gyula Sallai
  */
-class FileLocator extends BaseFileLocator
+class SwiftMailerHandler extends MailHandler
 {
-    private $kernel;
-    private $path;
+    protected $mailer;
+    protected $message;
 
     /**
-     * Constructor.
-     *
-     * @param KernelInterface $kernel A KernelInterface instance
-     * @param string          $path   The path the global resource directory
-     * @param string|array    $paths A path or an array of paths where to look for resources
+     * @param \Swift_Mailer           $mailer  The mailer to use
+     * @param callback|\Swift_Message $message An example message for real messages, only the body will be replaced
+     * @param integer                 $level   The minimum logging level at which this handler will be triggered
+     * @param Boolean                 $bubble  Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(KernelInterface $kernel, $path = null, array $paths = array())
+    public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true)
     {
-        $this->kernel = $kernel;
-        $this->path = $path;
-        $paths[] = $path;
-
-        parent::__construct($paths);
+        parent::__construct($level, $bubble);
+        $this->mailer  = $mailer;
+        if (!$message instanceof \Swift_Message && is_callable($message)) {
+            $message = call_user_func($message);
+        }
+        if (!$message instanceof \Swift_Message) {
+            throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callback returning it');
+        }
+        $this->message = $message;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function locate($file, $currentPath = null, $first = true)
+    protected function send($content, array $records)
     {
-        if ('@' === $file[0]) {
-            return $this->kernel->locateResource($file, $this->path, $first);
-        }
+        $message = clone $this->message;
+        $message->setBody($content);
 
-        return parent::locate($file, $currentPath, $first);
+        $this->mailer->send($message);
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php b/core/vendor/Monolog/Handler/SyslogHandler.php
similarity index 11%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php
copy to core/vendor/Monolog/Handler/SyslogHandler.php
index 71770dd..ed2fe44 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php
+++ b/core/vendor/Monolog/Handler/SyslogHandler.php
@@ -1,74 +1,95 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+namespace Monolog\Handler;
+
+use Monolog\Logger;
 
 /**
- * MemcachedSessionHandler.
+ * Logs to syslog service.
  *
- * Memcached based session storage handler based on the Memcached class
- * provided by the PHP memcached extension.
+ * usage example:
  *
- * @see http://php.net/memcached
+ *   $log = new Logger('application');
+ *   $syslog = new SyslogHandler('myfacility', 'local6');
+ *   $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%");
+ *   $syslog->setFormatter($formatter);
+ *   $log->pushHandler($syslog);
  *
- * @author Drak <drak@zikula.org>
+ * @author Sven Paulus <sven@karlsruhe.org>
  */
-class MemcachedSessionHandler implements \SessionHandlerInterface
+class SyslogHandler extends AbstractProcessingHandler
 {
     /**
-     * Memcached driver.
-     *
-     * @var \Memcached
+     * Translates Monolog log levels to syslog log priorities.
      */
-    private $memcached;
+    private $logLevels = array(
+        Logger::DEBUG     => LOG_DEBUG,
+        Logger::INFO      => LOG_INFO,
+        Logger::NOTICE    => LOG_NOTICE,
+        Logger::WARNING   => LOG_WARNING,
+        Logger::ERROR     => LOG_ERR,
+        Logger::CRITICAL  => LOG_CRIT,
+        Logger::ALERT     => LOG_ALERT,
+        Logger::EMERGENCY => LOG_EMERG,
+    );
 
     /**
-     * Configuration options.
-     *
-     * @var array
+     * List of valid log facility names.
      */
-    private $memcachedOptions;
+    private $facilities = array(
+        'auth'     => LOG_AUTH,
+        'authpriv' => LOG_AUTHPRIV,
+        'cron'     => LOG_CRON,
+        'daemon'   => LOG_DAEMON,
+        'kern'     => LOG_KERN,
+        'lpr'      => LOG_LPR,
+        'mail'     => LOG_MAIL,
+        'news'     => LOG_NEWS,
+        'syslog'   => LOG_SYSLOG,
+        'user'     => LOG_USER,
+        'uucp'     => LOG_UUCP,
+    );
 
     /**
-     * Constructor.
-     *
-     * @param \Memcached $memcached        A \Memcached instance
-     * @param array      $memcachedOptions An associative array of Memcached options
-     * @param array      $options          Session configuration options.
+     * @param string  $ident
+     * @param mixed   $facility
+     * @param integer $level    The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(\Memcached $memcached, array $memcachedOptions = array(), array $options = array())
+    public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true)
     {
-        $this->memcached = $memcached;
-
-        // defaults
-        if (!isset($memcachedOptions['serverpool'])) {
-            $memcachedOptions['serverpool'][] = array(
-                'host' => '127.0.0.1',
-                'port' => 11211,
-                'weight' => 1);
+        parent::__construct($level, $bubble);
+
+        if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
+            $this->facilities['local0'] = LOG_LOCAL0;
+            $this->facilities['local1'] = LOG_LOCAL1;
+            $this->facilities['local2'] = LOG_LOCAL2;
+            $this->facilities['local3'] = LOG_LOCAL3;
+            $this->facilities['local4'] = LOG_LOCAL4;
+            $this->facilities['local5'] = LOG_LOCAL5;
+            $this->facilities['local6'] = LOG_LOCAL6;
+            $this->facilities['local7'] = LOG_LOCAL7;
         }
 
-        $memcachedOptions['expiretime'] = isset($memcachedOptions['expiretime']) ? (int)$memcachedOptions['expiretime'] : 86400;
-
-        $this->memcached->setOption(\Memcached::OPT_PREFIX_KEY, isset($memcachedOptions['prefix']) ? $memcachedOptions['prefix'] : 'sf2s');
-
-        $this->memcachedOptions = $memcachedOptions;
-    }
+        // convert textual description of facility to syslog constant
+        if (array_key_exists(strtolower($facility), $this->facilities)) {
+            $facility = $this->facilities[strtolower($facility)];
+        } elseif (!in_array($facility, array_values($this->facilities), true)) {
+            throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given');
+        }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function open($savePath, $sessionName)
-    {
-        return $this->memcached->addServers($this->memcachedOptions['serverpool']);
+        if (!openlog($ident, LOG_PID, $facility)) {
+            throw new \LogicException('Can\'t open syslog for ident "'.$ident.'" and facility "'.$facility.'"');
+        }
     }
 
     /**
@@ -76,55 +97,14 @@ class MemcachedSessionHandler implements \SessionHandlerInterface
      */
     public function close()
     {
-        return true;
+        closelog();
     }
 
     /**
      * {@inheritdoc}
      */
-    public function read($sessionId)
+    protected function write(array $record)
     {
-        return $this->memcached->get($sessionId) ?: '';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function write($sessionId, $data)
-    {
-        return $this->memcached->set($sessionId, $data, $this->memcachedOptions['expiretime']);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function destroy($sessionId)
-    {
-        return $this->memcached->delete($sessionId);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function gc($lifetime)
-    {
-        // not required here because memcached will auto expire the records anyhow.
-        return true;
-    }
-
-    /**
-     * Adds a server to the memcached handler.
-     *
-     * @param array $server
-     */
-    protected function addServer(array $server)
-    {
-        if (array_key_exists('host', $server)) {
-            throw new \InvalidArgumentException('host key must be set');
-        }
-        $server['port'] = isset($server['port']) ? (int)$server['port'] : 11211;
-        $server['timeout'] = isset($server['timeout']) ? (int)$server['timeout'] : 1;
-        $server['presistent'] = isset($server['presistent']) ? (bool)$server['presistent'] : false;
-        $server['weight'] = isset($server['weight']) ? (bool)$server['weight'] : 1;
+        syslog($this->logLevels[$record['level']], (string) $record['formatted']);
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php b/core/vendor/Monolog/Handler/TestHandler.php
similarity index 13%
copy from core/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php
copy to core/vendor/Monolog/Handler/TestHandler.php
index 2f1a422..085d9e1 100644
--- a/core/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php
+++ b/core/vendor/Monolog/Handler/TestHandler.php
@@ -1,157 +1,140 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpFoundation\Session\Attribute;
+namespace Monolog\Handler;
+
+use Monolog\Logger;
 
 /**
- * This class relates to session attribute storage
+ * Used for testing purposes.
+ *
+ * It records all records and gives you access to them for verification.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable
+class TestHandler extends AbstractProcessingHandler
 {
-    private $name = 'attributes';
+    protected $records = array();
+    protected $recordsByLevel = array();
 
-    /**
-     * @var string
-     */
-    private $storageKey;
+    public function getRecords()
+    {
+        return $this->records;
+    }
 
-    /**
-     * @var array
-     */
-    protected $attributes = array();
+    public function hasEmergency($record)
+    {
+        return $this->hasRecord($record, Logger::EMERGENCY);
+    }
 
-    /**
-     * Constructor.
-     *
-     * @param string $storageKey The key used to store flashes in the session.
-     */
-    public function __construct($storageKey = '_sf2_attributes')
+    public function hasAlert($record)
     {
-        $this->storageKey = $storageKey;
+        return $this->hasRecord($record, Logger::ALERT);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getName()
+    public function hasCritical($record)
     {
-        return $this->name;
+        return $this->hasRecord($record, Logger::CRITICAL);
     }
 
-    public function setName($name)
+    public function hasError($record)
     {
-        $this->name = $name;
+        return $this->hasRecord($record, Logger::ERROR);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function initialize(array &$attributes)
+    public function hasWarning($record)
     {
-        $this->attributes = &$attributes;
+        return $this->hasRecord($record, Logger::WARNING);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getStorageKey()
+    public function hasNotice($record)
     {
-        return $this->storageKey;
+        return $this->hasRecord($record, Logger::NOTICE);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function has($name)
+    public function hasInfo($record)
     {
-        return array_key_exists($name, $this->attributes);
+        return $this->hasRecord($record, Logger::INFO);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function get($name, $default = null)
+    public function hasDebug($record)
     {
-        return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
+        return $this->hasRecord($record, Logger::DEBUG);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function set($name, $value)
+    public function hasEmergencyRecords()
     {
-        $this->attributes[$name] = $value;
+        return isset($this->recordsByLevel[Logger::EMERGENCY]);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function all()
+    public function hasAlertRecords()
     {
-        return $this->attributes;
+        return isset($this->recordsByLevel[Logger::ALERT]);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function replace(array $attributes)
+    public function hasCriticalRecords()
     {
-        $this->attributes = array();
-        foreach ($attributes as $key => $value) {
-            $this->set($key, $value);
-        }
+        return isset($this->recordsByLevel[Logger::CRITICAL]);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function remove($name)
+    public function hasErrorRecords()
     {
-        $retval = null;
-        if (array_key_exists($name, $this->attributes)) {
-            $retval = $this->attributes[$name];
-            unset($this->attributes[$name]);
-        }
+        return isset($this->recordsByLevel[Logger::ERROR]);
+    }
 
-        return $retval;
+    public function hasWarningRecords()
+    {
+        return isset($this->recordsByLevel[Logger::WARNING]);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function clear()
+    public function hasNoticeRecords()
     {
-        $return = $this->attributes;
-        $this->attributes = array();
+        return isset($this->recordsByLevel[Logger::NOTICE]);
+    }
 
-        return $return;
+    public function hasInfoRecords()
+    {
+        return isset($this->recordsByLevel[Logger::INFO]);
     }
 
-    /**
-     * Returns an iterator for attributes.
-     *
-     * @return \ArrayIterator An \ArrayIterator instance
-     */
-    public function getIterator()
+    public function hasDebugRecords()
     {
-        return new \ArrayIterator($this->attributes);
+        return isset($this->recordsByLevel[Logger::DEBUG]);
+    }
+
+    protected function hasRecord($record, $level)
+    {
+        if (!isset($this->recordsByLevel[$level])) {
+            return false;
+        }
+
+        if (is_array($record)) {
+            $record = $record['message'];
+        }
+
+        foreach ($this->recordsByLevel[$level] as $rec) {
+            if ($rec['message'] === $record) {
+                return true;
+            }
+        }
+
+        return false;
     }
 
     /**
-     * Returns the number of attributes.
-     *
-     * @return int The number of attributes
+     * {@inheritdoc}
      */
-    public function count()
+    protected function write(array $record)
     {
-        return count($this->attributes);
+        $this->recordsByLevel[$record['level']][] = $record;
+        $this->records[] = $record;
     }
 }
diff --git a/core/vendor/Symfony/Component/DependencyInjection/Definition.php b/core/vendor/Monolog/Logger.php
similarity index 11%
copy from core/vendor/Symfony/Component/DependencyInjection/Definition.php
copy to core/vendor/Monolog/Logger.php
index 1c974a6..8e6c9df 100644
--- a/core/vendor/Symfony/Component/DependencyInjection/Definition.php
+++ b/core/vendor/Monolog/Logger.php
@@ -1,655 +1,457 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\DependencyInjection;
+namespace Monolog;
 
-use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
-use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;
+use Monolog\Handler\HandlerInterface;
+use Monolog\Handler\StreamHandler;
 
 /**
- * Definition represents a service definition.
+ * Monolog log channel
  *
- * @author Fabien Potencier <fabien@symfony.com>
+ * It contains a stack of Handlers and a stack of Processors,
+ * and uses them to store records that are added to it.
  *
- * @api
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class Definition
+class Logger
 {
-    private $class;
-    private $file;
-    private $factoryClass;
-    private $factoryMethod;
-    private $factoryService;
-    private $scope;
-    private $properties;
-    private $calls;
-    private $configurator;
-    private $tags;
-    private $public;
-    private $synthetic;
-    private $abstract;
-
-    protected $arguments;
-
     /**
-     * Constructor.
-     *
-     * @param string $class     The service class
-     * @param array  $arguments An array of arguments to pass to the service constructor
-     *
-     * @api
+     * Detailed debug information
      */
-    public function __construct($class = null, array $arguments = array())
-    {
-        $this->class = $class;
-        $this->arguments = $arguments;
-        $this->calls = array();
-        $this->scope = ContainerInterface::SCOPE_CONTAINER;
-        $this->tags = array();
-        $this->public = true;
-        $this->synthetic = false;
-        $this->abstract = false;
-        $this->properties = array();
-    }
+    const DEBUG = 100;
 
     /**
-     * Sets the name of the class that acts as a factory using the factory method,
-     * which will be invoked statically.
-     *
-     * @param  string $factoryClass The factory class name
-     *
-     * @return Definition The current instance
+     * Interesting events
      *
-     * @api
+     * Examples: User logs in, SQL logs.
      */
-    public function setFactoryClass($factoryClass)
-    {
-        $this->factoryClass = $factoryClass;
-
-        return $this;
-    }
+    const INFO = 200;
 
     /**
-     * Gets the factory class.
-     *
-     * @return string The factory class name
-     *
-     * @api
+     * Uncommon events
      */
-    public function getFactoryClass()
-    {
-        return $this->factoryClass;
-    }
+    const NOTICE = 250;
 
     /**
-     * Sets the factory method able to create an instance of this class.
+     * Exceptional occurrences that are not errors
      *
-     * @param  string $factoryMethod The factory method name
-     *
-     * @return Definition The current instance
-     *
-     * @api
+     * Examples: Use of deprecated APIs, poor use of an API,
+     * undesirable things that are not necessarily wrong.
      */
-    public function setFactoryMethod($factoryMethod)
-    {
-        $this->factoryMethod = $factoryMethod;
-
-        return $this;
-    }
+    const WARNING = 300;
 
     /**
-     * Gets the factory method.
-     *
-     * @return string The factory method name
-     *
-     * @api
+     * Runtime errors
      */
-    public function getFactoryMethod()
-    {
-        return $this->factoryMethod;
-    }
+    const ERROR = 400;
 
     /**
-     * Sets the name of the service that acts as a factory using the factory method.
-     *
-     * @param string $factoryService The factory service id
+     * Critical conditions
      *
-     * @return Definition The current instance
-     *
-     * @api
+     * Example: Application component unavailable, unexpected exception.
      */
-    public function setFactoryService($factoryService)
-    {
-        $this->factoryService = $factoryService;
-
-        return $this;
-    }
+    const CRITICAL = 500;
 
     /**
-     * Gets the factory service id.
-     *
-     * @return string The factory service id
+     * Action must be taken immediately
      *
-     * @api
+     * Example: Entire website down, database unavailable, etc.
+     * This should trigger the SMS alerts and wake you up.
      */
-    public function getFactoryService()
-    {
-        return $this->factoryService;
-    }
+    const ALERT = 550;
 
     /**
-     * Sets the service class.
-     *
-     * @param  string $class The service class
-     *
-     * @return Definition The current instance
-     *
-     * @api
+     * Urgent alert.
      */
-    public function setClass($class)
-    {
-        $this->class = $class;
+    const EMERGENCY = 600;
 
-        return $this;
-    }
+    protected static $levels = array(
+        100 => 'DEBUG',
+        200 => 'INFO',
+        250 => 'NOTICE',
+        300 => 'WARNING',
+        400 => 'ERROR',
+        500 => 'CRITICAL',
+        550 => 'ALERT',
+        600 => 'EMERGENCY',
+    );
 
-    /**
-     * Gets the service class.
-     *
-     * @return string The service class
-     *
-     * @api
-     */
-    public function getClass()
-    {
-        return $this->class;
-    }
+    protected $name;
 
     /**
-     * Sets the arguments to pass to the service constructor/factory method.
-     *
-     * @param  array $arguments An array of arguments
+     * The handler stack
      *
-     * @return Definition The current instance
-     *
-     * @api
+     * @var array of Monolog\Handler\HandlerInterface
      */
-    public function setArguments(array $arguments)
-    {
-        $this->arguments = $arguments;
+    protected $handlers = array();
 
-        return $this;
-    }
+    protected $processors = array();
 
     /**
-     * @api
+     * @param string $name The logging channel
      */
-    public function setProperties(array $properties)
+    public function __construct($name)
     {
-        $this->properties = $properties;
-
-        return $this;
+        $this->name = $name;
     }
 
     /**
-     * @api
-     */
-    public function getProperties()
-    {
-        return $this->properties;
-    }
-
-    /**
-     * @api
+     * @return string
      */
-    public function setProperty($name, $value)
+    public function getName()
     {
-        $this->properties[$name] = $value;
-
-        return $this;
+        return $this->name;
     }
 
     /**
-     * Adds an argument to pass to the service constructor/factory method.
-     *
-     * @param  mixed $argument An argument
+     * Pushes a handler on to the stack.
      *
-     * @return Definition The current instance
-     *
-     * @api
+     * @param HandlerInterface $handler
      */
-    public function addArgument($argument)
+    public function pushHandler(HandlerInterface $handler)
     {
-        $this->arguments[] = $argument;
-
-        return $this;
+        array_unshift($this->handlers, $handler);
     }
 
     /**
-     * Sets a specific argument
+     * Pops a handler from the stack
      *
-     * @param integer $index
-     * @param mixed $argument
-     *
-     * @return Definition The current instance
-     *
-     * @api
+     * @return HandlerInterface
      */
-    public function replaceArgument($index, $argument)
+    public function popHandler()
     {
-        if ($index < 0 || $index > count($this->arguments) - 1) {
-            throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, count($this->arguments) - 1));
+        if (!$this->handlers) {
+            throw new \LogicException('You tried to pop from an empty handler stack.');
         }
 
-        $this->arguments[$index] = $argument;
-
-        return $this;
+        return array_shift($this->handlers);
     }
 
     /**
-     * Gets the arguments to pass to the service constructor/factory method.
+     * Adds a processor on to the stack.
      *
-     * @return array The array of arguments
-     *
-     * @api
+     * @param callable $callback
      */
-    public function getArguments()
+    public function pushProcessor($callback)
     {
-        return $this->arguments;
-    }
-
-    /**
-     * Gets an argument to pass to the service constructor/factory method.
-     *
-     * @param integer $index
-     *
-     * @return mixed The argument value
-     *
-     * @api
-     */
-    public function getArgument($index)
-    {
-        if ($index < 0 || $index > count($this->arguments) - 1) {
-            throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, count($this->arguments) - 1));
+        if (!is_callable($callback)) {
+            throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');
         }
-
-        return $this->arguments[$index];
+        array_unshift($this->processors, $callback);
     }
 
     /**
-     * Sets the methods to call after service initialization.
-     *
-     * @param  array $calls An array of method calls
-     *
-     * @return Definition The current instance
+     * Removes the processor on top of the stack and returns it.
      *
-     * @api
+     * @return callable
      */
-    public function setMethodCalls(array $calls = array())
+    public function popProcessor()
     {
-        $this->calls = array();
-        foreach ($calls as $call) {
-            $this->addMethodCall($call[0], $call[1]);
+        if (!$this->processors) {
+            throw new \LogicException('You tried to pop from an empty processor stack.');
         }
 
-        return $this;
+        return array_shift($this->processors);
     }
 
     /**
-     * Adds a method to call after service initialization.
+     * Adds a log record.
      *
-     * @param  string $method    The method name to call
-     * @param  array  $arguments An array of arguments to pass to the method call
-     *
-     * @return Definition The current instance
-     *
-     * @throws InvalidArgumentException on empty $method param
-     *
-     * @api
+     * @param  integer $level   The logging level
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function addMethodCall($method, array $arguments = array())
+    public function addRecord($level, $message, array $context = array())
     {
-        if (empty($method)) {
-            throw new InvalidArgumentException(sprintf('Method name cannot be empty.'));
+        if (!$this->handlers) {
+            $this->pushHandler(new StreamHandler('php://stderr', self::DEBUG));
         }
-        $this->calls[] = array($method, $arguments);
-
-        return $this;
-    }
-
-    /**
-     * Removes a method to call after service initialization.
-     *
-     * @param  string $method    The method name to remove
-     *
-     * @return Definition The current instance
-     *
-     * @api
-     */
-    public function removeMethodCall($method)
-    {
-        foreach ($this->calls as $i => $call) {
-            if ($call[0] === $method) {
-                unset($this->calls[$i]);
+        $record = array(
+            'message' => (string) $message,
+            'context' => $context,
+            'level' => $level,
+            'level_name' => self::getLevelName($level),
+            'channel' => $this->name,
+            'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))),
+            'extra' => array(),
+        );
+        // check if any message will handle this message
+        $handlerKey = null;
+        foreach ($this->handlers as $key => $handler) {
+            if ($handler->isHandling($record)) {
+                $handlerKey = $key;
                 break;
             }
         }
-
-        return $this;
-    }
-
-    /**
-     * Check if the current definition has a given method to call after service initialization.
-     *
-     * @param  string $method    The method name to search for
-     *
-     * @return Boolean
-     *
-     * @api
-     */
-    public function hasMethodCall($method)
-    {
-        foreach ($this->calls as $call) {
-            if ($call[0] === $method) {
-                return true;
-            }
+        // none found
+        if (null === $handlerKey) {
+            return false;
+        }
+        // found at least one, process message and dispatch it
+        foreach ($this->processors as $processor) {
+            $record = call_user_func($processor, $record);
+        }
+        while (isset($this->handlers[$handlerKey]) &&
+            false === $this->handlers[$handlerKey]->handle($record)) {
+            $handlerKey++;
         }
 
-        return false;
+        return true;
     }
 
     /**
-     * Gets the methods to call after service initialization.
+     * Adds a log record at the DEBUG level.
      *
-     * @return  array An array of method calls
-     *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function getMethodCalls()
+    public function addDebug($message, array $context = array())
     {
-        return $this->calls;
+        return $this->addRecord(self::DEBUG, $message, $context);
     }
 
     /**
-     * Sets tags for this definition
-     *
-     * @param array $tags
+     * Adds a log record at the INFO level.
      *
-     * @return Definition the current instance
-     *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function setTags(array $tags)
+    public function addInfo($message, array $context = array())
     {
-        $this->tags = $tags;
-
-        return $this;
+        return $this->addRecord(self::INFO, $message, $context);
     }
 
     /**
-     * Returns all tags.
-     *
-     * @return array An array of tags
+     * Adds a log record at the NOTICE level.
      *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function getTags()
+    public function addNotice($message, array $context = array())
     {
-        return $this->tags;
+        return $this->addRecord(self::NOTICE, $message, $context);
     }
 
     /**
-     * Gets a tag by name.
-     *
-     * @param  string $name The tag name
-     *
-     * @return array An array of attributes
+     * Adds a log record at the WARNING level.
      *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function getTag($name)
+    public function addWarning($message, array $context = array())
     {
-        return isset($this->tags[$name]) ? $this->tags[$name] : array();
+        return $this->addRecord(self::WARNING, $message, $context);
     }
 
     /**
-     * Adds a tag for this definition.
+     * Adds a log record at the ERROR level.
      *
-     * @param  string $name       The tag name
-     * @param  array  $attributes An array of attributes
-     *
-     * @return Definition The current instance
-     *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function addTag($name, array $attributes = array())
+    public function addError($message, array $context = array())
     {
-        $this->tags[$name][] = $attributes;
-
-        return $this;
+        return $this->addRecord(self::ERROR, $message, $context);
     }
 
     /**
-     * Whether this definition has a tag with the given name
+     * Adds a log record at the CRITICAL level.
      *
-     * @param string $name
-     *
-     * @return Boolean
-     *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function hasTag($name)
+    public function addCritical($message, array $context = array())
     {
-        return isset($this->tags[$name]);
+        return $this->addRecord(self::CRITICAL, $message, $context);
     }
 
     /**
-     * Clears all tags for a given name.
-     *
-     * @param string $name The tag name
+     * Adds a log record at the ALERT level.
      *
-     * @return Definition
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function clearTag($name)
+    public function addAlert($message, array $context = array())
     {
-        if (isset($this->tags[$name])) {
-            unset($this->tags[$name]);
-        }
-
-        return $this;
+        return $this->addRecord(self::ALERT, $message, $context);
     }
 
     /**
-     * Clears the tags for this definition.
+     * Adds a log record at the EMERGENCY level.
      *
-     * @return Definition The current instance
-     *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function clearTags()
+    public function addEmergency($message, array $context = array())
     {
-        $this->tags = array();
-
-        return $this;
+      return $this->addRecord(self::EMERGENCY, $message, $context);
     }
 
     /**
-     * Sets a file to require before creating the service.
-     *
-     * @param  string $file A full pathname to include
+     * Gets the name of the logging level.
      *
-     * @return Definition The current instance
-     *
-     * @api
-     */
-    public function setFile($file)
-    {
-        $this->file = $file;
-
-        return $this;
-    }
-
-    /**
-     * Gets the file to require before creating the service.
-     *
-     * @return string The full pathname to include
-     *
-     * @api
+     * @param  integer $level
+     * @return string
      */
-    public function getFile()
+    public static function getLevelName($level)
     {
-        return $this->file;
+        return self::$levels[$level];
     }
 
     /**
-     * Sets the scope of the service
-     *
-     * @param  string $scope Whether the service must be shared or not
-     *
-     * @return Definition The current instance
+     * Checks whether the Logger has a handler that listens on the given level
      *
-     * @api
+     * @param  integer $level
+     * @return Boolean
      */
-    public function setScope($scope)
+    public function isHandling($level)
     {
-        $this->scope = $scope;
+        $record = array(
+            'message' => '',
+            'context' => array(),
+            'level' => $level,
+            'level_name' => self::getLevelName($level),
+            'channel' => $this->name,
+            'datetime' => new \DateTime(),
+            'extra' => array(),
+        );
 
-        return $this;
-    }
+        foreach ($this->handlers as $key => $handler) {
+            if ($handler->isHandling($record)) {
+                return true;
+            }
+        }
 
-    /**
-     * Returns the scope of the service
-     *
-     * @return string
-     *
-     * @api
-     */
-    public function getScope()
-    {
-        return $this->scope;
+        return false;
     }
 
     /**
-     * Sets the visibility of this service.
+     * Adds a log record at the DEBUG level.
      *
-     * @param Boolean $boolean
+     * This method allows for compatibility with common interfaces.
      *
-     * @return Definition The current instance
-     *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function setPublic($boolean)
+    public function debug($message, array $context = array())
     {
-        $this->public = (Boolean) $boolean;
-
-        return $this;
+        return $this->addRecord(self::DEBUG, $message, $context);
     }
 
     /**
-     * Whether this service is public facing
+     * Adds a log record at the INFO level.
      *
-     * @return Boolean
+     * This method allows for compatibility with common interfaces.
      *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function isPublic()
+    public function info($message, array $context = array())
     {
-        return $this->public;
+        return $this->addRecord(self::INFO, $message, $context);
     }
 
     /**
-     * Sets whether this definition is synthetic, that is not constructed by the
-     * container, but dynamically injected.
-     *
-     * @param Boolean $boolean
+     * Adds a log record at the INFO level.
      *
-     * @return Definition the current instance
+     * This method allows for compatibility with common interfaces.
      *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function setSynthetic($boolean)
+    public function notice($message, array $context = array())
     {
-        $this->synthetic = (Boolean) $boolean;
-
-        return $this;
+        return $this->addRecord(self::NOTICE, $message, $context);
     }
 
     /**
-     * Whether this definition is synthetic, that is not constructed by the
-     * container, but dynamically injected.
+     * Adds a log record at the WARNING level.
      *
-     * @return Boolean
+     * This method allows for compatibility with common interfaces.
      *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function isSynthetic()
+    public function warn($message, array $context = array())
     {
-        return $this->synthetic;
+        return $this->addRecord(self::WARNING, $message, $context);
     }
 
     /**
-     * Whether this definition is abstract, that means it merely serves as a
-     * template for other definitions.
-     *
-     * @param Boolean $boolean
+     * Adds a log record at the ERROR level.
      *
-     * @return Definition the current instance
+     * This method allows for compatibility with common interfaces.
      *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function setAbstract($boolean)
+    public function err($message, array $context = array())
     {
-        $this->abstract = (Boolean) $boolean;
-
-        return $this;
+        return $this->addRecord(self::ERROR, $message, $context);
     }
 
     /**
-     * Whether this definition is abstract, that means it merely serves as a
-     * template for other definitions.
+     * Adds a log record at the CRITICAL level.
      *
-     * @return Boolean
+     * This method allows for compatibility with common interfaces.
      *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function isAbstract()
+    public function crit($message, array $context = array())
     {
-        return $this->abstract;
+        return $this->addRecord(self::CRITICAL, $message, $context);
     }
 
     /**
-     * Sets a configurator to call after the service is fully initialized.
+     * Adds a log record at the ALERT level.
      *
-     * @param  mixed $callable A PHP callable
+     * This method allows for compatibility with common interfaces.
      *
-     * @return Definition The current instance
-     *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function setConfigurator($callable)
+    public function alert($message, array $context = array())
     {
-        $this->configurator = $callable;
-
-        return $this;
+        return $this->addRecord(self::ALERT, $message, $context);
     }
 
     /**
-     * Gets the configurator to call after the service is fully initialized.
+     * Adds a log record at the EMERGENCY level.
      *
-     * @return mixed The PHP callable to call
+     * This method allows for compatibility with common interfaces.
      *
-     * @api
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
      */
-    public function getConfigurator()
+    public function emerg($message, array $context = array())
     {
-        return $this->configurator;
+        return $this->addRecord(self::EMERGENCY, $message, $context);
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php b/core/vendor/Monolog/Processor/IntrospectionProcessor.php
similarity index 13%
copy from core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php
copy to core/vendor/Monolog/Processor/IntrospectionProcessor.php
index 6848f78..b126218 100644
--- a/core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php
+++ b/core/vendor/Monolog/Processor/IntrospectionProcessor.php
@@ -1,72 +1,58 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\Event;
-
-use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\EventDispatcher\Event;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
+namespace Monolog\Processor;
 
 /**
- * Allows to execute logic after a response was sent
+ * Injects line/file:class/function where the log message came from
+ *
+ * Warning: This only works if the handler processes the logs directly.
+ * If you put the processor on a handler that is behind a FingersCrossedHandler
+ * for example, the processor will only be called once the trigger level is reached,
+ * and all the log records will have the same file/line/.. data from the call that
+ * triggered the FingersCrossedHandler.
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class PostResponseEvent extends Event
+class IntrospectionProcessor
 {
     /**
-     * The kernel in which this event was thrown
-     * @var HttpKernelInterface
-     */
-    private $kernel;
-
-    private $request;
-
-    private $response;
-
-    public function __construct(HttpKernelInterface $kernel, Request $request, Response $response)
-    {
-        $this->kernel = $kernel;
-        $this->request = $request;
-        $this->response = $response;
-    }
-
-    /**
-     * Returns the kernel in which this event was thrown.
-     *
-     * @return HttpKernelInterface
-     */
-    public function getKernel()
-    {
-        return $this->kernel;
-    }
-
-    /**
-     * Returns the request for which this event was thrown.
-     *
-     * @return Request
-     */
-    public function getRequest()
-    {
-        return $this->request;
-    }
-
-    /**
-     * Returns the reponse for which this event was thrown.
-     *
-     * @return Response
+     * @param  array $record
+     * @return array
      */
-    public function getResponse()
+    public function __invoke(array $record)
     {
-        return $this->response;
+        $trace = debug_backtrace();
+
+        // skip first since it's always the current method
+        array_shift($trace);
+        // the call_user_func call is also skipped
+        array_shift($trace);
+
+        $i = 0;
+        while (isset($trace[$i]['class']) && false !== strpos($trace[$i]['class'], 'Monolog\\')) {
+            $i++;
+        }
+
+        // we should have the call source now
+        $record['extra'] = array_merge(
+            $record['extra'],
+            array(
+                'file'      => isset($trace[$i-1]['file']) ? $trace[$i-1]['file'] : null,
+                'line'      => isset($trace[$i-1]['line']) ? $trace[$i-1]['line'] : null,
+                'class'     => isset($trace[$i]['class']) ? $trace[$i]['class'] : null,
+                'function'  => isset($trace[$i]['function']) ? $trace[$i]['function'] : null,
+            )
+        );
+
+        return $record;
     }
 }
diff --git a/core/vendor/Symfony/Component/DependencyInjection/Parameter.php b/core/vendor/Monolog/Processor/MemoryPeakUsageProcessor.php
similarity index 21%
copy from core/vendor/Symfony/Component/DependencyInjection/Parameter.php
copy to core/vendor/Monolog/Processor/MemoryPeakUsageProcessor.php
index 7ba8c3a..e48672b 100644
--- a/core/vendor/Symfony/Component/DependencyInjection/Parameter.php
+++ b/core/vendor/Monolog/Processor/MemoryPeakUsageProcessor.php
@@ -1,44 +1,40 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\DependencyInjection;
+namespace Monolog\Processor;
 
 /**
- * Parameter represents a parameter reference.
+ * Injects memory_get_peak_usage in all records
  *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
+ * @see Monolog\Processor\MemoryProcessor::__construct() for options
+ * @author Rob Jensen
  */
-class Parameter
+class MemoryPeakUsageProcessor extends MemoryProcessor
 {
-    private $id;
-
     /**
-     * Constructor.
-     *
-     * @param string $id The parameter key
+     * @param  array $record
+     * @return array
      */
-    public function __construct($id)
+    public function __invoke(array $record)
     {
-        $this->id = $id;
-    }
+        $bytes = memory_get_peak_usage($this->realUsage);
+        $formatted = self::formatBytes($bytes);
 
-    /**
-     * __toString.
-     *
-     * @return string The parameter key
-     */
-    public function __toString()
-    {
-        return (string) $this->id;
+        $record['extra'] = array_merge(
+            $record['extra'],
+            array(
+                'memory_peak_usage' => $formatted,
+            )
+        );
+
+        return $record;
     }
 }
diff --git a/core/vendor/Symfony/Component/DependencyInjection/Variable.php b/core/vendor/Monolog/Processor/MemoryProcessor.php
similarity index 24%
copy from core/vendor/Symfony/Component/DependencyInjection/Variable.php
copy to core/vendor/Monolog/Processor/MemoryProcessor.php
index c84b8fd..7551043 100644
--- a/core/vendor/Symfony/Component/DependencyInjection/Variable.php
+++ b/core/vendor/Monolog/Processor/MemoryProcessor.php
@@ -1,50 +1,50 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\DependencyInjection;
+namespace Monolog\Processor;
 
 /**
- * Represents a variable.
+ * Some methods that are common for all memory processors
  *
- *     $var = new Variable('a');
- *
- * will be dumped as
- *
- *     $a
- *
- * by the PHP dumper.
- *
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ * @author Rob Jensen
  */
-class Variable
+abstract class MemoryProcessor
 {
-    private $name;
+    protected $realUsage;
 
     /**
-     * Constructor
-     *
-     * @param string $name
+     * @param boolean $realUsage
      */
-    public function __construct($name)
+    public function __construct($realUsage = true)
     {
-        $this->name = $name;
+        $this->realUsage = (boolean) $realUsage;
     }
 
     /**
-     * Converts the object to a string
+     * Formats bytes into a human readable string
      *
+     * @param  int    $bytes
      * @return string
      */
-    public function __toString()
+    protected static function formatBytes($bytes)
     {
-        return $this->name;
+        $bytes = (int) $bytes;
+
+        if ($bytes > 1024*1024) {
+            return round($bytes/1024/1024, 2).' MB';
+        } elseif ($bytes > 1024) {
+            return round($bytes/1024, 2).' KB';
+        }
+
+        return $bytes . ' B';
     }
+
 }
diff --git a/core/vendor/Symfony/Component/DependencyInjection/Parameter.php b/core/vendor/Monolog/Processor/MemoryUsageProcessor.php
similarity index 22%
copy from core/vendor/Symfony/Component/DependencyInjection/Parameter.php
copy to core/vendor/Monolog/Processor/MemoryUsageProcessor.php
index 7ba8c3a..2c4a807 100644
--- a/core/vendor/Symfony/Component/DependencyInjection/Parameter.php
+++ b/core/vendor/Monolog/Processor/MemoryUsageProcessor.php
@@ -1,44 +1,40 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\DependencyInjection;
+namespace Monolog\Processor;
 
 /**
- * Parameter represents a parameter reference.
+ * Injects memory_get_usage in all records
  *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
+ * @see Monolog\Processor\MemoryProcessor::__construct() for options
+ * @author Rob Jensen
  */
-class Parameter
+class MemoryUsageProcessor extends MemoryProcessor
 {
-    private $id;
-
     /**
-     * Constructor.
-     *
-     * @param string $id The parameter key
+     * @param  array $record
+     * @return array
      */
-    public function __construct($id)
+    public function __invoke(array $record)
     {
-        $this->id = $id;
-    }
+        $bytes = memory_get_usage($this->realUsage);
+        $formatted = self::formatBytes($bytes);
 
-    /**
-     * __toString.
-     *
-     * @return string The parameter key
-     */
-    public function __toString()
-    {
-        return (string) $this->id;
+        $record['extra'] = array_merge(
+            $record['extra'],
+            array(
+                'memory_usage' => $formatted,
+            )
+        );
+
+        return $record;
     }
 }
diff --git a/core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php b/core/vendor/Monolog/Processor/WebProcessor.php
similarity index 14%
copy from core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php
copy to core/vendor/Monolog/Processor/WebProcessor.php
index 6848f78..e297c23 100644
--- a/core/vendor/Symfony/Component/HttpKernel/Event/PostResponseEvent.php
+++ b/core/vendor/Monolog/Processor/WebProcessor.php
@@ -1,72 +1,66 @@
 <?php
 
 /*
- * This file is part of the Symfony package.
+ * This file is part of the Monolog package.
  *
- * (c) Fabien Potencier <fabien@symfony.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\HttpKernel\Event;
-
-use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\EventDispatcher\Event;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
+namespace Monolog\Processor;
 
 /**
- * Allows to execute logic after a response was sent
+ * Injects url/method and remote IP of the current web request in all records
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class PostResponseEvent extends Event
+class WebProcessor
 {
-    /**
-     * The kernel in which this event was thrown
-     * @var HttpKernelInterface
-     */
-    private $kernel;
-
-    private $request;
-
-    private $response;
-
-    public function __construct(HttpKernelInterface $kernel, Request $request, Response $response)
-    {
-        $this->kernel = $kernel;
-        $this->request = $request;
-        $this->response = $response;
-    }
+    protected $serverData;
 
     /**
-     * Returns the kernel in which this event was thrown.
-     *
-     * @return HttpKernelInterface
+     * @param mixed $serverData array or object w/ ArrayAccess that provides access to the $_SERVER data
      */
-    public function getKernel()
+    public function __construct($serverData = null)
     {
-        return $this->kernel;
+        if (null === $serverData) {
+            $this->serverData =& $_SERVER;
+        } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) {
+            $this->serverData = $serverData;
+        } else {
+            throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.');
+        }
     }
 
     /**
-     * Returns the request for which this event was thrown.
-     *
-     * @return Request
+     * @param  array $record
+     * @return array
      */
-    public function getRequest()
+    public function __invoke(array $record)
     {
-        return $this->request;
-    }
+        // skip processing if for some reason request data
+        // is not present (CLI or wonky SAPIs)
+        if (!isset($this->serverData['REQUEST_URI'])) {
+            return $record;
+        }
 
-    /**
-     * Returns the reponse for which this event was thrown.
-     *
-     * @return Response
-     */
-    public function getResponse()
-    {
-        return $this->response;
+        if (!isset($this->serverData['HTTP_REFERER'])) {
+            $this->serverData['HTTP_REFERER'] = null;
+        }
+
+        $record['extra'] = array_merge(
+            $record['extra'],
+            array(
+                'url'         => $this->serverData['REQUEST_URI'],
+                'ip'          => $this->serverData['REMOTE_ADDR'],
+                'http_method' => $this->serverData['REQUEST_METHOD'],
+                'server'      => $this->serverData['SERVER_NAME'],
+                'referrer'    => $this->serverData['HTTP_REFERER'],
+            )
+        );
+
+        return $record;
     }
 }
