diff --git a/schemas/create_mysql b/schemas/create_mysql
index f6e3379..523d48d 100644
--- a/schemas/create_mysql
+++ b/schemas/create_mysql
@@ -21,11 +21,13 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+DROP TABLE IF EXISTS `schema`;
 CREATE TABLE `schema` ( vseq        INT      UNSIGNED NOT NULL,
                       ctime       DATETIME NOT NULL,
                       PRIMARY KEY (vseq));
-INSERT INTO `schema`  (vseq, ctime) VALUES ('107', now());       
+INSERT INTO `schema`  (vseq, ctime) VALUES ('108', now());       
 
+DROP TABLE IF EXISTS event;
 CREATE TABLE event  ( sid 	  INT 	   UNSIGNED NOT NULL,
                       cid 	  INT 	   UNSIGNED NOT NULL,
                       signature   INT      UNSIGNED NOT NULL, 
@@ -34,6 +36,7 @@ CREATE TABLE event  ( sid 	  INT 	   UNSIGNED NOT NULL,
                       INDEX       sig (signature),
                       INDEX       time (timestamp));
 
+DROP TABLE IF EXISTS signature;
 CREATE TABLE signature ( sig_id       INT          UNSIGNED NOT NULL AUTO_INCREMENT,
                          sig_name     VARCHAR(255) NOT NULL,
                          sig_class_id INT          UNSIGNED NOT NULL,
@@ -45,20 +48,24 @@ CREATE TABLE signature ( sig_id       INT          UNSIGNED NOT NULL AUTO_INCREM
                          INDEX   sign_idx (sig_name(20)),
                          INDEX   sig_class_id_idx (sig_class_id));
 
+DROP TABLE IF EXISTS sig_reference;
 CREATE TABLE sig_reference (sig_id  INT    UNSIGNED NOT NULL,
                             ref_seq INT    UNSIGNED NOT NULL,
                             ref_id  INT    UNSIGNED NOT NULL,
                             PRIMARY KEY(sig_id, ref_seq));
 
+DROP TABLE IF EXISTS reference;
 CREATE TABLE reference (  ref_id        INT         UNSIGNED NOT NULL AUTO_INCREMENT,
                           ref_system_id INT         UNSIGNED NOT NULL,
                           ref_tag       TEXT NOT NULL,
                           PRIMARY KEY (ref_id));
 
+DROP TABLE IF EXISTS reference_system;
 CREATE TABLE reference_system ( ref_system_id   INT         UNSIGNED NOT NULL AUTO_INCREMENT,
                                 ref_system_name VARCHAR(20),
                                 PRIMARY KEY (ref_system_id));
 
+DROP TABLE IF EXISTS sig_class;
 CREATE TABLE sig_class ( sig_class_id        INT    UNSIGNED NOT NULL AUTO_INCREMENT,
                          sig_class_name      VARCHAR(60) NOT NULL,
                          PRIMARY KEY (sig_class_id),
@@ -66,6 +73,7 @@ CREATE TABLE sig_class ( sig_class_id        INT    UNSIGNED NOT NULL AUTO_INCRE
                          INDEX       (sig_class_name));
 
 # store info about the sensor supplying data
+DROP TABLE IF EXISTS sensor;
 CREATE TABLE sensor ( sid	  INT 	   UNSIGNED NOT NULL AUTO_INCREMENT,
                       hostname    TEXT,
                       interface   TEXT,
@@ -76,6 +84,7 @@ CREATE TABLE sensor ( sid	  INT 	   UNSIGNED NOT NULL AUTO_INCREMENT,
                       PRIMARY KEY (sid));
 
 # All of the fields of an ip header
+DROP TABLE IF EXISTS iphdr;
 CREATE TABLE iphdr  ( sid 	  INT 	   UNSIGNED NOT NULL,
                       cid 	  INT 	   UNSIGNED NOT NULL,
                       ip_src      INT      UNSIGNED NOT NULL,
@@ -95,6 +104,7 @@ CREATE TABLE iphdr  ( sid 	  INT 	   UNSIGNED NOT NULL,
                       INDEX ip_dst (ip_dst));
 
 # All of the fields of a tcp header
+DROP TABLE IF EXISTS tcphdr;
 CREATE TABLE tcphdr(  sid 	  INT 	   UNSIGNED NOT NULL,
                       cid 	  INT 	   UNSIGNED NOT NULL,
                       tcp_sport   SMALLINT UNSIGNED NOT NULL,
@@ -113,6 +123,7 @@ CREATE TABLE tcphdr(  sid 	  INT 	   UNSIGNED NOT NULL,
                       INDEX       tcp_flags (tcp_flags));
 
 # All of the fields of a udp header
+DROP TABLE IF EXISTS udphdr;
 CREATE TABLE udphdr(  sid 	  INT 	   UNSIGNED NOT NULL,
                       cid 	  INT 	   UNSIGNED NOT NULL,
                       udp_sport   SMALLINT UNSIGNED NOT NULL,
@@ -124,6 +135,7 @@ CREATE TABLE udphdr(  sid 	  INT 	   UNSIGNED NOT NULL,
                       INDEX       udp_dport (udp_dport));
 
 # All of the fields of an icmp header
+DROP TABLE IF EXISTS icmphdr;
 CREATE TABLE icmphdr( sid 	  INT 	   UNSIGNED NOT NULL,
                       cid 	  INT  	   UNSIGNED NOT NULL,
                       icmp_type   TINYINT  UNSIGNED NOT NULL,
@@ -135,6 +147,7 @@ CREATE TABLE icmphdr( sid 	  INT 	   UNSIGNED NOT NULL,
                       INDEX       icmp_type (icmp_type));
 
 # Protocol options
+DROP TABLE IF EXISTS opt;
 CREATE TABLE opt    ( sid         INT      UNSIGNED NOT NULL,
                       cid         INT      UNSIGNED NOT NULL,
                       optid       INT      UNSIGNED NOT NULL,
@@ -145,12 +158,14 @@ CREATE TABLE opt    ( sid         INT      UNSIGNED NOT NULL,
                       PRIMARY KEY (sid,cid,optid));
 
 # Packet payload
+DROP TABLE IF EXISTS data;
 CREATE TABLE data   ( sid           INT      UNSIGNED NOT NULL,
                       cid           INT      UNSIGNED NOT NULL,
                       data_payload  TEXT,
                       PRIMARY KEY (sid,cid));
 
 # encoding is a lookup table for storing encoding types
+DROP TABLE IF EXISTS encoding;
 CREATE TABLE encoding(encoding_type TINYINT UNSIGNED NOT NULL,
                       encoding_text TEXT NOT NULL,
                       PRIMARY KEY (encoding_type));
@@ -159,6 +174,7 @@ INSERT INTO encoding (encoding_type, encoding_text) VALUES (1, 'base64');
 INSERT INTO encoding (encoding_type, encoding_text) VALUES (2, 'ascii');
 
 # detail is a lookup table for storing different detail levels
+DROP TABLE IF EXISTS detail;
 CREATE TABLE detail  (detail_type TINYINT UNSIGNED NOT NULL,
                       detail_text TEXT NOT NULL,
                       PRIMARY KEY (detail_type));
@@ -167,3 +183,13 @@ INSERT INTO detail (detail_type, detail_text) VALUES (1, 'full');
 
 # be sure to also use the snortdb-extra tables if you want
 # mappings for tcp flags, protocols, and ports
+DROP TABLE IF EXISTS extra;
+CREATE TABLE extra (id INT AUTO_INCREMENT NOT NULL,
+		    sid INT(10) NOT NULL,
+		    cid INT(10) NOT NULL,
+                    type INT(10) NOT NULL,
+                    datatype INT(10) NOT NULL,
+		    len INT(10) NOT NULL,
+                    data TEXT NOT NULL,
+                    PRIMARY KEY (id),
+                    KEY `event` (sid,cid));
\ No newline at end of file
diff --git a/src/barnyard2.c b/src/barnyard2.c
index 12e6129..f82e21b 100644
--- a/src/barnyard2.c
+++ b/src/barnyard2.c
@@ -154,6 +154,7 @@ PluginSignalFuncNode *plugin_restart_funcs = NULL;
 InputFuncNode *InputList = NULL;
 OutputFuncNode *AlertList = NULL;   /* Alert function list */
 OutputFuncNode *LogList = NULL;     /* Log function list */
+OutputFuncNode *ExtraList = NULL;     /* Extra function list */
 
 int datalink;   /* the datalink value */
 uint32_t pcap_snaplen = SNAPLEN;
@@ -1142,6 +1143,9 @@ static void Barnyard2Cleanup(int exit_val)
     FreeOutputList(LogList);
     LogList = NULL;
 
+    FreeOutputList(ExtraList);
+    ExtraList = NULL;
+
     /* Global lists */
     ParserCleanup();
 
diff --git a/src/output-plugins/spo_alert_full.c b/src/output-plugins/spo_alert_full.c
index d297d8d..d7e88fa 100644
--- a/src/output-plugins/spo_alert_full.c
+++ b/src/output-plugins/spo_alert_full.c
@@ -78,6 +78,7 @@ typedef struct _SpoAlertFullData
 static void AlertFullInit(char *);
 static SpoAlertFullData *ParseAlertFullArgs(char *);
 static void AlertFull(Packet *, void *, uint32_t, void *);
+static void AlertFullExtra(void *, SpoAlertFullData *);
 static void AlertFullCleanExit(int, void *);
 static void AlertFullRestart(int, void *);
 
@@ -133,6 +134,7 @@ static void AlertFullInit(char *args)
 
     /* Set the preprocessor function into the function list */
     AddFuncToOutputList(AlertFull, OUTPUT_TYPE__ALERT, data);
+    AddFuncToOutputList(AlertFull, OUTPUT_TYPE__EXTRA, data);
     AddFuncToCleanExitList(AlertFullCleanExit, data);
     AddFuncToRestartList(AlertFullRestart, data);
 }
@@ -148,7 +150,14 @@ static void AlertFull(Packet *p, void *event, uint32_t event_type, void *arg)
 	}
 
     data = (SpoAlertFullData *)arg;
-	sn = GetSigByGidSid(ntohl(((Unified2EventCommon *)event)->generator_id),
+    
+    if (event_type == UNIFIED2_EXTRA_DATA)
+    {
+        AlertFullExtra(event,data);
+        return;
+    }
+    
+    sn = GetSigByGidSid(ntohl(((Unified2EventCommon *)event)->generator_id),
 						ntohl(((Unified2EventCommon *)event)->signature_id));
 
 
@@ -237,6 +246,122 @@ static void AlertFull(Packet *p, void *event, uint32_t event_type, void *arg)
     TextLog_Flush(data->log);
 }
 
+/*******************************************************************************
+ * Function: AlertFullExtra(void *event, SpoAlertFullData *data)
+ *
+ * Purpose: Insert data into the database
+ *
+ * Arguments: event => pointer to the Unified2ExtraHeader event record
+ *            data => pointer to the instance data for this plugin
+ *
+ * Returns: void function
+ *
+ ******************************************************************************/
+static void AlertFullExtra(void *event, SpoAlertFullData *data)
+{
+
+#define TO_IP(x) x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff
+
+    Unified2ExtraDataHdr* eventHdr = (Unified2ExtraDataHdr*)event;
+    Unified2ExtraData* extraEvent = (Unified2ExtraData*)(event + sizeof(Unified2ExtraDataHdr));
+
+    int i;
+    int len = 0;
+    uint32_t ip;
+    char ip6buf[INET6_ADDRSTRLEN+1];
+    struct in6_addr ipAddr;
+
+    TextLog_Print(data->log, "\n(ExtraDataHdr)\n"
+            "\tevent type: %u\tevent length: %u\n",
+            ntohl(eventHdr->event_type), ntohl(eventHdr->event_length));
+
+    TextLog_Print(data->log, "\n(ExtraData)\n"
+            "\tsensor id: %u\tevent id: %u\tevent second: %u\n"
+            "\ttype: %u\tdatatype: %u\tbloblength: %u\t",
+             ntohl(extraEvent->sensor_id), ntohl(extraEvent->event_id),
+             ntohl(extraEvent->event_second), ntohl(extraEvent->type),
+             ntohl(extraEvent->data_type), ntohl(extraEvent->blob_length));
+
+    len = ntohl(extraEvent->blob_length) - sizeof(extraEvent->blob_length) - sizeof(extraEvent->data_type);
+
+    switch(ntohl(extraEvent->type))
+    {
+        case EVENT_INFO_XFF_IPV4:
+            memcpy(&ip, event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData), sizeof(uint32_t));
+            ip = ntohl(ip);
+            TextLog_Print(data->log, "Original Client IP: %u.%u.%u.%u\n",
+                    TO_IP(ip));
+            break;
+
+        case EVENT_INFO_XFF_IPV6:
+            memcpy(&ipAddr, event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData), sizeof(struct in6_addr));
+            inet_ntop(AF_INET6, &ipAddr, ip6buf, INET6_ADDRSTRLEN);
+            TextLog_Print(data->log, "Original Client IP: %s\n",
+                    ip6buf);
+            break;
+
+        case EVENT_INFO_GZIP_DATA:
+            TextLog_Print(data->log, "GZIP Decompressed Data: %.*s\n",
+                len, (char*)event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData));
+            break;
+
+        case EVENT_INFO_SMTP_FILENAME:
+            TextLog_Print(data->log, "SMTP Attachment Filename: %.*s\n",
+                len, (char*)event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData));
+            break;
+
+        case EVENT_INFO_SMTP_MAILFROM:
+            TextLog_Print(data->log, "SMTP MAIL FROM Addresses: %.*s\n",
+                    len, (char*)event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData));
+            break;
+
+        case EVENT_INFO_SMTP_RCPTTO:
+            TextLog_Print(data->log, "SMTP RCPT TO Addresses: %.*s\n",
+                len, (char*)event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData));
+            break;
+
+        case EVENT_INFO_SMTP_EMAIL_HDRS:
+            TextLog_Print(data->log, "SMTP EMAIL HEADERS: \n%.*s\n",
+                len, (char*)event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData));
+            break;
+
+        case EVENT_INFO_HTTP_URI:
+            TextLog_Print(data->log, "HTTP URI: %.*s\n",
+                len, (char*)event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData));
+            break;
+
+        case EVENT_INFO_HTTP_HOSTNAME:
+            TextLog_Print(data->log, "HTTP Hostname: ");
+            char* hdata = (char*)event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData);
+            for(i=0; i < len; i++)
+            {
+                if(iscntrl(hdata[i]))
+                    TextLog_Print(data->log, "%c",'.');
+                else
+                    TextLog_Print(data->log, "%c",hdata[i]);
+            }
+            TextLog_NewLine(data->log);
+            break;
+
+        case EVENT_INFO_IPV6_SRC:
+            memcpy(&ipAddr, event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData), sizeof(struct in6_addr));
+            inet_ntop(AF_INET6, &ipAddr, ip6buf, INET6_ADDRSTRLEN);
+            TextLog_Print(data->log, "IPv6 Source Address: %s\n",
+                    ip6buf);
+            break;
+
+        case EVENT_INFO_IPV6_DST:
+            memcpy(&ipAddr, event + sizeof(Unified2ExtraDataHdr) + sizeof(Unified2ExtraData), sizeof(struct in6_addr));
+            inet_ntop(AF_INET6, &ipAddr, ip6buf, INET6_ADDRSTRLEN);
+            TextLog_Print(data->log, "IPv6 Destination Address: %s\n",
+                    ip6buf);
+            break;
+
+        default :
+            break;
+    }
+}
+
 /*
  * Function: ParseAlertFullArgs(char *)
  *
diff --git a/src/output-plugins/spo_database.c b/src/output-plugins/spo_database.c
index fc108c3..6d9c4d6 100644
--- a/src/output-plugins/spo_database.c
+++ b/src/output-plugins/spo_database.c
@@ -249,7 +249,7 @@ typedef struct _SharedDatabaseDataNode
 #   define KEYWORD_SSL_MODE_REQUIRE "require"
 #endif
 
-#define LATEST_DB_SCHEMA_VERSION 107
+#define LATEST_DB_SCHEMA_VERSION 108
 
 /******** fatals *******************************************************/
 /* these strings deliberately break fatal error messages into
@@ -320,6 +320,7 @@ DatabaseData *InitDatabaseData(char *args);
 void          DatabaseInitFinalize(int unused, void *arg);
 void          ParseDatabaseArgs(DatabaseData *data);
 void          Database(Packet *, void *, uint32_t, void *);
+void          DatabaseExtra(void *, DatabaseData *);
 char *        snort_escape_string(char *, DatabaseData *);
 void          SpoDatabaseCleanExitFunction(int, void *);
 void          SpoDatabaseRestartFunction(int, void *);
@@ -423,6 +424,8 @@ void DatabaseInit(char *args)
     else
     {
         AddFuncToOutputList(Database, OUTPUT_TYPE__ALERT, data);
+	if (strncasecmp(data->facility, "alert-extra", 11) == 0)
+	    AddFuncToOutputList(Database, OUTPUT_TYPE__EXTRA, data);
     }
 
     AddFuncToCleanExitList(SpoDatabaseCleanExitFunction, data);
@@ -1163,12 +1166,144 @@ SQLQuery * NewQueryNode(SQLQuery * parent, int query_size)
 }
 
 /*******************************************************************************
+ * Function: DatabaseExtra(void *event, DatabaseData *data)
+ *
+ * Purpose: Insert data into the database
+ *
+ * Arguments: event => pointer to the Unified2ExtraHeader event record
+ *            data => pointer to the instance data for this plugin
+ *
+ * Returns: void function
+ *
+ ******************************************************************************/
+void DatabaseExtra(void *event, DatabaseData* data)
+{
+    char *packet_data = NULL,
+            *packet_data_not_escaped = NULL,
+            *insert0 = NULL;
+    u_char *extraData = NULL;
+    
+    Unified2ExtraData* extraEvent = (Unified2ExtraData*) (event + sizeof (Unified2ExtraDataHdr));
+    int len = ntohl(extraEvent->blob_length) - sizeof (extraEvent->blob_length) - sizeof (extraEvent->data_type);
+
+    if (len) {
+        extraData = SnortAlloc(len + 1); // +1 for null terminator
+        memcpy(extraData, (char*) extraEvent + sizeof (Unified2ExtraData), len);
+        extraData[len] = '\0';
+
+        insert0 = (char *) SnortAlloc(len * 2 + MAX_QUERY_LENGTH + 1);
+        int ret = 0;
+
+        switch (ntohl(extraEvent->type)) {
+            case EVENT_INFO_IPV6_SRC:
+            case EVENT_INFO_IPV6_DST:
+            case EVENT_INFO_XFF_IPV6:
+                packet_data_not_escaped = SnortAlloc(INET6_ADDRSTRLEN);
+                inet_ntop(AF_INET6, extraData, packet_data_not_escaped, INET6_ADDRSTRLEN);
+                break;
+            case EVENT_INFO_XFF_IPV4:
+                packet_data_not_escaped = SnortAlloc(INET6_ADDRSTRLEN);
+                inet_ntop(AF_INET, extraData, packet_data_not_escaped, INET_ADDRSTRLEN);
+                break;
+            case EVENT_INFO_SMTP_FILENAME:
+            case EVENT_INFO_SMTP_MAILFROM:
+            case EVENT_INFO_SMTP_RCPTTO:
+            case EVENT_INFO_SMTP_EMAIL_HDRS:
+            case EVENT_INFO_HTTP_URI:
+            case EVENT_INFO_HTTP_HOSTNAME:
+                packet_data_not_escaped = SnortAlloc(len+1);
+                memcpy(packet_data_not_escaped,extraData,len+1);
+                break;
+            default:
+                //anything we don't know about gets encoded
+                DEBUG_WRAP(DebugMessage(DEBUG_LOG, "database(debug): unknown Unified2ExtraData type %d\n", ntohl(extraEvent->type)););
+            case EVENT_INFO_REVIEWED_BY: //not sure what data type this is...
+            case EVENT_INFO_GZIP_DATA:
+                if (data->encoding == ENCODING_BASE64) {
+                    packet_data_not_escaped = base64(extraData, len);
+                } else if (data->encoding == ENCODING_ASCII) {
+                    packet_data_not_escaped = ascii(extraData, len);
+                } else {
+                    packet_data_not_escaped = fasthex(extraData, len);
+                }
+                break;
+        }
+        
+        packet_data = snort_escape_string(packet_data_not_escaped, data);
+
+        if (data->shared->dbtype_id == DB_ORACLE) {
+            /* Oracle field BLOB type case. We append unescaped
+             * packet_payload data after query, which later in Insert()
+             * will be cut off and uploaded with OCIBindByPos().
+             */
+            ret = SnortSnprintf(insert0, (len * 2) + MAX_QUERY_LENGTH - 3,
+                    "INSERT INTO "
+                    "extra (sid,cid,type,datatype,len,data) "
+                    "VALUES (%u,%u,%u,%u,%u,:1)|%s",
+                    data->shared->sid,
+                    data->shared->cid - 1, //"extra" data is always for the previous event
+                    ntohl(extraEvent->type),
+                    ntohl(extraEvent->data_type),
+                    len,
+                    packet_data_not_escaped);
+
+            if (ret != SNORT_SNPRINTF_SUCCESS)
+                goto bad_query;
+
+            free(packet_data);
+            packet_data = NULL;
+            free(packet_data_not_escaped);
+            packet_data_not_escaped = NULL;
+        } else {
+            ret = SnortSnprintf(insert0, (len * 2) + MAX_QUERY_LENGTH - 3,
+                    "INSERT INTO "
+                    "extra (sid,cid,type,datatype,len,data) "
+                    "VALUES (%u,%u,%u,%u,%u,'%s')",
+                    data->shared->sid,
+                    data->shared->cid - 1, //"extra" data is always for the previous event
+                    ntohl(extraEvent->type),
+                    ntohl(extraEvent->data_type),
+                    len,
+                    packet_data);
+
+            if (ret != SNORT_SNPRINTF_SUCCESS)
+                goto bad_query;
+
+            free(packet_data);
+            packet_data = NULL;
+            free(packet_data_not_escaped);
+            packet_data_not_escaped = NULL;
+            free(extraData);
+            extraData = NULL;
+        }
+        if (ret != SNORT_SNPRINTF_SUCCESS)
+            goto bad_query;
+
+        if (Insert(insert0, data) == 0) {
+#ifdef ENABLE_DB_TRANSACTIONS
+            RollbackTransaction(data);
+#endif
+        }
+        free(insert0);
+        return;
+    }
+bad_query:
+    ErrorMessage("Database: Unable to construct extra query - output error or truncation\n");
+    if (extraData != NULL)               free(extraData);
+    if (packet_data != NULL)             free(packet_data);
+    if (packet_data_not_escaped != NULL) free(packet_data_not_escaped);
+    if (insert0 != NULL)                 free(insert0);
+}
+
+/*******************************************************************************
  * Function: Database(Packet *p, void *event, uint32_t event_type, void *arg)
  *
  * Purpose: Insert data into the database
  *
  * Arguments: p   => pointer to the current packet data struct
- *            msg => pointer to the signature message
+ *            event => pointer to the spooler event record
+ *            event_type => the Unified2 type of event
+ *            arg => opaque pointer to the instance data for this plugin
  *
  * Returns: void function
  *
@@ -1229,6 +1364,12 @@ void Database(Packet *p, void *event, uint32_t event_type, void *arg)
     BeginTransaction(data);
 #endif
 
+    if (event_type == UNIFIED2_EXTRA_DATA)
+    {
+        DatabaseExtra(event,data);
+        return;
+    }
+
     /*** Build the query for the Event Table ***/
 
     /* Generate a default-formatted timestamp now */
diff --git a/src/plugbase.c b/src/plugbase.c
index bfbae02..2e2ce9f 100644
--- a/src/plugbase.c
+++ b/src/plugbase.c
@@ -81,6 +81,7 @@ extern PluginSignalFuncNode *plugin_restart_funcs;
 extern InputFuncNode  *InputList;
 extern OutputFuncNode *AlertList;
 extern OutputFuncNode *LogList;
+extern OutputFuncNode *ExtraList;
 
 extern Barnyard2Config *barnyard2_conf_for_parsing;
 extern int file_line;
@@ -505,6 +506,10 @@ void AddFuncToOutputList(OutputFunc func, OutputType type, void *arg)
             AppendOutputFuncList(func, arg, &LogList);
             break;
 
+    case OUTPUT_TYPE__EXTRA:
+	AppendOutputFuncList(func, arg, &ExtraList);
+	break;
+
         default:
             /* just to be error-prone */
             FatalError("Unknown output type: %i. Possible bug, please "
@@ -569,6 +574,9 @@ void CallOutputPlugins(OutputType out_type, Packet *packet, void *event, uint32_
             case OUTPUT_TYPE__LOG:
                 idx = LogList;
                 break;
+            case OUTPUT_TYPE__EXTRA:
+                idx = ExtraList;
+                break;
             default:
                 break;
         }
diff --git a/src/plugbase.h b/src/plugbase.h
index a9ed813..dd55f2d 100644
--- a/src/plugbase.h
+++ b/src/plugbase.h
@@ -81,8 +81,9 @@ typedef enum _OutputType
 {
     OUTPUT_TYPE__ALERT = 1,
     OUTPUT_TYPE__LOG,
-	OUTPUT_TYPE__SPECIAL,
-    OUTPUT_TYPE__MAX
+    OUTPUT_TYPE__SPECIAL,
+    OUTPUT_TYPE__MAX,
+    OUTPUT_TYPE__EXTRA
 
 } OutputType;
 
diff --git a/src/rules.h b/src/rules.h
index f9b2823..18ac8d0 100644
--- a/src/rules.h
+++ b/src/rules.h
@@ -319,6 +319,7 @@ struct _RuleListNode;
 
 typedef struct _ListHead
 {
+    struct _OutputFuncNode *ExtraList;
     struct _OutputFuncNode *LogList;
     struct _OutputFuncNode *AlertList;
     struct _RuleListNode *ruleListNode;
diff --git a/src/spooler.c b/src/spooler.c
index 30956e8..d031ca1 100644
--- a/src/spooler.c
+++ b/src/spooler.c
@@ -749,7 +749,13 @@ void spoolerProcessRecord(Spooler *spooler, int fire_output)
     }
     else if (type == UNIFIED2_EXTRA_DATA)
     {
-        /* waldo operations occur after the output plugins are called */
+	if (fire_output)
+	    CallOutputPlugins(OUTPUT_TYPE__EXTRA,
+                              NULL,
+                              spooler->record.data,
+                              type);
+	
+	/* waldo operations occur after the output plugins are called */
         if (fire_output)
             spoolerWriteWaldo(&barnyard2_conf->waldo, spooler);
     }
diff --git a/src/unified2.h b/src/unified2.h
index 3fa8ccb..925e7ec 100644
--- a/src/unified2.h
+++ b/src/unified2.h
@@ -135,9 +135,17 @@ typedef struct _Unified2ExtraData{
 typedef enum _EventInfoEnum
 {
     EVENT_INFO_XFF_IPV4 = 1,
-    EVENT_INFO_XFF_IPV6 ,
+    EVENT_INFO_XFF_IPV6,
     EVENT_INFO_REVIEWED_BY,
-    EVENT_INFO_GZIP_DATA
+    EVENT_INFO_GZIP_DATA,
+    EVENT_INFO_SMTP_FILENAME,
+    EVENT_INFO_SMTP_MAILFROM,
+    EVENT_INFO_SMTP_RCPTTO,
+    EVENT_INFO_SMTP_EMAIL_HDRS,
+    EVENT_INFO_HTTP_URI,
+    EVENT_INFO_HTTP_HOSTNAME,
+    EVENT_INFO_IPV6_SRC,
+    EVENT_INFO_IPV6_DST
 }EventInfoEnum;
 
 typedef enum _EventDataType
