From 2d983982e1c9cd628664081fe15c0d638f284f14 Mon Sep 17 00:00:00 2001
From: Chris Gross <gross.364@osu.edu>
Date: Thu, 19 Nov 2015 16:58:58 -0500
Subject: [PATCH] daily build

---
 profiles/wcm_base/CHANGELOG.txt               |    7 +
 .../wcm_base/modules/contrib/smtp/LICENSE.txt |  339 +++
 .../wcm_base/modules/contrib/smtp/README.txt  |   43 +
 .../modules/contrib/smtp/smtp.admin.inc       |  239 ++
 .../wcm_base/modules/contrib/smtp/smtp.info   |   15 +
 .../modules/contrib/smtp/smtp.install         |   65 +
 .../modules/contrib/smtp/smtp.mail.inc        |  633 +++++
 .../wcm_base/modules/contrib/smtp/smtp.module |  104 +
 .../modules/contrib/smtp/smtp.phpmailer.inc   | 2347 +++++++++++++++++
 .../modules/contrib/smtp/smtp.transport.inc   |  816 ++++++
 .../modules/contrib/uuid_features/readme.md   |   89 +
 .../wysiwyg/editors/js/ckeditor-3.0.js        |   38 +-
 .../contrib/wysiwyg/editors/js/tinymce-3.js   |   26 +-
 .../contrib/wysiwyg/editors/tinymce.inc       |   13 +
 .../contrib/wysiwyg/tests/wysiwyg_test.info   |    6 +-
 .../modules/contrib/wysiwyg/wysiwyg.info      |    6 +-
 .../modules/contrib/wysiwyg/wysiwyg.init.js   |    2 +-
 .../modules/contrib/wysiwyg/wysiwyg.js        |   11 +-
 .../custom/ocio_news/ocio_news.context.inc    |    1 +
 .../modules/custom/ocio_news/ocio_news.ds.inc |   16 +-
 .../ocio_news.features.field_instance.inc     |    6 +-
 .../ocio_panels_settings.module               |    3 +
 .../ocio_simplesamlphp_auth.module            |   31 +-
 .../ocio_url_aliases/ocio_url_aliases.info    |   15 +
 .../ocio_url_aliases.strongarm.inc            |  107 +-
 profiles/wcm_base/wcm_base.info               |    1 +
 profiles/wcm_base/wcm_base.make               |    3 +
 27 files changed, 4941 insertions(+), 41 deletions(-)
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/LICENSE.txt
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/README.txt
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/smtp.admin.inc
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/smtp.info
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/smtp.install
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/smtp.mail.inc
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/smtp.module
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/smtp.phpmailer.inc
 create mode 100644 profiles/wcm_base/modules/contrib/smtp/smtp.transport.inc
 create mode 100644 profiles/wcm_base/modules/contrib/uuid_features/readme.md

diff --git a/profiles/wcm_base/CHANGELOG.txt b/profiles/wcm_base/CHANGELOG.txt
index cf307175..292411af 100644
--- a/profiles/wcm_base/CHANGELOG.txt
+++ b/profiles/wcm_base/CHANGELOG.txt
@@ -1,3 +1,10 @@
+WCM Base 7.x-1.x, 2015-11-19
+----------------------------
+- OCIO News: Reduced image sizes on news article featured images.
+- OCIO URL Aliases: Improved URL alias patterns for landing pages, basic pages
+  and news articles.
+- WCM Base: Added SMTP module.
+
 WCM Base 7.x-1.x, 2015-11-16
 ----------------------------
 - WCM User Profile: Disable panelizer in user profile pages.
diff --git a/profiles/wcm_base/modules/contrib/smtp/LICENSE.txt b/profiles/wcm_base/modules/contrib/smtp/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/profiles/wcm_base/modules/contrib/smtp/README.txt b/profiles/wcm_base/modules/contrib/smtp/README.txt
new file mode 100644
index 00000000..403afb67
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/README.txt
@@ -0,0 +1,43 @@
+
+SMTP Authentication Support module for Drupal 7.x.
+This module adds SMTP functionality to Drupal.
+
+REQUIREMENTS
+------------
+* Access to an SMTP server
+* The following PHP extensions need to be installed: ereg, hash, date & pcre.
+
+* Optional: To connect to an SMTP server using SSL, you need to have the
+  openssl package installed on your server, and your webserver and PHP
+  installation need to have additional components installed and configured.
+
+INSTALLATION INSTRUCTIONS
+-------------------------
+1.  Copy the files included in the tarball into a directory named "smtp" in
+    your Drupal sites/all/modules/ directory.
+2.  Login as site administrator.
+3.  Enable the SMTP Authentication Support module on the Administer -> Modules
+    page.
+4.  Fill in required settings on the Administer -> Configuration -> System ->
+    SMTP Authentication Support page.
+5.  Enjoy.
+
+NOTES
+-----
+This module sends email by connecting to an SMTP server.  Therefore, you need
+to have access to an SMTP server for this module to work.
+
+Drupal will often use the email address entered into Administrator ->
+Configuration -> Site information -> E-mail address as the from address.  It is
+important for this to be the correct address and some ISPs will block email that
+comes from an invalid address.
+
+This module no longer uses the PHPMailer package as an external library, instead
+a slimmed down version of the library have been relicensed and integrated with the
+smtp module.
+
+Connecting to an SMTP server using SSL is possible only if PHP's openssl
+extension is working.  If the SMTP module detects openssl is available it
+will display the options in the modules settings page.
+
+Sending mail to Gmail requires SSL or TLS.
diff --git a/profiles/wcm_base/modules/contrib/smtp/smtp.admin.inc b/profiles/wcm_base/modules/contrib/smtp/smtp.admin.inc
new file mode 100644
index 00000000..cee7c8cb
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/smtp.admin.inc
@@ -0,0 +1,239 @@
+<?php
+
+/**
+ * @file
+ * Administrative page code for the smtp module.
+ *
+ */
+
+
+/**
+ * Administrative settings.
+ *
+ * @return
+ *   An array containing form items to place on the module settings page.
+ */
+function smtp_admin_settings() {
+  // Override the smtp_library variable.
+  if (module_exists('mimemail') &&
+      strpos(variable_get('smtp_library', ''), 'mimemail')) {
+    // don't touch smtp_library
+  }
+  else {
+    if (variable_get('smtp_on', 0)) {
+      $smtp_path = drupal_get_filename('module', 'smtp');
+      if ($smtp_path) {
+        variable_set('smtp_library', $smtp_path);
+        drupal_set_message(t('SMTP.module is active.'));
+      }
+      // If drupal can't find the path to the module, display an error.
+      else {
+        drupal_set_message(t("SMTP.module error: Can't find file."), 'error');
+      }
+    }
+    // If this module is turned off, delete the variable.
+    else {
+      variable_del('smtp_library');
+      drupal_set_message(t('SMTP.module is INACTIVE.'));
+    }
+  }
+
+  $form['onoff'] = array(
+    '#type'  => 'fieldset',
+    '#title' => t('Install options'),
+  );
+  $form['onoff']['smtp_on'] = array(
+    '#type'          => 'radios',
+    '#title'         => t('Turn this module on or off'),
+    '#default_value' => variable_get('smtp_on', 0),
+    '#options'       => array(1 => t('On'), 0 => t('Off')),
+    '#description'   => t('To uninstall this module you must turn it off here first.'),
+  );
+  $form['onoff']['smtp_queue'] = array(
+    '#type'  => 'checkbox',
+    '#title' => t('Send mail by queue'),
+    '#default_value' => variable_get('smtp_queue', FALSE),
+    '#description'   => t('Mails will be sent by drupal queue api.'),
+  );
+
+  $form['server'] = array(
+    '#type'  => 'fieldset',
+    '#title' => t('SMTP server settings'),
+  );
+  $form['server']['smtp_host'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('SMTP server'),
+    '#default_value' => variable_get('smtp_host', ''),
+    '#description'   => t('The address of your outgoing SMTP server.'),
+  );
+  $form['server']['smtp_hostbackup'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('SMTP backup server'),
+    '#default_value' => variable_get('smtp_hostbackup', ''),
+    '#description'   => t('The address of your outgoing SMTP backup server. If the primary server can\'t be found this one will be tried. This is optional.'),
+  );
+  $form['server']['smtp_port'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('SMTP port'),
+    '#size'          => 6,
+    '#maxlength'     => 6,
+    '#default_value' => variable_get('smtp_port', '25'),
+    '#description'   => t('The default SMTP port is 25, if that is being blocked try 80. Gmail uses 465. See !url for more information on configuring for use with Gmail.', array('!url' => l(t('this page'), 'http://gmail.google.com/support/bin/answer.py?answer=13287'))),
+  );
+  // Only display the option if openssl is installed.
+  if (function_exists('openssl_open')) {
+    $encryption_options = array(
+      'standard' => t('No'),
+      'ssl'      => t('Use SSL'),
+      'tls'      => t('Use TLS'),
+    );
+    $encryption_description = t('This allows connection to an SMTP server that requires SSL encryption such as Gmail.');
+  }
+  // If openssl is not installed, use normal protocol.
+  else {
+    variable_set('smtp_protocol', 'standard');
+    $encryption_options = array('standard' => t('No'));
+    $encryption_description = t('Your PHP installation does not have SSL enabled. See the !url page on php.net for more information. Gmail requires SSL.', array('!url' => l(t('OpenSSL Functions'), 'http://php.net/openssl')));
+  }
+  $form['server']['smtp_protocol'] = array(
+    '#type'          => 'select',
+    '#title'         => t('Use encrypted protocol'),
+    '#default_value' => variable_get('smtp_protocol', 'standard'),
+    '#options'       => $encryption_options,
+    '#description'   => $encryption_description,
+  );
+
+  $form['auth'] = array(
+    '#type'        => 'fieldset',
+    '#title'       => t('SMTP Authentication'),
+    '#description' => t('Leave blank if your SMTP server does not require authentication.'),
+  );
+  $form['auth']['smtp_username'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('Username'),
+    '#default_value' => variable_get('smtp_username', ''),
+    '#description'   => t('SMTP Username.'),
+  );
+  $form['auth']['smtp_password'] = array(
+    '#type'          => 'password',
+    '#title'         => t('Password'),
+    '#default_value' => variable_get('smtp_password', ''),
+    '#description'   => t('SMTP password. If you have already entered your password before, you should leave this field blank, unless you want to change the stored password.'),
+  );
+
+  $form['email_options'] = array(
+    '#type'  => 'fieldset',
+    '#title' => t('E-mail options'),
+  );
+  $form['email_options']['smtp_from'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('E-mail from address'),
+    '#default_value' => variable_get('smtp_from', ''),
+    '#description'   => t('The e-mail address that all e-mails will be from.'),
+  );
+  $form['email_options']['smtp_fromname'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('E-mail from name'),
+    '#default_value' => variable_get('smtp_fromname', ''),
+    '#description'   => t('The name that all e-mails will be from. If left blank will use the site name of:') . ' ' . variable_get('site_name', 'Drupal powered site'),
+  );
+  $form['email_options']['smtp_allowhtml'] = array(
+    '#type'          => 'checkbox',
+    '#title'         => t('Allow to send e-mails formated as Html'),
+    '#default_value' => variable_get('smtp_allowhtml', 0),
+    '#description'   => t('Checking this box will allow Html formated e-mails to be sent with the SMTP protocol.'),
+  );
+
+  // If an address was given, send a test e-mail message.
+  $test_address = variable_get('smtp_test_address', '');
+  if ($test_address != '') {
+    // Clear the variable so only one message is sent.
+    variable_del('smtp_test_address');
+    global $language;
+    $params['subject'] = t('Drupal SMTP test e-mail');
+    $params['body']    = array(t('If you receive this message it means your site is capable of using SMTP to send e-mail.'));
+    drupal_mail('smtp', 'smtp-test', $test_address, $language, $params);
+    drupal_set_message(t('A test e-mail has been sent to @email. You may want to !check for any error messages.', array('@email' => $test_address, '!check' => l(t('check the logs'), 'admin/reports/dblog'))));
+  }
+  $form['email_test'] = array(
+    '#type'  => 'fieldset',
+    '#title' => t('Send test e-mail'),
+  );
+  $form['email_test']['smtp_test_address'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('E-mail address to send a test e-mail to'),
+    '#default_value' => '',
+    '#description'   => t('Type in an address to have a test e-mail sent there.'),
+  );
+
+  $form['smtp_debugging'] = array(
+    '#type'          => 'checkbox',
+    '#title'         => t('Enable debugging'),
+    '#default_value' => variable_get('smtp_debugging', 0),
+    '#description'   => t('Checking this box will print SMTP messages from the server for every e-mail that is sent.'),
+  );
+
+  $form['#submit'][] = 'smtp_admin_settings_form_submit';
+
+  return system_settings_form($form);
+}  //  End of smtp_admin_settings().
+
+
+
+/**
+ * Validation for the administrative settings form.
+ *
+ * @param form
+ *   An associative array containing the structure of the form.
+ * @param form_state
+ *   A keyed array containing the current state of the form.
+ */
+function smtp_admin_settings_validate($form, &$form_state) {
+  if ($form_state['values']['smtp_on'] == 1 && $form_state['values']['smtp_host'] == '') {
+    form_set_error('smtp_host', t('You must enter an SMTP server address.'));
+  }
+
+  if ($form_state['values']['smtp_on'] == 1 && $form_state['values']['smtp_port'] == '') {
+    form_set_error('smtp_port', t('You must enter an SMTP port number.'));
+  }
+
+  if ($form_state['values']['smtp_from'] && !valid_email_address($form_state['values']['smtp_from'])) {
+    form_set_error('smtp_from', t('The provided from e-mail address is not valid.'));
+  }
+
+  // If username is set empty, we must set both username/password empty as well.
+  if (empty($form_state['values']['smtp_username'])) {
+    $form_state['values']['smtp_password'] = '';
+  }
+
+  // A little hack. When form is presentend, the password is not shown (Drupal way of doing).
+  // So, if user submits the form without changing the password, we must prevent it from being reset.
+  elseif (empty($form_state['values']['smtp_password'])) {
+    unset($form_state['values']['smtp_password']);
+  }
+}  //  End of smtp_admin_settings_validate().
+
+/**
+ * Submit handler().
+ */
+function smtp_admin_settings_form_submit($form, &$form_state) {
+  // Check if SMTP status has been changed.
+  if (
+    (!variable_get('smtp_on', FALSE) && $form_state['values']['smtp_on']) ||
+    (variable_get('smtp_on', FALSE) && !$form_state['values']['smtp_on'])
+  ) {
+    $mail_modes = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
+
+    // Turning on.
+    if ($form_state['values']['smtp_on']) {
+      variable_set('smtp_previous_mail_system', $mail_modes['default-system']);
+      $mail_modes['default-system'] = 'SmtpMailSystem';
+    }
+    // Turning off.
+    else {
+      $mail_modes['default-system'] = variable_get('smtp_previous_mail_system', 'DefaultMailSystem');
+    }
+
+    variable_set('mail_system', $mail_modes);
+  }
+}
diff --git a/profiles/wcm_base/modules/contrib/smtp/smtp.info b/profiles/wcm_base/modules/contrib/smtp/smtp.info
new file mode 100644
index 00000000..7986f1b9
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/smtp.info
@@ -0,0 +1,15 @@
+name = SMTP Authentication Support
+description = "Allow for site emails to be sent through an SMTP server of your choice."
+core = 7.x
+package = Mail
+configure = admin/config/system/smtp
+files[] = smtp.mail.inc
+files[] = smtp.phpmailer.inc
+files[] = smtp.transport.inc
+
+; Information added by Drupal.org packaging script on 2015-01-07
+version = "7.x-1.2"
+core = "7.x"
+project = "smtp"
+datestamp = "1420662781"
+
diff --git a/profiles/wcm_base/modules/contrib/smtp/smtp.install b/profiles/wcm_base/modules/contrib/smtp/smtp.install
new file mode 100644
index 00000000..61ab1356
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/smtp.install
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @file
+ * The installation instructions for the SMTP Authentication Support.
+ */
+
+/**
+ * Implements hook_install().
+ */
+ function smtp_install() {
+   variable_set('smtp_on', 0);
+ }
+
+/**
+ * Implements hook_uninstall().
+ */
+function smtp_uninstall() {
+  variable_del('smtp_from');
+  variable_del('smtp_fromname');
+  variable_del('smtp_host');
+  variable_del('smtp_hostbackup');
+  variable_del('smtp_on');
+  variable_del('smtp_password');
+  variable_del('smtp_port');
+  variable_del('smtp_protocol');
+  variable_del('smtp_test_address');
+  variable_del('smtp_username');
+
+  if (variable_get('smtp_library', '') == drupal_get_path('module', 'smtp') . '/smtp.module') {
+    variable_del('smtp_library');
+  }
+}
+
+/**
+ * Implements hook_disable().
+ */
+function smtp_disable() {
+  $mail_modes = variable_get('mail_system');
+  $mail_modes['default-system'] = 'DefaultMailSystem';
+  variable_set('mail_system', $mail_modes);
+}
+
+/**
+ * Implements hook_update_N().
+ * Upgrade to Drupal 7.x
+ */
+function smtp_update_7000() {
+  if (variable_get('smtp_on', 0) != 0) {
+    variable_set('mail_system', array('default-system' => 'SmtpMailSystem'));
+  }
+}
+
+/**
+ * Implements hook_update_N().
+ *
+ * Back to default mail system if the status flag is off.
+ */
+function smtp_update_7100() {
+  $mail_modes = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
+  if ($mail_modes['default-system'] == 'SmtpMailSystem' && !variable_get('smtp_on', FALSE)) {
+    $mail_modes['default-system'] = 'DefaultMailSystem';
+    variable_set('mail_system', $mail_modes);
+  }
+}
diff --git a/profiles/wcm_base/modules/contrib/smtp/smtp.mail.inc b/profiles/wcm_base/modules/contrib/smtp/smtp.mail.inc
new file mode 100644
index 00000000..b220eeb1
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/smtp.mail.inc
@@ -0,0 +1,633 @@
+<?php
+/**
+ * @file
+ * The code processing mail in the smtp module.
+ *
+ */
+
+/**
+* Modify the drupal mail system to use smtp when sending emails.
+* Include the option to choose between plain text or HTML
+*/
+class SmtpMailSystem implements MailSystemInterface {
+
+  protected $AllowHtml;
+  /**
+   * Concatenate and wrap the e-mail body for either
+   * plain-text or HTML emails.
+   *
+   * @param $message
+   *   A message array, as described in hook_mail_alter().
+   *
+   * @return
+   *   The formatted $message.
+   */
+  public function format(array $message) {
+    $this->AllowHtml = variable_get('smtp_allowhtml', 0);
+    // Join the body array into one string.
+    $message['body'] = implode("\n\n", $message['body']);
+    if ($this->AllowHtml == 0) {
+      // Convert any HTML to plain-text.
+      $message['body'] = drupal_html_to_text($message['body']);
+      // Wrap the mail body for sending.
+      $message['body'] = drupal_wrap_mail($message['body']);
+    }
+    return $message;
+  }
+
+  /**
+   * Send the e-mail message.
+   *
+   * @see drupal_mail()
+   *
+   * @param $message
+   *   A message array, as described in hook_mail_alter().
+   * @return
+   *   TRUE if the mail was successfully accepted, otherwise FALSE.
+   */
+  public function mail(array $message) {
+    $id = $message['id'];
+    $to = $message['to'];
+    $from = $message['from'];
+    $body = $message['body'];
+    $headers = $message['headers'];
+    $subject = $message['subject'];
+
+    // Create a new PHPMailer object - autoloaded from registry.
+    $mailer = new PHPMailer();
+
+    // Turn on debugging, if requested.
+    if (variable_get('smtp_debugging', 0) == 1) {
+      $mailer->SMTPDebug = TRUE;
+    }
+
+    // Set the from name.
+    if (variable_get('smtp_fromname', '') != '') {
+      $from_name = variable_get('smtp_fromname', '');
+    }
+    else {
+      // If value is not defined in settings, use site_name.
+      $from_name = variable_get('site_name', '');
+    }
+
+    //Hack to fix reply-to issue.
+    $properfrom = variable_get('site_mail', '');
+    if (!empty($properfrom)) {
+      $headers['From'] = $properfrom;
+    }
+    if (!isset($headers['Reply-To']) || empty($headers['Reply-To'])) {
+      if (strpos($from, '<')) {
+        $reply = preg_replace('/>.*/', '', preg_replace('/.*</', '', $from));
+      }
+      else {
+        $reply = $from;
+      }
+      $headers['Reply-To'] = $reply;
+    }
+
+    // Blank value will let the e-mail address appear.
+
+    if ($from == NULL || $from == '') {
+      // If from e-mail address is blank, use smtp_from config option.
+      if (($from = variable_get('smtp_from', '')) == '') {
+        // If smtp_from config option is blank, use site_email.
+        if (($from = variable_get('site_mail', '')) == '') {
+          drupal_set_message(t('There is no submitted from address.'), 'error');
+          watchdog('smtp', 'There is no submitted from address.', array(), WATCHDOG_ERROR);
+          return FALSE;
+        }
+      }
+    }
+    if (preg_match('/^"?.*"?\s*<.*>$/', $from)) {
+      // . == Matches any single character except line break characters \r and \n.
+      // * == Repeats the previous item zero or more times.
+      $from_name = preg_replace('/"?([^("\t\n)]*)"?.*$/', '$1', $from); // It gives: Name
+      $from      = preg_replace("/(.*)\<(.*)\>/i", '$2', $from); // It gives: name@domain.tld
+    }
+    elseif (!valid_email_address($from)) {
+      drupal_set_message(t('The submitted from address (@from) is not valid.', array('@from' => $from)), 'error');
+      watchdog('smtp', 'The submitted from address (@from) is not valid.', array('@from' => $from), WATCHDOG_ERROR);
+      return FALSE;
+    }
+
+    // Defines the From value to what we expect.
+    $mailer->From     = $from;
+    $mailer->FromName = $from_name;
+    $mailer->Sender   = $from;
+
+
+    // Create the list of 'To:' recipients.
+    $torecipients = explode(',', $to);
+    foreach ($torecipients as $torecipient) {
+      if (strpos($torecipient, '<') !== FALSE) {
+        $toparts = explode(' <', $torecipient);
+        $toname = $toparts[0];
+        $toaddr = rtrim($toparts[1], '>');
+      }
+      else {
+        $toname = '';
+        $toaddr = $torecipient;
+      }
+      $mailer->AddAddress($toaddr, $toname);
+    }
+
+
+    // Parse the headers of the message and set the PHPMailer object's settings
+    // accordingly.
+    foreach ($headers as $key => $value) {
+      //watchdog('error', 'Key: ' . $key . ' Value: ' . $value);
+      switch (drupal_strtolower($key)) {
+        case 'from':
+          if ($from == NULL or $from == '') {
+            // If a from value was already given, then set based on header.
+            // Should be the most common situation since drupal_mail moves the
+            // from to headers.
+            $from           = $value;
+            $mailer->From     = $value;
+            // then from can be out of sync with from_name !
+            $mailer->FromName = '';
+            $mailer->Sender   = $value;
+          }
+          break;
+        case 'content-type':
+          // Parse several values on the Content-type header, storing them in an array like
+          // key=value -> $vars['key']='value'
+          $vars = explode(';', $value);
+          foreach ($vars as $i => $var) {
+            if ($cut = strpos($var, '=')) {
+              $new_var = trim(drupal_strtolower(drupal_substr($var, $cut + 1)));
+              $new_key = trim(drupal_substr($var, 0, $cut));
+              unset($vars[$i]);
+              $vars[$new_key] = $new_var;
+            }
+          }
+          // Set the charset based on the provided value, otherwise set it to UTF-8 (which is Drupals internal default).
+          $mailer->CharSet = isset($vars['charset']) ? $vars['charset'] : 'UTF-8';
+          // If $vars is empty then set an empty value at index 0 to avoid a PHP warning in the next statement
+          $vars[0] = isset($vars[0])?$vars[0]:'';
+
+          switch ($vars[0]) {
+            case 'text/plain':
+              // The message includes only a plain text part.
+              $mailer->IsHTML(FALSE);
+              $content_type = 'text/plain';
+              break;
+            case 'text/html':
+              // The message includes only an HTML part.
+              $mailer->IsHTML(TRUE);
+              $content_type = 'text/html';
+              break;
+            case 'multipart/related':
+              // Get the boundary ID from the Content-Type header.
+              $boundary = $this->_get_substring($value, 'boundary', '"', '"');
+
+              // The message includes an HTML part w/inline attachments.
+              $mailer->ContentType = $content_type = 'multipart/related; boundary="' . $boundary . '"';
+            break;
+            case 'multipart/alternative':
+              // The message includes both a plain text and an HTML part.
+              $mailer->ContentType = $content_type = 'multipart/alternative';
+
+              // Get the boundary ID from the Content-Type header.
+              $boundary = $this->_get_substring($value, 'boundary', '"', '"');
+            break;
+            case 'multipart/mixed':
+              // The message includes one or more attachments.
+              $mailer->ContentType = $content_type = 'multipart/mixed';
+
+              // Get the boundary ID from the Content-Type header.
+              $boundary = $this->_get_substring($value, 'boundary', '"', '"');
+            break;
+            default:
+              // Everything else is unsuppored by PHPMailer.
+              drupal_set_message(t('The %header of your message is not supported by PHPMailer and will be sent as text/plain instead.', array('%header' => "Content-Type: $value")), 'error');
+              watchdog('smtp', 'The %header of your message is not supported by PHPMailer and will be sent as text/plain instead.', array('%header' => "Content-Type: $value"), WATCHDOG_ERROR);
+
+              // Force the Content-Type to be text/plain.
+              $mailer->IsHTML(FALSE);
+              $content_type = 'text/plain';
+          }
+          break;
+
+        case 'reply-to':
+          // Only add a "reply-to" if it's not the same as "return-path".
+          if ($value != $headers['Return-Path']) {
+            if (strpos($value, '<') !== FALSE) {
+              $replyToParts = explode('<', $value);
+              $replyToName = trim($replyToParts[0]);
+              $replyToName = trim($replyToName, '"');
+              $replyToAddr = rtrim($replyToParts[1], '>');
+              $mailer->AddReplyTo($replyToAddr, $replyToName);
+            }
+            else {
+              $mailer->AddReplyTo($value);
+            }
+          }
+          break;
+
+        case 'content-transfer-encoding':
+          $mailer->Encoding = $value;
+          break;
+
+        case 'return-path':
+          if (strpos($value, '<') !== FALSE) {
+            $returnPathParts = explode('<', $value);
+            $returnPathAddr = rtrim($returnPathParts[1], '>');
+            $mailer->Sender = $returnPathAddr;
+          }
+          else {
+            $mailer->Sender = $value;
+          }
+          break;
+
+        case 'mime-version':
+        case 'x-mailer':
+          // Let PHPMailer specify these.
+          break;
+
+        case 'errors-to':
+          $mailer->AddCustomHeader('Errors-To: ' . $value);
+          break;
+
+        case 'cc':
+          $ccrecipients = explode(',', $value);
+          foreach ($ccrecipients as $ccrecipient) {
+            if (strpos($ccrecipient, '<') !== FALSE) {
+              $ccparts = explode(' <', $ccrecipient);
+              $ccname = $ccparts[0];
+              $ccaddr = rtrim($ccparts[1], '>');
+            }
+            else {
+              $ccname = '';
+              $ccaddr = $ccrecipient;
+            }
+            $mailer->AddCC($ccaddr, $ccname);
+          }
+          break;
+
+        case 'bcc':
+          $bccrecipients = explode(',', $value);
+          foreach ($bccrecipients as $bccrecipient) {
+            if (strpos($bccrecipient, '<') !== FALSE) {
+              $bccparts = explode(' <', $bccrecipient);
+              $bccname = $bccparts[0];
+              $bccaddr = rtrim($bccparts[1], '>');
+            }
+            else {
+              $bccname = '';
+              $bccaddr = $bccrecipient;
+            }
+            $mailer->AddBCC($bccaddr, $bccname);
+          }
+          break;
+
+        case 'message-id':
+          $mailer->MessageID = $value;
+          break;
+
+        default:
+          // The header key is not special - add it as is.
+          $mailer->AddCustomHeader($key . ': ' . $value);
+      }
+    }
+
+    /**
+     * TODO
+     * Need to figure out the following.
+     *
+     * Add one last header item, but not if it has already been added.
+     * $errors_to = FALSE;
+     * foreach ($mailer->CustomHeader as $custom_header) {
+     *   if ($custom_header[0] = '') {
+     *     $errors_to = TRUE;
+     *   }
+     * }
+     * if ($errors_to) {
+     *   $mailer->AddCustomHeader('Errors-To: '. $from);
+     * }
+     */
+    // Add the message's subject.
+    $mailer->Subject = $subject;
+
+    // Processes the message's body.
+    switch ($content_type) {
+      case 'multipart/related':
+        $mailer->Body = $body;
+        // TODO: Figure out if there is anything more to handling this type.
+        break;
+
+      case 'multipart/alternative':
+        // Split the body based on the boundary ID.
+        $body_parts = $this->_boundary_split($body, $boundary);
+        foreach ($body_parts as $body_part) {
+          // If plain/text within the body part, add it to $mailer->AltBody.
+          if (strpos($body_part, 'text/plain')) {
+            // Clean up the text.
+            $body_part = trim($this->_remove_headers(trim($body_part)));
+            // Include it as part of the mail object.
+            $mailer->AltBody = $body_part;
+          }
+          // If plain/html within the body part, add it to $mailer->Body.
+          elseif (strpos($body_part, 'text/html')) {
+            // Clean up the text.
+            $body_part = trim($this->_remove_headers(trim($body_part)));
+            // Include it as part of the mail object.
+            $mailer->Body = $body_part;
+          }
+        }
+        break;
+
+      case 'multipart/mixed':
+        // Split the body based on the boundary ID.
+        $body_parts = $this->_boundary_split($body, $boundary);
+
+        // Determine if there is an HTML part for when adding the plain text part.
+        $text_plain = FALSE;
+        $text_html  = FALSE;
+        foreach ($body_parts as $body_part) {
+          if (strpos($body_part, 'text/plain')) {
+            $text_plain = TRUE;
+          }
+          if (strpos($body_part, 'text/html')) {
+            $text_html = TRUE;
+          }
+        }
+
+        foreach ($body_parts as $body_part) {
+          // If test/plain within the body part, add it to either
+          // $mailer->AltBody or $mailer->Body, depending on whether there is
+          // also a text/html part ot not.
+          if (strpos($body_part, 'multipart/alternative')) {
+            // Get boundary ID from the Content-Type header.
+            $boundary2 = $this->_get_substring($body_part, 'boundary', '"', '"');
+            // Clean up the text.
+            $body_part = trim($this->_remove_headers(trim($body_part)));
+            // Split the body based on the boundary ID.
+            $body_parts2 = $this->_boundary_split($body_part, $boundary2);
+
+            foreach ($body_parts2 as $body_part2) {
+              // If plain/text within the body part, add it to $mailer->AltBody.
+              if (strpos($body_part2, 'text/plain')) {
+                // Clean up the text.
+                $body_part2 = trim($this->_remove_headers(trim($body_part2)));
+                // Include it as part of the mail object.
+                $mailer->AltBody = $body_part2;
+                $mailer->ContentType = 'multipart/mixed';
+              }
+              // If plain/html within the body part, add it to $mailer->Body.
+              elseif (strpos($body_part2, 'text/html')) {
+                // Get the encoding.
+                $body_part2_encoding = $this->_get_substring($body_part2, 'Content-Transfer-Encoding', ':', "\n");
+                // Clean up the text.
+                $body_part2 = trim($this->_remove_headers(trim($body_part2)));
+                // Check whether the encoding is base64, and if so, decode it.
+                if (drupal_strtolower($body_part2_encoding) == 'base64') {
+                  // Include it as part of the mail object.
+                  $mailer->Body = base64_decode($body_part2);
+                  // Ensure the whole message is recoded in the base64 format.
+                  $mailer->Encoding = 'base64';
+                }
+                else {
+                  // Include it as part of the mail object.
+                  $mailer->Body = $body_part2;
+                }
+                $mailer->ContentType = 'multipart/mixed';
+              }
+            }
+          }
+          // If text/plain within the body part, add it to $mailer->Body.
+          elseif (strpos($body_part, 'text/plain')) {
+            // Clean up the text.
+            $body_part = trim($this->_remove_headers(trim($body_part)));
+
+            if ($text_html) {
+              $mailer->AltBody = $body_part;
+              $mailer->IsHTML(TRUE);
+              $mailer->ContentType = 'multipart/mixed';
+            }
+            else {
+              $mailer->Body = $body_part;
+              $mailer->IsHTML(FALSE);
+              $mailer->ContentType = 'multipart/mixed';
+            }
+          }
+          // If text/html within the body part, add it to $mailer->Body.
+          elseif (strpos($body_part, 'text/html')) {
+            // Clean up the text.
+            $body_part = trim($this->_remove_headers(trim($body_part)));
+            // Include it as part of the mail object.
+            $mailer->Body = $body_part;
+            $mailer->IsHTML(TRUE);
+            $mailer->ContentType = 'multipart/mixed';
+          }
+          // Add the attachment.
+          elseif (strpos($body_part, 'Content-Disposition: attachment;') && !isset($message['params']['attachments'])) {
+            $file_path     = $this->_get_substring($body_part, 'filename=', '"', '"');
+            $file_name     = $this->_get_substring($body_part, ' name=', '"', '"');
+            $file_encoding = $this->_get_substring($body_part, 'Content-Transfer-Encoding', ' ', "\n");
+            $file_type     = $this->_get_substring($body_part, 'Content-Type', ' ', ';');
+
+            if (file_exists($file_path)) {
+              if (!$mailer->AddAttachment($file_path, $file_name, $file_encoding, $file_type)) {
+                drupal_set_message(t('Attahment could not be found or accessed.'));
+              }
+            }
+            else {
+              // Clean up the text.
+              $body_part = trim($this->_remove_headers(trim($body_part)));
+
+              if (drupal_strtolower($file_encoding) == 'base64') {
+                $attachment = base64_decode($body_part);
+              }
+              elseif (drupal_strtolower($file_encoding) == 'quoted-printable') {
+                $attachment = quoted_printable_decode($body_part);
+              }
+              else {
+                $attachment = $body_part;
+              }
+
+              $attachment_new_filename = drupal_tempnam('temporary://', 'smtp');
+              $file_path = file_save_data($attachment, $attachment_new_filename, FILE_EXISTS_REPLACE);
+              $real_path = drupal_realpath($file_path->uri);
+
+              if (!$mailer->AddAttachment($real_path, $file_name)) {
+                drupal_set_message(t('Attachment could not be found or accessed.'));
+              }
+            }
+          }
+        }
+        break;
+
+      default:
+        $mailer->Body = $body;
+        break;
+    }
+
+    // Process mimemail attachments, which are prepared in mimemail_mail().
+    if (isset($message['params']['attachments'])) {
+      foreach ($message['params']['attachments'] as $attachment) {
+        if (isset($attachment['filecontent'])) {
+          $mailer->AddStringAttachment($attachment['filecontent'], $attachment['filename'], 'base64', $attachment['filemime']);
+        }
+        if (isset($attachment['filepath'])) {
+          $filename = isset($attachment['filename']) ? $attachment['filename'] : basename($attachment['filepath']);
+          $filemime = isset($attachment['filemime']) ? $attachment['filemime'] : file_get_mimetype($attachment['filepath']);
+          $mailer->AddAttachment($attachment['filepath'], $filename, 'base64', $filemime);
+        }
+      }
+    }
+
+    // Set the authentication settings.
+    $username = variable_get('smtp_username', '');
+    $password = variable_get('smtp_password', '');
+
+    // If username and password are given, use SMTP authentication.
+    if ($username != '' && $password != '') {
+      $mailer->SMTPAuth = TRUE;
+      $mailer->Username = $username;
+      $mailer->Password = $password;
+    }
+
+
+    // Set the protocol prefix for the smtp host.
+    switch (variable_get('smtp_protocol', 'standard')) {
+      case 'ssl':
+        $mailer->SMTPSecure = 'ssl';
+        break;
+
+      case 'tls':
+        $mailer->SMTPSecure = 'tls';
+        break;
+
+      default:
+        $mailer->SMTPSecure = '';
+    }
+
+
+    // Set other connection settings.
+    $mailer->Host = variable_get('smtp_host', '') . ';' . variable_get('smtp_hostbackup', '');
+    $mailer->Port = variable_get('smtp_port', '25');
+    $mailer->Mailer = 'smtp';
+
+    $mailerArr = array(
+      'mailer' => $mailer,
+      'to' => $to,
+      'from' => $from,
+    );
+    if (variable_get('smtp_queue', FALSE)) {
+      watchdog('smtp', 'Queue sending mail to: @to', array('@to' => $to));
+      smtp_send_queue($mailerArr);
+    }
+    else {
+      return _smtp_mailer_send($mailerArr);
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * Splits the input into parts based on the given boundary.
+   *
+   * Swiped from Mail::MimeDecode, with modifications based on Drupal's coding
+   * standards and this bug report: http://pear.php.net/bugs/bug.php?id=6495
+   *
+   * @param input
+   *   A string containing the body text to parse.
+   * @param boundary
+   *   A string with the boundary string to parse on.
+   * @return
+   *   An array containing the resulting mime parts
+   */
+  protected function _boundary_split($input, $boundary) {
+    $parts       = array();
+    $bs_possible = drupal_substr($boundary, 2, -2);
+    $bs_check    = '\"' . $bs_possible . '\"';
+
+    if ($boundary == $bs_check) {
+      $boundary = $bs_possible;
+    }
+
+    $tmp = explode('--' . $boundary, $input);
+
+    for ($i = 1; $i < count($tmp); $i++) {
+      if (trim($tmp[$i])) {
+        $parts[] = $tmp[$i];
+      }
+    }
+
+    return $parts;
+  }  //  End of _smtp_boundary_split().
+
+  /**
+   * Strips the headers from the body part.
+   *
+   * @param input
+   *   A string containing the body part to strip.
+   * @return
+   *   A string with the stripped body part.
+   */
+  protected function _remove_headers($input) {
+    $part_array = explode("\n", $input);
+
+    // will strip these headers according to RFC2045
+    $headers_to_strip = array( 'Content-Type', 'Content-Transfer-Encoding', 'Content-ID', 'Content-Disposition');
+    $pattern = '/^(' . implode('|', $headers_to_strip) . '):/';
+
+    while (count($part_array) > 0) {
+
+      // ignore trailing spaces/newlines
+      $line = rtrim($part_array[0]);
+
+      // if the line starts with a known header string
+      if (preg_match($pattern, $line)) {
+        $line = rtrim(array_shift($part_array));
+        // remove line containing matched header.
+
+        // if line ends in a ';' and the next line starts with four spaces, it's a continuation
+        // of the header split onto the next line. Continue removing lines while we have this condition.
+        while (substr($line, -1) == ';' && count($part_array) > 0 && substr($part_array[0], 0, 4) == '    ') {
+          $line = rtrim(array_shift($part_array));
+        }
+      }
+      else {
+        // no match header, must be past headers; stop searching.
+        break;
+      }
+    }
+
+    $output = implode("\n", $part_array);
+    return $output;
+  }  //  End of _smtp_remove_headers().
+
+  /**
+   * Returns a string that is contained within another string.
+   *
+   * Returns the string from within $source that is some where after $target
+   * and is between $beginning_character and $ending_character.
+   *
+   * @param $source
+   *   A string containing the text to look through.
+   * @param $target
+   *   A string containing the text in $source to start looking from.
+   * @param $beginning_character
+   *   A string containing the character just before the sought after text.
+   * @param $ending_character
+   *   A string containing the character just after the sought after text.
+   * @return
+   *   A string with the text found between the $beginning_character and the
+   *   $ending_character.
+   */
+  protected function _get_substring($source, $target, $beginning_character, $ending_character) {
+    $search_start     = strpos($source, $target) + 1;
+    $first_character  = strpos($source, $beginning_character, $search_start) + 1;
+    $second_character = strpos($source, $ending_character, $first_character) + 1;
+    $substring        = drupal_substr($source, $first_character, $second_character - $first_character);
+    $string_length    = drupal_strlen($substring) - 1;
+
+    if ($substring[$string_length] == $ending_character) {
+      $substring = drupal_substr($substring, 0, $string_length);
+    }
+
+    return $substring;
+  }  //  End of _smtp_get_substring().
+}
diff --git a/profiles/wcm_base/modules/contrib/smtp/smtp.module b/profiles/wcm_base/modules/contrib/smtp/smtp.module
new file mode 100644
index 00000000..9c15c530
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/smtp.module
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * @file
+ * Enables Drupal to send e-mail directly to an SMTP server.
+ *
+ * This module uses a customized extract of the PHPMailer
+ * library (originally by Brent R. Matzelle, now maintained
+ *  by Codeworx Tech.) relicensed from LGPL to GPL, included
+ * as a part of the module.
+ *
+ * Overriding mail handling in Drupal to make SMTP the default
+ * transport layer, requires to change the mail_system variable's
+ * default value array('default-system' => 'DefaultMailSystem').
+ * This module uses array('default-system' => 'SmtpMailSystem').
+ */
+
+/**
+ * Implements hook_help().
+ */
+function smtp_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#smtp':
+      return t('Allow for site emails to be sent through an SMTP server of your choice.');
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function smtp_menu() {
+  $items['admin/config/system/smtp'] = array(
+    'title'            => 'SMTP Authentication Support',
+    'page callback'    => 'drupal_get_form',
+    'page arguments'   => array('smtp_admin_settings'),
+    'access arguments' => array('administer smtp module'),
+    'description'      => 'Allow for site emails to be sent through an SMTP server of your choice.',
+    'file'             => 'smtp.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function smtp_permission() {
+  return array(
+    'administer smtp module' => array(
+      'title' => t('Administer SMTP Authentication Support module'),
+      'description' => t('Perform administration tasks for SMTP Authentication Support module.'))
+  );
+}
+
+
+/**
+ * Implements hook_mail().
+ */
+function smtp_mail($key, &$message, $params) {
+  if ($key == 'smtp-test') {
+    $message['subject'] = $params['subject'];
+    $message['body'] = $params['body'];
+  }
+}
+
+/**
+ * Implementation of hook_cron_queue_info().
+ */
+function smtp_cron_queue_info() {
+  $queues['smtp_send_queue'] = array(
+    'worker callback' => 'smtp_send_queue_runner',
+    'time' => 60, // This is the max run time per cron run in seconds.
+  );
+  return $queues;
+}
+
+/**
+ * smtp_send_queue queuer.
+ */
+function smtp_send_queue($mailerObj) {
+  $queue = DrupalQueue::get('smtp_send_queue');
+  $queue->createItem($mailerObj);
+}
+
+function smtp_send_queue_runner($variables) {
+  _smtp_mailer_send($variables);
+}
+
+function _smtp_mailer_send($variables) {
+  $mailer = $variables['mailer'];
+  $to = $variables['to'];
+  $from = $variables['from'];
+
+  // Let the people know what is going on.
+  watchdog('smtp', 'Sending mail to: @to', array('@to' => $to));
+
+  // Try to send e-mail. If it fails, set watchdog entry.
+  if (!$mailer->Send()) {
+    watchdog('smtp', 'Error sending e-mail from @from to @to : !error_message', array('@from' => $from, '@to' => $to, '!error_message' => $mailer->ErrorInfo), WATCHDOG_ERROR);
+    return FALSE;
+  }
+
+  $mailer->SmtpClose();
+  return TRUE;
+}
\ No newline at end of file
diff --git a/profiles/wcm_base/modules/contrib/smtp/smtp.phpmailer.inc b/profiles/wcm_base/modules/contrib/smtp/smtp.phpmailer.inc
new file mode 100644
index 00000000..e0c0747c
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/smtp.phpmailer.inc
@@ -0,0 +1,2347 @@
+<?php
+/**
+ * @file
+ * The mail handler class in smtp module, based on code of the phpmailer library,
+ * customized and relicensed to GPLv2.
+ *
+ */
+
+/*~ class.phpmailer.php
+Orginal release information:
+.---------------------------------------------------------------------------.
+|  Software: PHPMailer - PHP email class                                    |
+|   Version: 5.1                                                            |
+|   Contact: via sourceforge.net support pages (also www.worxware.com)      |
+|      Info: http://phpmailer.sourceforge.net                               |
+|   Support: http://sourceforge.net/projects/phpmailer/                     |
+| ------------------------------------------------------------------------- |
+|     Admin: Andy Prevost (project admininistrator)                         |
+|   Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
+|          : Marcus Bointon (coolbru) coolbru@users.sourceforge.net         |
+|   Founder: Brent R. Matzelle (original founder)                           |
+| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved.               |
+| Copyright (c) 2001-2003, Brent R. Matzelle                                |
+| ------------------------------------------------------------------------- |
+|   License: Distributed under the Lesser General Public License (LGPL)     |
+|            http://www.gnu.org/copyleft/lesser.html                        |
+| This program is distributed in the hope that it will be useful - WITHOUT  |
+| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     |
+| FITNESS FOR A PARTICULAR PURPOSE.                                         |
+| ------------------------------------------------------------------------- |
+| We offer a number of paid services (www.worxware.com):                    |
+| - Web Hosting on highly optimized fast and secure servers                 |
+| - Technology Consulting                                                   |
+| - Oursourcing (highly qualified programmers and graphic designers)        |
+'---------------------------------------------------------------------------'
+*/
+
+/**
+ * PHPMailer - PHP email transport class
+ * NOTE: Requires PHP version 5 or later
+ * @package PHPMailer
+ * @author Andy Prevost
+ * @author Marcus Bointon
+ * @copyright 2004 - 2009 Andy Prevost
+ */
+
+class PHPMailer {
+
+  /////////////////////////////////////////////////
+  // PROPERTIES, PUBLIC
+  /////////////////////////////////////////////////
+
+  /**
+   * Email priority (1 = High, 3 = Normal, 5 = low).
+   * @var int
+   */
+  public $Priority          = 3;
+
+  /**
+   * Sets the CharSet of the message.
+   * @var string
+   */
+  public $CharSet           = 'iso-8859-1';
+
+  /**
+   * Sets the Content-type of the message.
+   * @var string
+   */
+  public $ContentType       = 'text/plain';
+
+  /**
+   * Sets the Encoding of the message. Options for this are
+   *  "8bit", "7bit", "binary", "base64", and "quoted-printable".
+   * @var string
+   */
+  public $Encoding          = '8bit';
+
+  /**
+   * Holds the most recent mailer error message.
+   * @var string
+   */
+  public $ErrorInfo         = '';
+
+  /**
+   * Sets the From email address for the message.
+   * @var string
+   */
+  public $From              = 'root@localhost';
+
+  /**
+   * Sets the From name of the message.
+   * @var string
+   */
+  public $FromName          = 'Root User';
+
+  /**
+   * Sets the Sender email (Return-Path) of the message.  If not empty,
+   * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
+   * @var string
+   */
+  public $Sender            = '';
+
+  /**
+   * Sets the Subject of the message.
+   * @var string
+   */
+  public $Subject           = '';
+
+  /**
+   * Sets the Body of the message.  This can be either an HTML or text body.
+   * If HTML then run IsHTML(TRUE).
+   * @var string
+   */
+  public $Body              = '';
+
+  /**
+   * Sets the text-only body of the message.  This automatically sets the
+   * email to multipart/alternative.  This body can be read by mail
+   * clients that do not have HTML email capability such as mutt. Clients
+   * that can read HTML will view the normal Body.
+   * @var string
+   */
+  public $AltBody           = '';
+
+  /**
+   * Sets word wrapping on the body of the message to a given number of
+   * characters.
+   * @var int
+   */
+  public $WordWrap          = 0;
+
+  /**
+   * Method to send mail: ("mail", "sendmail", or "smtp").
+   * @var string
+   */
+  public $Mailer            = 'mail';
+
+  /**
+   * Sets the path of the sendmail program.
+   * @var string
+   */
+  public $Sendmail          = '/usr/sbin/sendmail';
+
+  /**
+   * Path to PHPMailer plugins.  Useful if the SMTP class
+   * is in a different directory than the PHP include path.
+   * @var string
+   */
+  public $PluginDir         = '';
+
+  /**
+   * Sets the email address that a reading confirmation will be sent.
+   * @var string
+   */
+  public $ConfirmReadingTo  = '';
+
+  /**
+   * Sets the hostname to use in Message-Id and Received headers
+   * and as default HELO string. If empty, the value returned
+   * by SERVER_NAME is used or 'localhost.localdomain'.
+   * @var string
+   */
+  public $Hostname          = '';
+
+  /**
+   * Sets the message ID to be used in the Message-Id header.
+   * If empty, a unique id will be generated.
+   * @var string
+   */
+  public $MessageID         = '';
+
+  /////////////////////////////////////////////////
+  // PROPERTIES FOR SMTP
+  /////////////////////////////////////////////////
+
+  /**
+   * Sets the SMTP hosts.  All hosts must be separated by a
+   * semicolon.  You can also specify a different port
+   * for each host by using this format: [hostname:port]
+   * (e.g. "smtp1.example.com:25;smtp2.example.com").
+   * Hosts will be tried in order.
+   * @var string
+   */
+  public $Host          = 'localhost';
+
+  /**
+   * Sets the default SMTP server port.
+   * @var int
+   */
+  public $Port          = 25;
+
+  /**
+   * Sets the SMTP HELO of the message (Default is $Hostname).
+   * @var string
+   */
+  public $Helo          = '';
+
+  /**
+   * Sets connection prefix.
+   * Options are "", "ssl" or "tls"
+   * @var string
+   */
+  public $SMTPSecure    = '';
+
+  /**
+   * Sets SMTP authentication. Utilizes the Username and Password variables.
+   * @var bool
+   */
+  public $SMTPAuth      = FALSE;
+
+  /**
+   * Sets SMTP username.
+   * @var string
+   */
+  public $Username      = '';
+
+  /**
+   * Sets SMTP password.
+   * @var string
+   */
+  public $Password      = '';
+
+  /**
+   * Sets the SMTP server timeout in seconds.
+   * This function will not work with the win32 version.
+   * @var int
+   */
+  public $Timeout       = 10;
+
+  /**
+   * Sets SMTP class debugging on or off.
+   * @var bool
+   */
+  public $SMTPDebug     = FALSE;
+
+  /**
+   * Prevents the SMTP connection from being closed after each mail
+   * sending.  If this is set to TRUE then to close the connection
+   * requires an explicit call to SmtpClose().
+   * @var bool
+   */
+  public $SMTPKeepAlive = FALSE;
+
+  /**
+   * Provides the ability to have the TO field process individual
+   * emails, instead of sending to entire TO addresses
+   * @var bool
+   */
+  public $SingleTo      = FALSE;
+
+   /**
+   * If SingleTo is TRUE, this provides the array to hold the email addresses
+   * @var bool
+   */
+  public $SingleToArray = array();
+
+ /**
+   * Provides the ability to change the line ending
+   * @var string
+   */
+  public $LE              = "\n";
+
+  /**
+   * Used with DKIM DNS Resource Record
+   * @var string
+   */
+  public $DKIM_selector   = 'phpmailer';
+
+  /**
+   * Used with DKIM DNS Resource Record
+   * optional, in format of email address 'you@yourdomain.com'
+   * @var string
+   */
+  public $DKIM_identity   = '';
+
+  /**
+   * Used with DKIM DNS Resource Record
+   * optional, in format of email address 'you@yourdomain.com'
+   * @var string
+   */
+  public $DKIM_domain     = '';
+
+  /**
+   * Used with DKIM DNS Resource Record
+   * optional, in format of email address 'you@yourdomain.com'
+   * @var string
+   */
+  public $DKIM_private    = '';
+
+  /**
+   * Callback Action function name
+   * the function that handles the result of the send email action. Parameters:
+   *   bool    $result        result of the send action
+   *   string  $to            email address of the recipient
+   *   string  $cc            cc email addresses
+   *   string  $bcc           bcc email addresses
+   *   string  $subject       the subject
+   *   string  $body          the email body
+   * @var string
+   */
+  public $action_function = ''; //'callbackAction';
+
+  /**
+   * Sets the PHPMailer Version number
+   * @var string
+   */
+  public $Version         = '5.1';
+
+  /////////////////////////////////////////////////
+  // PROPERTIES, PRIVATE AND PROTECTED
+  /////////////////////////////////////////////////
+
+  private   $smtp           = NULL;
+  private   $to             = array();
+  private   $cc             = array();
+  private   $bcc            = array();
+  private   $ReplyTo        = array();
+  private   $all_recipients = array();
+  private   $attachment     = array();
+  private   $CustomHeader   = array();
+  private   $message_type   = '';
+  private   $boundary       = array();
+  private   $error_count    = 0;
+  private   $sign_cert_file = "";
+  private   $sign_key_file  = "";
+  private   $sign_key_pass  = "";
+  private   $exceptions     = FALSE;
+
+  /////////////////////////////////////////////////
+  // CONSTANTS
+  /////////////////////////////////////////////////
+
+  const STOP_MESSAGE  = 0; // message only, continue processing
+  const STOP_CONTINUE = 1; // message?, likely ok to continue processing
+  const STOP_CRITICAL = 2; // message, plus full stop, critical error reached
+
+  /////////////////////////////////////////////////
+  // METHODS, VARIABLES
+  /////////////////////////////////////////////////
+
+  /**
+   * Constructor
+   * @param boolean $exceptions Should we throw external exceptions?
+   */
+  public function __construct($exceptions = FALSE) {
+    $this->exceptions = ($exceptions == TRUE);
+  }
+
+  /**
+   * Sets message type to HTML.
+   * @param bool $ishtml
+   * @return void
+   */
+  public function IsHTML($ishtml = TRUE) {
+    if ($ishtml) {
+      $this->ContentType = $this->is_html = 'text/html';
+    }
+    else {
+      $this->ContentType = $this->is_html = 'text/plain';
+    }
+  }
+
+  /**
+   * Sets Mailer to send message using SMTP.
+   * @return void
+   */
+  public function IsSMTP() {
+    $this->Mailer = 'smtp';
+  }
+
+  /**
+   * Sets Mailer to send message using PHP mail() function.
+   * @return void
+   */
+  public function IsMail() {
+    $this->Mailer = 'mail';
+  }
+
+  /**
+   * Sets Mailer to send message using the $Sendmail program.
+   * @return void
+   */
+  public function IsSendmail() {
+    if (!stristr(ini_get('sendmail_path'), 'sendmail')) {
+      $this->Sendmail = '/var/qmail/bin/sendmail';
+    }
+    $this->Mailer = 'sendmail';
+  }
+
+  /**
+   * Sets Mailer to send message using the qmail MTA.
+   * @return void
+   */
+  public function IsQmail() {
+    if (stristr(ini_get('sendmail_path'), 'qmail')) {
+      $this->Sendmail = '/var/qmail/bin/sendmail';
+    }
+    $this->Mailer = 'sendmail';
+  }
+
+  /////////////////////////////////////////////////
+  // METHODS, RECIPIENTS
+  /////////////////////////////////////////////////
+
+  /**
+   * Adds a "To" address.
+   * @param string $address
+   * @param string $name
+   * @return boolean TRUE on success, FALSE if address already used
+   */
+  public function AddAddress($address, $name = '') {
+    return $this->AddAnAddress('to', $address, $name);
+  }
+
+  /**
+   * Adds a "Cc" address.
+   * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
+   * @param string $address
+   * @param string $name
+   * @return boolean TRUE on success, FALSE if address already used
+   */
+  public function AddCC($address, $name = '') {
+    return $this->AddAnAddress('cc', $address, $name);
+  }
+
+  /**
+   * Adds a "Bcc" address.
+   * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
+   * @param string $address
+   * @param string $name
+   * @return boolean TRUE on success, FALSE if address already used
+   */
+  public function AddBCC($address, $name = '') {
+    return $this->AddAnAddress('bcc', $address, $name);
+  }
+
+  /**
+   * Adds a "Reply-to" address.
+   * @param string $address
+   * @param string $name
+   * @return boolean
+   */
+  public function AddReplyTo($address, $name = '') {
+    return $this->AddAnAddress('ReplyTo', $address, $name);
+  }
+
+  /**
+   * Adds an address to one of the recipient arrays
+   * Addresses that have been added already return FALSE, but do not throw exceptions
+   * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
+   * @param string $address The email address to send to
+   * @param string $name
+   * @return boolean TRUE on success, FALSE if address already used or invalid in some way
+   * @access private
+   */
+  private function AddAnAddress($kind, $address, $name = '') {
+    if (!preg_match('/^(to|cc|bcc|ReplyTo)$/', $kind)) {
+      echo 'Invalid recipient array: ' . kind;
+      return FALSE;
+    }
+    $address = trim($address);
+    $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+    if (!self::ValidateAddress($address)) {
+      $this->SetError(t('Invalid address') . ': ' . $address);
+      if ($this->exceptions) {
+        throw new phpmailerException(t('Invalid address') . ': ' . $address);
+      }
+      echo t('Invalid address') . ': ' . $address;
+      return FALSE;
+    }
+    if ($kind != 'ReplyTo') {
+      if (!isset($this->all_recipients[strtolower($address)])) {
+        array_push($this->$kind, array($address, $name));
+        $this->all_recipients[strtolower($address)] = TRUE;
+        return TRUE;
+      }
+    }
+    else {
+      if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
+        $this->ReplyTo[strtolower($address)] = array($address, $name);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Set the From and FromName properties
+ * @param string $address
+ * @param string $name
+ * @return boolean
+ */
+  public function SetFrom($address, $name = '', $auto=1) {
+    $address = trim($address);
+    $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+    if (!self::ValidateAddress($address)) {
+      $this->SetError(t('Invalid address') . ': ' . $address);
+      if ($this->exceptions) {
+        throw new phpmailerException(t('Invalid address') . ': ' . $address);
+      }
+      echo t('Invalid address') . ': ' . $address;
+      return FALSE;
+    }
+    $this->From = $address;
+    $this->FromName = $name;
+    if ($auto) {
+      if (empty($this->ReplyTo)) {
+        $this->AddAnAddress('ReplyTo', $address, $name);
+      }
+      if (empty($this->Sender)) {
+        $this->Sender = $address;
+      }
+    }
+    return TRUE;
+  }
+
+  /**
+   * Check that a string looks roughly like an email address should
+   * Static so it can be used without instantiation
+   * Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator
+   * Conforms approximately to RFC2822
+   * @link http://www.hexillion.com/samples/#Regex Original pattern found here
+   * @param string $address The email address to check
+   * @return boolean
+   * @static
+   * @access public
+   */
+  public static function ValidateAddress($address) {
+    if (function_exists('filter_var')) { //Introduced in PHP 5.2
+      if (filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
+        return FALSE;
+      }
+      else {
+        return TRUE;
+      }
+    }
+    else {
+      return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
+    }
+  }
+
+  /////////////////////////////////////////////////
+  // METHODS, MAIL SENDING
+  /////////////////////////////////////////////////
+
+  /**
+   * Creates message and assigns Mailer. If the message is
+   * not sent successfully then it returns FALSE.  Use the ErrorInfo
+   * variable to view description of the error.
+   * @return bool
+   */
+  public function Send() {
+    try {
+      if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
+        throw new phpmailerException(t('You must provide at least one recipient email address.'), self::STOP_CRITICAL);
+      }
+
+      // Set whether the message is multipart/alternative
+      if (!empty($this->AltBody)) {
+        $this->ContentType = 'multipart/alternative';
+      }
+
+      $this->error_count = 0; // reset errors
+      $this->SetMessageType();
+      $header = $this->CreateHeader();
+      $body = $this->CreateBody();
+
+      if (empty($this->Body)) {
+        throw new phpmailerException(t('Message body empty'), self::STOP_CRITICAL);
+      }
+
+      // digitally sign with DKIM if enabled
+      if ($this->DKIM_domain && $this->DKIM_private) {
+        $header_dkim = $this->DKIM_Add($header, $this->Subject, $body);
+        $header = str_replace("\r\n", "\n", $header_dkim) . $header;
+      }
+
+      // Choose the mailer and send through it
+      switch ($this->Mailer) {
+        case 'sendmail':
+          return $this->SendmailSend($header, $body);
+        case 'smtp':
+          return $this->SmtpSend($header, $body);
+        default:
+          return $this->MailSend($header, $body);
+      }
+
+    } catch (phpmailerException $e) {
+      $this->SetError($e->getMessage());
+      if ($this->exceptions) {
+        throw $e;
+      }
+      echo $e->getMessage() . "\n";
+      return FALSE;
+    }
+  }
+
+  /**
+   * Sends mail using the $Sendmail program.
+   * @param string $header The message headers
+   * @param string $body The message body
+   * @access protected
+   * @return bool
+   */
+  protected function SendmailSend($header, $body) {
+    if ($this->Sender != '') {
+      $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
+    }
+    else {
+      $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));
+    }
+    if ($this->SingleTo === TRUE) {
+      foreach ($this->SingleToArray as $key => $val) {
+        if (!@$mail = popen($sendmail, 'w')) {
+          throw new phpmailerException(t('Could not execute: !smail', array('!smail' => $this->Sendmail)), self::STOP_CRITICAL);
+        }
+        fputs($mail, "To: " . $val . "\n");
+        fputs($mail, $header);
+        fputs($mail, $body);
+        $result = pclose($mail);
+        // implement call back function if it exists
+        $isSent = ($result == 0) ? 1 : 0;
+        $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body);
+        if ($result != 0) {
+          throw new phpmailerException(t('Could not execute: !smail', array('!smail' => $this->Sendmail)), self::STOP_CRITICAL);
+        }
+      }
+    }
+    else {
+      if (!@$mail = popen($sendmail, 'w')) {
+        throw new phpmailerException(t('Could not execute: !smail', array('!smail' => $this->Sendmail)), self::STOP_CRITICAL);
+      }
+      fputs($mail, $header);
+      fputs($mail, $body);
+      $result = pclose($mail);
+      // implement call back function if it exists
+      $isSent = ($result == 0) ? 1 : 0;
+      $this->doCallback($isSent, $this->to, $this->cc, $this->bcc, $this->Subject, $body);
+      if ($result != 0) {
+        throw new phpmailerException(t('Could not execute: !smail', array('!smail' => $this->Sendmail)), self::STOP_CRITICAL);
+      }
+    }
+    return TRUE;
+  }
+
+  /**
+   * Sends mail using the PHP mail() function.
+   * @param string $header The message headers
+   * @param string $body The message body
+   * @access protected
+   * @return bool
+   */
+  protected function MailSend($header, $body) {
+    $toArr = array();
+    foreach ($this->to as $t) {
+      $toArr[] = $this->AddrFormat($t);
+    }
+    $to = implode(', ', $toArr);
+
+    $params = sprintf("-oi -f %s", $this->Sender);
+    if ($this->Sender != '' && strlen(ini_get('safe_mode'))< 1) {
+      $old_from = ini_get('sendmail_from');
+      ini_set('sendmail_from', $this->Sender);
+      if ($this->SingleTo === TRUE && count($toArr) > 1) {
+        foreach ($toArr as $key => $val) {
+          $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
+          // implement call back function if it exists
+          $isSent = ($rt == 1) ? 1 : 0;
+          $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body);
+        }
+      }
+      else {
+        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
+        // implement call back function if it exists
+        $isSent = ($rt == 1) ? 1 : 0;
+        $this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body);
+      }
+    }
+    else {
+      if ($this->SingleTo === TRUE && count($toArr) > 1) {
+        foreach ($toArr as $key => $val) {
+          $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
+          // implement call back function if it exists
+          $isSent = ($rt == 1) ? 1 : 0;
+          $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body);
+        }
+      }
+      else {
+        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
+        // implement call back function if it exists
+        $isSent = ($rt == 1) ? 1 : 0;
+        $this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body);
+      }
+    }
+    if (isset($old_from)) {
+      ini_set('sendmail_from', $old_from);
+    }
+    if (!$rt) {
+      throw new phpmailerException(t('Could not instantiate mail function.'), self::STOP_CRITICAL);
+    }
+    return TRUE;
+  }
+
+  /**
+   * Sends mail via SMTP using PhpSMTP
+   * Returns FALSE if there is a bad MAIL FROM, RCPT, or DATA input.
+   * @param string $header The message headers
+   * @param string $body The message body
+   * @uses SMTP
+   * @access protected
+   * @return bool
+   */
+  protected function SmtpSend($header, $body) {
+    $bad_rcpt = array();
+
+    if (!$this->SmtpConnect()) {
+      throw new phpmailerException(t('SMTP Error: Could not connect to SMTP host.'), self::STOP_CRITICAL);
+    }
+    $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
+    if (!$this->smtp->Mail($smtp_from)) {
+      throw new phpmailerException(t('The following From address failed: !from', array('!from' => $smtp_from)), self::STOP_CRITICAL);
+    }
+
+    // Attempt to send attach all recipients
+    foreach ($this->to as $to) {
+      if (!$this->smtp->Recipient($to[0])) {
+        $bad_rcpt[] = $to[0];
+        // implement call back function if it exists
+        $isSent = 0;
+        $this->doCallback($isSent, $to[0], '', '', $this->Subject, $body);
+      }
+      else {
+        // implement call back function if it exists
+        $isSent = 1;
+        $this->doCallback($isSent, $to[0], '', '', $this->Subject, $body);
+      }
+    }
+    foreach ($this->cc as $cc) {
+      if (!$this->smtp->Recipient($cc[0])) {
+        $bad_rcpt[] = $cc[0];
+        // implement call back function if it exists
+        $isSent = 0;
+        $this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body);
+      }
+      else {
+        // implement call back function if it exists
+        $isSent = 1;
+        $this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body);
+      }
+    }
+    foreach ($this->bcc as $bcc) {
+      if (!$this->smtp->Recipient($bcc[0])) {
+        $bad_rcpt[] = $bcc[0];
+        // implement call back function if it exists
+        $isSent = 0;
+        $this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body);
+      }
+      else {
+        // implement call back function if it exists
+        $isSent = 1;
+        $this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body);
+      }
+    }
+
+
+    if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses
+      $badaddresses = implode(', ', $bad_rcpt);
+      throw new phpmailerException(t('SMTP Error: The following recipients failed: !bad', array('!bad' => $badaddresses)));
+    }
+    if (!$this->smtp->Data($header . $body)) {
+      throw new phpmailerException(t('SMTP Error: Data not accepted.'), self::STOP_CRITICAL);
+    }
+    if ($this->SMTPKeepAlive == TRUE) {
+      $this->smtp->Reset();
+    }
+    return TRUE;
+  }
+
+  /**
+   * Initiates a connection to an SMTP server.
+   * Returns FALSE if the operation failed.
+   * @uses SMTP
+   * @access public
+   * @return bool
+   */
+  public function SmtpConnect() {
+    if (is_null($this->smtp)) {
+      $this->smtp = new SMTP();
+    }
+
+    $this->smtp->do_debug = $this->SMTPDebug;
+    $hosts = explode(';', $this->Host);
+    $index = 0;
+    $connection = $this->smtp->Connected();
+
+    // Retry while there is no connection
+    try {
+      while ($index < count($hosts) && !$connection) {
+        $hostinfo = array();
+        if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) {
+          $host = $hostinfo[1];
+          $port = $hostinfo[2];
+        }
+        else {
+          $host = $hosts[$index];
+          $port = $this->Port;
+        }
+
+        $tls = ($this->SMTPSecure == 'tls');
+        $ssl = ($this->SMTPSecure == 'ssl');
+
+        if ($this->smtp->Connect(($ssl ? 'ssl://':'') . $host, $port, $this->Timeout)) {
+
+          $hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname());
+          $this->smtp->Hello($hello);
+
+          if ($tls) {
+            if (!$this->smtp->StartTLS()) {
+              throw new phpmailerException(t('StartTLS not supported by server or could not initiate session.'));
+            }
+
+            //We must resend HELO after tls negotiation
+            $this->smtp->Hello($hello);
+          }
+
+          $connection = TRUE;
+          if ($this->SMTPAuth) {
+            if (!$this->smtp->Authenticate($this->Username, $this->Password)) {
+              throw new phpmailerException(t('SMTP Error: Could not authenticate.'));
+            }
+          }
+        }
+        $index++;
+        if (!$connection) {
+          throw new phpmailerException(t('SMTP Error: Could not connect to SMTP host.'));
+        }
+      }
+    } catch (phpmailerException $e) {
+      $this->smtp->Reset();
+      throw $e;
+    }
+    return TRUE;
+  }
+
+  /**
+   * Closes the active SMTP session if one exists.
+   * @return void
+   */
+  public function SmtpClose() {
+    if (!is_null($this->smtp)) {
+      if ($this->smtp->Connected()) {
+        $this->smtp->Quit();
+        $this->smtp->Close();
+      }
+    }
+  }
+
+  /////////////////////////////////////////////////
+  // METHODS, MESSAGE CREATION
+  /////////////////////////////////////////////////
+
+  /**
+   * Creates recipient headers.
+   * @access public
+   * @return string
+   */
+  public function AddrAppend($type, $addr) {
+    $addr_str = $type . ': ';
+    $addresses = array();
+    foreach ($addr as $a) {
+      $addresses[] = $this->AddrFormat($a);
+    }
+    $addr_str .= implode(', ', $addresses);
+    $addr_str .= $this->LE;
+
+    return $addr_str;
+  }
+
+  /**
+   * Formats an address correctly.
+   * @access public
+   * @return string
+   */
+  public function AddrFormat($addr) {
+    if (empty($addr[1])) {
+      return $this->SecureHeader($addr[0]);
+    }
+    else {
+      return $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">";
+    }
+  }
+
+  /**
+   * Wraps message for use with mailers that do not
+   * automatically perform wrapping and for quoted-printable.
+   * Original written by philippe.
+   * @param string $message The message to wrap
+   * @param integer $length The line length to wrap to
+   * @param boolean $qp_mode Whether to run in Quoted-Printable mode
+   * @access public
+   * @return string
+   */
+  public function WrapText($message, $length, $qp_mode = FALSE) {
+    $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
+    // If utf-8 encoding is used, we will need to make sure we don't
+    // split multibyte characters when we wrap
+    $is_utf8 = (strtolower($this->CharSet) == "utf-8");
+
+    $message = $this->FixEOL($message);
+    if (substr($message, -1) == $this->LE) {
+      $message = substr($message, 0, -1);
+    }
+
+    $line = explode($this->LE, $message);
+    $message = '';
+    for ($i=0 ;$i < count($line); $i++) {
+      $line_part = explode(' ', $line[$i]);
+      $buf = '';
+      for ($e = 0; $e<count($line_part); $e++) {
+        $word = $line_part[$e];
+        if ($qp_mode and (strlen($word) > $length)) {
+          $space_left = $length - strlen($buf) - 1;
+          if ($e != 0) {
+            if ($space_left > 20) {
+              $len = $space_left;
+              if ($is_utf8) {
+                $len = $this->UTF8CharBoundary($word, $len);
+              }
+              elseif (substr($word, $len - 1, 1) == "=") {
+                $len--;
+              }
+              elseif (substr($word, $len - 2, 1) == "=") {
+                $len -= 2;
+              }
+              $part = substr($word, 0, $len);
+              $word = substr($word, $len);
+              $buf .= ' ' . $part;
+              $message .= $buf . sprintf("=%s", $this->LE);
+            }
+            else {
+              $message .= $buf . $soft_break;
+            }
+            $buf = '';
+          }
+          while (strlen($word) > 0) {
+            $len = $length;
+            if ($is_utf8) {
+              $len = $this->UTF8CharBoundary($word, $len);
+            }
+            elseif (substr($word, $len - 1, 1) == "=") {
+              $len--;
+            }
+            elseif (substr($word, $len - 2, 1) == "=") {
+              $len -= 2;
+            }
+            $part = substr($word, 0, $len);
+            $word = substr($word, $len);
+
+            if (strlen($word) > 0) {
+              $message .= $part . sprintf("=%s", $this->LE);
+            }
+            else {
+              $buf = $part;
+            }
+          }
+        }
+        else {
+          $buf_o = $buf;
+          $buf .= ($e == 0) ? $word : (' ' . $word);
+
+          if (strlen($buf) > $length and $buf_o != '') {
+            $message .= $buf_o . $soft_break;
+            $buf = $word;
+          }
+        }
+      }
+      $message .= $buf . $this->LE;
+    }
+
+    return $message;
+  }
+
+  /**
+   * Finds last character boundary prior to maxLength in a utf-8
+   * quoted (printable) encoded string.
+   * Original written by Colin Brown.
+   * @access public
+   * @param string $encodedText utf-8 QP text
+   * @param int    $maxLength   find last character boundary prior to this length
+   * @return int
+   */
+  public function UTF8CharBoundary($encodedText, $maxLength) {
+    $foundSplitPos = FALSE;
+    $lookBack = 3;
+    while (!$foundSplitPos) {
+      $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
+      $encodedCharPos = strpos($lastChunk, "=");
+      if ($encodedCharPos !== FALSE) {
+        // Found start of encoded character byte within $lookBack block.
+        // Check the encoded byte value (the 2 chars after the '=')
+        $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
+        $dec = hexdec($hex);
+        if ($dec < 128) { // Single byte character.
+          // If the encoded char was found at pos 0, it will fit
+          // otherwise reduce maxLength to start of the encoded char
+          $maxLength = ($encodedCharPos == 0) ? $maxLength :
+          $maxLength - ($lookBack - $encodedCharPos);
+          $foundSplitPos = TRUE;
+        }
+        elseif ($dec >= 192) { // First byte of a multi byte character
+          // Reduce maxLength to split at start of character
+          $maxLength = $maxLength - ($lookBack - $encodedCharPos);
+          $foundSplitPos = TRUE;
+        }
+        elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
+          $lookBack += 3;
+        }
+      }
+      else {
+        // No encoded character found
+        $foundSplitPos = TRUE;
+      }
+    }
+    return $maxLength;
+  }
+
+
+  /**
+   * Set the body wrapping.
+   * @access public
+   * @return void
+   */
+  public function SetWordWrap() {
+    if ($this->WordWrap < 1) {
+      return;
+    }
+
+    switch ($this->message_type) {
+      case 'alt':
+      case 'alt_attachments':
+        $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
+        break;
+      default:
+        $this->Body = $this->WrapText($this->Body, $this->WordWrap);
+        break;
+    }
+  }
+
+  /**
+   * Assembles message header.
+   * @access public
+   * @return string The assembled header
+   */
+  public function CreateHeader() {
+    $result = '';
+
+    // Set the boundaries
+    $uniq_id = md5(uniqid(REQUEST_TIME));
+    $this->boundary[1] = 'b1_' . $uniq_id;
+    $this->boundary[2] = 'b2_' . $uniq_id;
+
+    $result .= $this->HeaderLine('Date', self::RFCDate());
+    if ($this->Sender == '') {
+      $result .= $this->HeaderLine('Return-Path', trim($this->From));
+    }
+    else {
+      $result .= $this->HeaderLine('Return-Path', trim($this->Sender));
+    }
+
+    // To be created automatically by mail()
+    if ($this->Mailer != 'mail') {
+      if ($this->SingleTo === TRUE) {
+        foreach ($this->to as $t) {
+          $this->SingleToArray[] = $this->AddrFormat($t);
+        }
+      }
+      else {
+        if (count($this->to) > 0) {
+          $result .= $this->AddrAppend('To', $this->to);
+        }
+        elseif (count($this->cc) == 0) {
+          $result .= $this->HeaderLine('To', 'undisclosed-recipients:;');
+        }
+      }
+    }
+
+    $from = array();
+    $from[0][0] = trim($this->From);
+    $from[0][1] = $this->FromName;
+    $result .= $this->AddrAppend('From', $from);
+
+    // sendmail and mail() extract Cc from the header before sending
+    if (count($this->cc) > 0) {
+      $result .= $this->AddrAppend('Cc', $this->cc);
+    }
+
+    // sendmail and mail() extract Bcc from the header before sending
+    if ((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {
+      $result .= $this->AddrAppend('Bcc', $this->bcc);
+    }
+
+    if (count($this->ReplyTo) > 0) {
+      $result .= $this->AddrAppend('Reply-to', $this->ReplyTo);
+    }
+
+    // mail() sets the subject itself
+    if ($this->Mailer != 'mail') {
+      $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));
+    }
+
+    if ($this->MessageID != '') {
+      $result .= $this->HeaderLine('Message-ID', $this->MessageID);
+    }
+    else {
+      $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
+    }
+    $result .= $this->HeaderLine('X-Priority', $this->Priority);
+    $result .= $this->HeaderLine('X-Mailer', 'PHPMailer ' . $this->Version . ' (phpmailer.sourceforge.net)');
+
+    if ($this->ConfirmReadingTo != '') {
+      $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
+    }
+
+    // Add custom headers
+    for ($index = 0; $index < count($this->CustomHeader); $index++) {
+      $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
+    }
+    if (!$this->sign_key_file) {
+      $result .= $this->HeaderLine('MIME-Version', '1.0');
+      $result .= $this->GetMailMIME();
+    }
+
+    return $result;
+  }
+
+  /**
+   * Returns the message MIME.
+   * @access public
+   * @return string
+   */
+  public function GetMailMIME() {
+    $result = '';
+    switch ($this->message_type) {
+      case 'plain':
+        $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
+        $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet);
+        break;
+      case 'attachments':
+      case 'alt_attachments':
+        if ($this->InlineImageExists()) {
+          $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE);
+        }
+        else {
+          $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');
+          $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
+        }
+        break;
+      case 'alt':
+        $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
+        $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
+        break;
+    }
+
+    if ($this->Mailer != 'mail') {
+      $result .= $this->LE . $this->LE;
+    }
+
+    return $result;
+  }
+
+  /**
+   * Assembles the message body.  Returns an empty string on failure.
+   * @access public
+   * @return string The assembled message body
+   */
+  public function CreateBody() {
+    $body = '';
+
+    if ($this->sign_key_file) {
+      $body .= $this->GetMailMIME();
+    }
+
+    $this->SetWordWrap();
+
+    switch ($this->message_type) {
+      case 'alt':
+        $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');
+        $body .= $this->EncodeString($this->AltBody, $this->Encoding);
+        $body .= $this->LE . $this->LE;
+        $body .= $this->GetBoundary($this->boundary[1], '', 'text/html', '');
+        $body .= $this->EncodeString($this->Body, $this->Encoding);
+        $body .= $this->LE . $this->LE;
+        $body .= $this->EndBoundary($this->boundary[1]);
+        break;
+      case 'plain':
+        $body .= $this->EncodeString($this->Body, $this->Encoding);
+        break;
+      case 'attachments':
+        if ($this->is_html) {
+          $body .= $this->GetBoundary($this->boundary[1], '', $this->is_html, '');
+        }
+        else {
+          $body .= $this->GetBoundary($this->boundary[1], '', '', '');
+        }
+        $body .= $this->EncodeString($this->Body, $this->Encoding);
+        $body .= $this->LE;
+        $body .= $this->AttachAll();
+        break;
+      case 'alt_attachments':
+        $body .= sprintf("--%s%s", $this->boundary[1], $this->LE);
+        $body .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE . $this->LE);
+        $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body
+        $body .= $this->EncodeString($this->AltBody, $this->Encoding);
+        $body .= $this->LE . $this->LE;
+        $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body
+        $body .= $this->EncodeString($this->Body, $this->Encoding);
+        $body .= $this->LE . $this->LE;
+        $body .= $this->EndBoundary($this->boundary[2]);
+        $body .= $this->AttachAll();
+        break;
+    }
+
+    if ($this->IsError()) {
+      $body = '';
+    }
+    elseif ($this->sign_key_file) {
+      try {
+        $file = tempnam('', 'mail');
+        file_put_contents($file, $body); //TODO check this worked
+        $signed = tempnam("", "signed");
+        if (@openssl_pkcs7_sign($file, $signed, "file://" . $this->sign_cert_file, array("file://" . $this->sign_key_file, $this->sign_key_pass), NULL)) {
+          @unlink($file);
+          @unlink($signed);
+          $body = file_get_contents($signed);
+        }
+        else {
+          @unlink($file);
+          @unlink($signed);
+          throw new phpmailerException(t('Signing Error: !err', array('!err' => openssl_error_string())));
+        }
+      } catch (phpmailerException $e) {
+        $body = '';
+        if ($this->exceptions) {
+          throw $e;
+        }
+      }
+    }
+
+    return $body;
+  }
+
+  /**
+   * Returns the start of a message boundary.
+   * @access private
+   */
+  private function GetBoundary($boundary, $charSet, $contentType, $encoding) {
+    $result = '';
+    if ($charSet == '') {
+      $charSet = $this->CharSet;
+    }
+    if ($contentType == '') {
+      $contentType = $this->ContentType;
+    }
+    if ($encoding == '') {
+      $encoding = $this->Encoding;
+    }
+    $result .= $this->TextLine('--' . $boundary);
+    $result .= sprintf("Content-Type: %s; charset = \"%s\"", $contentType, $charSet);
+    $result .= $this->LE;
+    $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding);
+    $result .= $this->LE;
+
+    return $result;
+  }
+
+  /**
+   * Returns the end of a message boundary.
+   * @access private
+   */
+  private function EndBoundary($boundary) {
+    return $this->LE . '--' . $boundary . '--' . $this->LE;
+  }
+
+  /**
+   * Sets the message type.
+   * @access private
+   * @return void
+   */
+  private function SetMessageType() {
+    if (count($this->attachment) < 1 && strlen($this->AltBody) < 1) {
+      $this->message_type = 'plain';
+    }
+    else {
+      if (count($this->attachment) > 0) {
+        $this->message_type = 'attachments';
+      }
+      if (strlen($this->AltBody) > 0 && count($this->attachment) < 1) {
+        $this->message_type = 'alt';
+      }
+      if (strlen($this->AltBody) > 0 && count($this->attachment) > 0) {
+        $this->message_type = 'alt_attachments';
+      }
+    }
+  }
+
+  /**
+   *  Returns a formatted header line.
+   * @access public
+   * @return string
+   */
+  public function HeaderLine($name, $value) {
+    return $name . ': ' . $value . $this->LE;
+  }
+
+  /**
+   * Returns a formatted mail line.
+   * @access public
+   * @return string
+   */
+  public function TextLine($value) {
+    return $value . $this->LE;
+  }
+
+  /////////////////////////////////////////////////
+  // CLASS METHODS, ATTACHMENTS
+  /////////////////////////////////////////////////
+
+  /**
+   * Adds an attachment from a path on the filesystem.
+   * Returns FALSE if the file could not be found
+   * or accessed.
+   * @param string $path Path to the attachment.
+   * @param string $name Overrides the attachment name.
+   * @param string $encoding File encoding (see $Encoding).
+   * @param string $type File extension (MIME) type.
+   * @return bool
+   */
+  public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
+    try {
+      if ( !@is_file($path) ) {
+        throw new phpmailerException(t('Could not access file: !nofile', array('!nofile' => $path)), self::STOP_CONTINUE);
+      }
+      $filename = basename($path);
+      if ( $name == '' ) {
+        $name = $filename;
+      }
+
+      $this->attachment[] = array(
+        0 => $path,
+        1 => $filename,
+        2 => $name,
+        3 => $encoding,
+        4 => $type,
+        5 => FALSE,  // isStringAttachment
+        6 => 'attachment',
+        7 => 0
+      );
+
+    } catch (phpmailerException $e) {
+      $this->SetError($e->getMessage());
+      if ($this->exceptions) {
+        throw $e;
+      }
+      echo $e->getMessage() . "\n";
+      if ( $e->getCode() == self::STOP_CRITICAL ) {
+        return FALSE;
+      }
+    }
+    return TRUE;
+  }
+
+  /**
+  * Return the current array of attachments
+  * @return array
+  */
+  public function GetAttachments() {
+    return $this->attachment;
+  }
+
+  /**
+   * Attaches all fs, string, and binary attachments to the message.
+   * Returns an empty string on failure.
+   * @access private
+   * @return string
+   */
+  private function AttachAll() {
+    // Return text of body
+    $mime = array();
+    $cidUniq = array();
+    $incl = array();
+
+    // Add all attachments
+    foreach ($this->attachment as $attachment) {
+      // Check for string attachment
+      $bString = $attachment[5];
+      if ($bString) {
+        $string = $attachment[0];
+      }
+      else {
+        $path = $attachment[0];
+      }
+
+      if (in_array($attachment[0], $incl)) {
+       continue;
+      }
+
+      $filename    = $attachment[1];
+      $name        = $attachment[2];
+      $encoding    = $attachment[3];
+      $type        = $attachment[4];
+      $disposition = $attachment[6];
+      $cid         = $attachment[7];
+      $incl[]      = $attachment[0];
+
+      if ($disposition == 'inline' && isset($cidUniq[$cid])) {
+       continue;
+      }
+
+      $cidUniq[$cid] = TRUE;
+
+      $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
+      $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE);
+      $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
+
+      if ($disposition == 'inline') {
+        $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
+      }
+
+      $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE . $this->LE);
+
+      // Encode as string attachment
+      if ($bString) {
+        $mime[] = $this->EncodeString($string, $encoding);
+        if ($this->IsError()) {
+          return '';
+        }
+        $mime[] = $this->LE . $this->LE;
+      }
+      else {
+        $mime[] = $this->EncodeFile($path, $encoding);
+        if ($this->IsError()) {
+          return '';
+        }
+        $mime[] = $this->LE . $this->LE;
+      }
+    }
+
+    $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE);
+
+    return join('', $mime);
+  }
+
+  /**
+   * Encodes attachment in requested format.
+   * Returns an empty string on failure.
+   * @param string $path The full path to the file
+   * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
+   * @see EncodeFile()
+   * @access private
+   * @return string
+   */
+  private function EncodeFile($path, $encoding = 'base64') {
+    try {
+      if (!is_readable($path)) {
+        throw new phpmailerException(t('File Error: Could not open file: !nofile', array('!nofile' => $path)), self::STOP_CONTINUE);
+      }
+      if (function_exists('get_magic_quotes')) {
+        function get_magic_quotes() {
+          return FALSE;
+        }
+      }
+      $magic_quotes = get_magic_quotes_runtime();
+      if ($magic_quotes) {
+        if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+          set_magic_quotes_runtime(0);
+        }
+        else {
+          ini_set('magic_quotes_runtime', 0);
+        }
+      }
+      $file_buffer  = file_get_contents($path);
+      $file_buffer  = $this->EncodeString($file_buffer, $encoding);
+      if ($magic_quotes) {
+        if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+          set_magic_quotes_runtime($magic_quotes);
+        }
+        else {
+          ini_set('magic_quotes_runtime', $magic_quotes);
+        }
+      }
+      return $file_buffer;
+    } catch (Exception $e) {
+      $this->SetError($e->getMessage());
+      return '';
+    }
+  }
+
+  /**
+   * Encodes string to requested format.
+   * Returns an empty string on failure.
+   * @param string $str The text to encode
+   * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
+   * @access public
+   * @return string
+   */
+  public function EncodeString($str, $encoding = 'base64') {
+    $encoded = '';
+    switch (strtolower($encoding)) {
+      case 'base64':
+        $encoded = chunk_split(base64_encode($str), 76, $this->LE);
+        break;
+      case '7bit':
+      case '8bit':
+        $encoded = $this->FixEOL($str);
+        //Make sure it ends with a line break
+        if (substr($encoded, -(strlen($this->LE))) != $this->LE)
+          $encoded .= $this->LE;
+        break;
+      case 'binary':
+        $encoded = $str;
+        break;
+      case 'quoted-printable':
+        $encoded = $this->EncodeQP($str);
+        break;
+      default:
+        $this->SetError(t('Unknown encoding: !enc', array('!enc' => $encoding)));
+        break;
+    }
+    return $encoded;
+  }
+
+  /**
+   * Encode a header string to best (shortest) of Q, B, quoted or none.
+   * @access public
+   * @return string
+   */
+  public function EncodeHeader($str, $position = 'text') {
+    $x = 0;
+
+    switch (strtolower($position)) {
+      case 'phrase':
+        if (!preg_match('/[\200-\377]/', $str)) {
+          // Can't use addslashes as we don't know what value has magic_quotes_sybase
+          $encoded = addcslashes($str, "\0..\37\177\\\"");
+          if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
+            return ($encoded);
+          }
+          else {
+            return ("\"$encoded\"");
+          }
+        }
+        $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
+        break;
+      case 'comment':
+        $x = preg_match_all('/[()"]/', $str, $matches);
+        // Fall-through
+      case 'text':
+      default:
+        $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
+        break;
+    }
+
+    if ($x == 0) {
+      return ($str);
+    }
+
+    $maxlen = 75 - 7 - strlen($this->CharSet);
+    // Try to select the encoding which should produce the shortest output
+    if (strlen($str)/3 < $x) {
+      $encoding = 'B';
+      if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) {
+        // Use a custom function which correctly encodes and wraps long
+        // multibyte strings without breaking lines within a character
+        $encoded = $this->Base64EncodeWrapMB($str);
+      }
+      else {
+        $encoded = base64_encode($str);
+        $maxlen -= $maxlen % 4;
+        $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
+      }
+    }
+    else {
+      $encoding = 'Q';
+      $encoded = $this->EncodeQ($str, $position);
+      $encoded = $this->WrapText($encoded, $maxlen, TRUE);
+      $encoded = str_replace('=' . $this->LE, "\n", trim($encoded));
+    }
+
+    $encoded = preg_replace('/^(.*)$/m', " =?" . $this->CharSet . "?$encoding?\\1?=", $encoded);
+    $encoded = trim(str_replace("\n", $this->LE, $encoded));
+
+    return $encoded;
+  }
+
+  /**
+   * Checks if a string contains multibyte characters.
+   * @access public
+   * @param string $str multi-byte text to wrap encode
+   * @return bool
+   */
+  public function HasMultiBytes($str) {
+    if (function_exists('mb_strlen')) {
+      return (strlen($str) > mb_strlen($str, $this->CharSet));
+    }
+    else { // Assume no multibytes (we can't handle without mbstring functions anyway)
+      return FALSE;
+    }
+  }
+
+  /**
+   * Correctly encodes and wraps long multibyte strings for mail headers
+   * without breaking lines within a character.
+   * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php
+   * @access public
+   * @param string $str multi-byte text to wrap encode
+   * @return string
+   */
+  public function Base64EncodeWrapMB($str) {
+    $start = "=?" . $this->CharSet . "?B?";
+    $end = "?=";
+    $encoded = "";
+
+    $mb_length = mb_strlen($str, $this->CharSet);
+    // Each line must have length <= 75, including $start and $end
+    $length = 75 - strlen($start) - strlen($end);
+    // Average multi-byte ratio
+    $ratio = $mb_length / strlen($str);
+    // Base64 has a 4:3 ratio
+    $offset = $avgLength = floor($length * $ratio * .75);
+
+    for ($i = 0; $i < $mb_length; $i += $offset) {
+      $lookBack = 0;
+
+      do {
+        $offset = $avgLength - $lookBack;
+        $chunk = mb_substr($str, $i, $offset, $this->CharSet);
+        $chunk = base64_encode($chunk);
+        $lookBack++;
+      }
+      while (strlen($chunk) > $length);
+
+      $encoded .= $chunk . $this->LE;
+    }
+
+    // Chomp the last linefeed
+    $encoded = substr($encoded, 0, -strlen($this->LE));
+    return $encoded;
+  }
+
+  /**
+  * Encode string to quoted-printable.
+  * Only uses standard PHP, slow, but will always work
+  * @access public
+  * @param string $string the text to encode
+  * @param integer $line_max Number of chars allowed on a line before wrapping
+  * @return string
+  */
+  public function EncodeQPphp( $input = '', $line_max = 76, $space_conv = FALSE) {
+    $hex = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
+    $lines = preg_split('/(?:\r\n|\r|\n)/', $input);
+    $eol = "\r\n";
+    $escape = '=';
+    $output = '';
+    while ( list(, $line) = each($lines) ) {
+      $linlen = strlen($line);
+      $newline = '';
+      for ($i = 0; $i < $linlen; $i++) {
+        $c = substr( $line, $i, 1 );
+        $dec = ord( $c );
+        if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E
+          $c = '=2E';
+        }
+        if ( $dec == 32 ) {
+          if ( $i == ( $linlen - 1 ) ) { // convert space at eol only
+            $c = '=20';
+          }
+          elseif ( $space_conv ) {
+            $c = '=20';
+          }
+        }
+        elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
+          $h2 = floor($dec/16);
+          $h1 = floor($dec%16);
+          $c = $escape . $hex[$h2] . $hex[$h1];
+        }
+        if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
+          $output .= $newline . $escape . $eol; //  soft line break; " =\r\n" is okay
+          $newline = '';
+          // check if newline first character will be point or not
+          if ( $dec == 46 ) {
+            $c = '=2E';
+          }
+        }
+        $newline .= $c;
+      } // end of for
+      $output .= $newline . $eol;
+    } // end of while
+    return $output;
+  }
+
+  /**
+  * Encode string to RFC2045 (6.7) quoted-printable format
+  * Uses a PHP5 stream filter to do the encoding about 64x faster than the old version
+  * Also results in same content as you started with after decoding
+  * @see EncodeQPphp()
+  * @access public
+  * @param string $string the text to encode
+  * @param integer $line_max Number of chars allowed on a line before wrapping
+  * @param boolean $space_conv Dummy param for compatibility with existing EncodeQP function
+  * @return string
+  * @author Marcus Bointon
+  */
+  public function EncodeQP($string, $line_max = 76, $space_conv = FALSE) {
+    if (function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3)
+      return quoted_printable_encode($string);
+    }
+    $filters = stream_get_filters();
+    if (!in_array('convert.*', $filters)) { //Got convert stream filter?
+      return $this->EncodeQPphp($string, $line_max, $space_conv); //Fall back to old implementation
+    }
+    $fp = fopen('php://temp/', 'r+');
+    $string = preg_replace('/\r\n?/', $this->LE, $string); //Normalise line breaks
+    $params = array('line-length' => $line_max, 'line-break-chars' => $this->LE);
+    $s = stream_filter_append($fp, 'convert.quoted-printable-encode', STREAM_FILTER_READ, $params);
+    fputs($fp, $string);
+    rewind($fp);
+    $out = stream_get_contents($fp);
+    stream_filter_remove($s);
+    $out = preg_replace('/^\./m', '=2E', $out); //Encode . if it is first char on a line, workaround for bug in Exchange
+    fclose($fp);
+    return $out;
+  }
+
+  /**
+   * Encode string to q encoding.
+   * @link http://tools.ietf.org/html/rfc2047
+   * @param string $str the text to encode
+   * @param string $position Where the text is going to be used, see the RFC for what that means
+   * @access public
+   * @return string
+   */
+  public function EncodeQ($str, $position = 'text') {
+    // There should not be any EOL in the string
+    $pattern = '';
+    $encoded = str_replace(array("\r", "\n"), '', $str);
+    switch (strtolower($position)) {
+      case 'phrase':
+        // RFC 2047 section 5.3
+        $pattern = '^A-Za-z0-9!*+\/ -';
+        break;
+      /** @noinspection PhpMissingBreakStatementInspection */
+      case 'comment':
+        // RFC 2047 section 5.2
+        $pattern = '\(\)"';
+        // intentional fall-through
+        // for this reason we build the $pattern without including delimiters and []
+      case 'text':
+      default:
+        // RFC 2047 section 5.1
+        // Replace every high ascii, control, =, ? and _ characters
+        $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
+        break;
+    }
+    $matches = array();
+    if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
+      // If the string contains an '=', make sure it's the first thing we replace
+      // so as to avoid double-encoding
+      $s = array_search('=', $matches[0]);
+      if ($s !== false) {
+        unset($matches[0][$s]);
+        array_unshift($matches[0], '=');
+      }
+      foreach (array_unique($matches[0]) as $char) {
+        $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
+      }
+    }
+    // Replace every spaces to _ (more readable than =20)
+    return str_replace(' ', '_', $encoded);
+  }
+
+  /**
+   * Adds a string or binary attachment (non-filesystem) to the list.
+   * This method can be used to attach ascii or binary data,
+   * such as a BLOB record from a database.
+   * @param string $string String attachment data.
+   * @param string $filename Name of the attachment.
+   * @param string $encoding File encoding (see $Encoding).
+   * @param string $type File extension (MIME) type.
+   * @return void
+   */
+  public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') {
+    // Append to $attachment array
+    $this->attachment[] = array(
+      0 => $string,
+      1 => $filename,
+      2 => basename($filename),
+      3 => $encoding,
+      4 => $type,
+      5 => TRUE,  // isStringAttachment
+      6 => 'attachment',
+      7 => 0
+    );
+  }
+
+  /**
+   * Adds an embedded attachment.  This can include images, sounds, and
+   * just about any other document.  Make sure to set the $type to an
+   * image type.  For JPEG images use "image/jpeg" and for GIF images
+   * use "image/gif".
+   * @param string $path Path to the attachment.
+   * @param string $cid Content ID of the attachment.  Use this to identify
+   *        the Id for accessing the image in an HTML form.
+   * @param string $name Overrides the attachment name.
+   * @param string $encoding File encoding (see $Encoding).
+   * @param string $type File extension (MIME) type.
+   * @return bool
+   */
+  public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
+
+    if ( !@is_file($path) ) {
+      $this->SetError(t('Could not access file: !nofile', array('!nofile' => $path)));
+      return FALSE;
+    }
+
+    $filename = basename($path);
+    if ( $name == '' ) {
+      $name = $filename;
+    }
+
+    // Append to $attachment array
+    $this->attachment[] = array(
+      0 => $path,
+      1 => $filename,
+      2 => $name,
+      3 => $encoding,
+      4 => $type,
+      5 => FALSE,  // isStringAttachment
+      6 => 'inline',
+      7 => $cid
+    );
+
+    return TRUE;
+  }
+
+  /**
+   * Returns TRUE if an inline attachment is present.
+   * @access public
+   * @return bool
+   */
+  public function InlineImageExists() {
+    foreach ($this->attachment as $attachment) {
+      if ($attachment[6] == 'inline') {
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+
+  /////////////////////////////////////////////////
+  // CLASS METHODS, MESSAGE RESET
+  /////////////////////////////////////////////////
+
+  /**
+   * Clears all recipients assigned in the TO array.  Returns void.
+   * @return void
+   */
+  public function ClearAddresses() {
+    foreach ($this->to as $to) {
+      unset($this->all_recipients[strtolower($to[0])]);
+    }
+    $this->to = array();
+  }
+
+  /**
+   * Clears all recipients assigned in the CC array.  Returns void.
+   * @return void
+   */
+  public function ClearCCs() {
+    foreach ($this->cc as $cc) {
+      unset($this->all_recipients[strtolower($cc[0])]);
+    }
+    $this->cc = array();
+  }
+
+  /**
+   * Clears all recipients assigned in the BCC array.  Returns void.
+   * @return void
+   */
+  public function ClearBCCs() {
+    foreach ($this->bcc as $bcc) {
+      unset($this->all_recipients[strtolower($bcc[0])]);
+    }
+    $this->bcc = array();
+  }
+
+  /**
+   * Clears all recipients assigned in the ReplyTo array.  Returns void.
+   * @return void
+   */
+  public function ClearReplyTos() {
+    $this->ReplyTo = array();
+  }
+
+  /**
+   * Clears all recipients assigned in the TO, CC and BCC
+   * array.  Returns void.
+   * @return void
+   */
+  public function ClearAllRecipients() {
+    $this->to = array();
+    $this->cc = array();
+    $this->bcc = array();
+    $this->all_recipients = array();
+  }
+
+  /**
+   * Clears all previously set filesystem, string, and binary
+   * attachments.  Returns void.
+   * @return void
+   */
+  public function ClearAttachments() {
+    $this->attachment = array();
+  }
+
+  /**
+   * Clears all custom headers.  Returns void.
+   * @return void
+   */
+  public function ClearCustomHeaders() {
+    $this->CustomHeader = array();
+  }
+
+  /////////////////////////////////////////////////
+  // CLASS METHODS, MISCELLANEOUS
+  /////////////////////////////////////////////////
+
+  /**
+   * Adds the error message to the error container.
+   * @access protected
+   * @return void
+   */
+  protected function SetError($msg) {
+    $this->error_count++;
+    if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
+      $lasterror = $this->smtp->getError();
+      if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {
+        $msg .= '<p>' . t('SMTP server error: !lasterror', array('!lasterror' => $lasterror['smtp_msg'])) . "</p>\n";
+      }
+    }
+    $this->ErrorInfo = $msg;
+  }
+
+  /**
+   * Returns the proper RFC 822 formatted date.
+   * @access public
+   * @return string
+   * @static
+   */
+  public static function RFCDate() {
+    $tz = date('Z');
+    $tzs = ($tz < 0) ? '-' : '+';
+    $tz = abs($tz);
+    $tz = (int)($tz/3600)*100 + ($tz%3600)/60;
+    $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz);
+
+    return $result;
+  }
+
+  /**
+   * Returns the server hostname or 'localhost.localdomain' if unknown.
+   * @access private
+   * @return string
+   */
+  private function ServerHostname() {
+    if (!empty($this->Hostname)) {
+      $result = $this->Hostname;
+    }
+    elseif (isset($_SERVER['SERVER_NAME'])) {
+      $result = $_SERVER['SERVER_NAME'];
+    }
+    else {
+      $result = 'localhost.localdomain';
+    }
+
+    return $result;
+  }
+
+  /**
+   * Returns TRUE if an error occurred.
+   * @access public
+   * @return bool
+   */
+  public function IsError() {
+    return ($this->error_count > 0);
+  }
+
+  /**
+   * Changes every end of line from CR or LF to CRLF.
+   * @access private
+   * @return string
+   */
+  private function FixEOL($str) {
+    $str = str_replace("\r\n", "\n", $str);
+    $str = str_replace("\r", "\n", $str);
+    $str = str_replace("\n", $this->LE, $str);
+    return $str;
+  }
+
+  /**
+   * Adds a custom header.
+   * @access public
+   * @return void
+   */
+  public function AddCustomHeader($custom_header) {
+    $this->CustomHeader[] = explode(':', $custom_header, 2);
+  }
+
+  /**
+   * Evaluates the message and returns modifications for inline images and backgrounds
+   * @access public
+   * @return $message
+   */
+  public function MsgHTML($message, $basedir = '') {
+    preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images);
+    if (isset($images[2])) {
+      foreach ($images[2] as $i => $url) {
+        // do not change urls for absolute images (thanks to corvuscorax)
+        if (!preg_match('#^[A-z]+://#', $url)) {
+          $filename = basename($url);
+          $directory = dirname($url);
+          ($directory == '.')?$directory='':'';
+          $cid = 'cid:' . md5($filename);
+          $ext = pathinfo($filename, PATHINFO_EXTENSION);
+          $mimeType  = self::_mime_types($ext);
+          if ( strlen($basedir) > 1 && substr($basedir, -1) != '/') {
+            $basedir .= '/';
+          }
+          if ( strlen($directory) > 1 && substr($directory, -1) != '/') {
+            $directory .= '/';
+          }
+          if ( $this->AddEmbeddedImage($basedir . $directory . $filename, md5($filename), $filename, 'base64', $mimeType) ) {
+            $message = preg_replace("/" . $images[1][$i] . "=\"" . preg_quote($url, '/') . "\"/Ui", $images[1][$i] . "=\"" . $cid . "\"", $message);
+          }
+        }
+      }
+    }
+    $this->IsHTML(TRUE);
+    $this->Body = $message;
+    $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s', '', $message)));
+    if (!empty($textMsg) && empty($this->AltBody)) {
+      $this->AltBody = html_entity_decode($textMsg);
+    }
+    if (empty($this->AltBody)) {
+      $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n";
+    }
+  }
+
+  /**
+   * Gets the MIME type of the embedded or inline image
+   * @param string File extension
+   * @access public
+   * @return string MIME type of ext
+   * @static
+   */
+  public static function _mime_types($ext = '') {
+    $mimes = array(
+      'hqx'   =>  'application/mac-binhex40',
+      'cpt'   =>  'application/mac-compactpro',
+      'doc'   =>  'application/msword',
+      'bin'   =>  'application/macbinary',
+      'dms'   =>  'application/octet-stream',
+      'lha'   =>  'application/octet-stream',
+      'lzh'   =>  'application/octet-stream',
+      'exe'   =>  'application/octet-stream',
+      'class' =>  'application/octet-stream',
+      'psd'   =>  'application/octet-stream',
+      'so'    =>  'application/octet-stream',
+      'sea'   =>  'application/octet-stream',
+      'dll'   =>  'application/octet-stream',
+      'oda'   =>  'application/oda',
+      'pdf'   =>  'application/pdf',
+      'ai'    =>  'application/postscript',
+      'eps'   =>  'application/postscript',
+      'ps'    =>  'application/postscript',
+      'smi'   =>  'application/smil',
+      'smil'  =>  'application/smil',
+      'mif'   =>  'application/vnd.mif',
+      'xls'   =>  'application/vnd.ms-excel',
+      'ppt'   =>  'application/vnd.ms-powerpoint',
+      'wbxml' =>  'application/vnd.wap.wbxml',
+      'wmlc'  =>  'application/vnd.wap.wmlc',
+      'dcr'   =>  'application/x-director',
+      'dir'   =>  'application/x-director',
+      'dxr'   =>  'application/x-director',
+      'dvi'   =>  'application/x-dvi',
+      'gtar'  =>  'application/x-gtar',
+      'php'   =>  'application/x-httpd-php',
+      'php4'  =>  'application/x-httpd-php',
+      'php3'  =>  'application/x-httpd-php',
+      'phtml' =>  'application/x-httpd-php',
+      'phps'  =>  'application/x-httpd-php-source',
+      'js'    =>  'application/x-javascript',
+      'swf'   =>  'application/x-shockwave-flash',
+      'sit'   =>  'application/x-stuffit',
+      'tar'   =>  'application/x-tar',
+      'tgz'   =>  'application/x-tar',
+      'xhtml' =>  'application/xhtml+xml',
+      'xht'   =>  'application/xhtml+xml',
+      'zip'   =>  'application/zip',
+      'mid'   =>  'audio/midi',
+      'midi'  =>  'audio/midi',
+      'mpga'  =>  'audio/mpeg',
+      'mp2'   =>  'audio/mpeg',
+      'mp3'   =>  'audio/mpeg',
+      'aif'   =>  'audio/x-aiff',
+      'aiff'  =>  'audio/x-aiff',
+      'aifc'  =>  'audio/x-aiff',
+      'ram'   =>  'audio/x-pn-realaudio',
+      'rm'    =>  'audio/x-pn-realaudio',
+      'rpm'   =>  'audio/x-pn-realaudio-plugin',
+      'ra'    =>  'audio/x-realaudio',
+      'rv'    =>  'video/vnd.rn-realvideo',
+      'wav'   =>  'audio/x-wav',
+      'bmp'   =>  'image/bmp',
+      'gif'   =>  'image/gif',
+      'jpeg'  =>  'image/jpeg',
+      'jpg'   =>  'image/jpeg',
+      'jpe'   =>  'image/jpeg',
+      'png'   =>  'image/png',
+      'tiff'  =>  'image/tiff',
+      'tif'   =>  'image/tiff',
+      'css'   =>  'text/css',
+      'html'  =>  'text/html',
+      'htm'   =>  'text/html',
+      'shtml' =>  'text/html',
+      'txt'   =>  'text/plain',
+      'text'  =>  'text/plain',
+      'log'   =>  'text/plain',
+      'rtx'   =>  'text/richtext',
+      'rtf'   =>  'text/rtf',
+      'xml'   =>  'text/xml',
+      'xsl'   =>  'text/xml',
+      'mpeg'  =>  'video/mpeg',
+      'mpg'   =>  'video/mpeg',
+      'mpe'   =>  'video/mpeg',
+      'qt'    =>  'video/quicktime',
+      'mov'   =>  'video/quicktime',
+      'avi'   =>  'video/x-msvideo',
+      'movie' =>  'video/x-sgi-movie',
+      'doc'   =>  'application/msword',
+      'word'  =>  'application/msword',
+      'xl'    =>  'application/excel',
+      'eml'   =>  'message/rfc822'
+    );
+    return (!isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)];
+  }
+
+  /**
+  * Set (or reset) Class Objects (variables)
+  *
+  * Usage Example:
+  * $page->set('X-Priority', '3');
+  *
+  * @access public
+  * @param string $name Parameter Name
+  * @param mixed $value Parameter Value
+  * NOTE: will not work with arrays, there are no arrays to set/reset
+  * @todo Should this not be using __set() magic function?
+  */
+  public function set($name, $value = '') {
+    try {
+      if (isset($this->$name) ) {
+        $this->$name = $value;
+      }
+      else {
+        throw new phpmailerException(t('Cannot set or reset variable: !name', array('!name' => $name)) , self::STOP_CRITICAL);
+      }
+    } catch (Exception $e) {
+      $this->SetError($e->getMessage());
+      if ($e->getCode() == self::STOP_CRITICAL) {
+        return FALSE;
+      }
+    }
+    return TRUE;
+  }
+
+  /**
+   * Strips newlines to prevent header injection.
+   * @access public
+   * @param string $str String
+   * @return string
+   */
+  public function SecureHeader($str) {
+    $str = str_replace("\r", '', $str);
+    $str = str_replace("\n", '', $str);
+    return trim($str);
+  }
+
+  /**
+   * Set the private key file and password to sign the message.
+   *
+   * @access public
+   * @param string $key_filename Parameter File Name
+   * @param string $key_pass Password for private key
+   */
+  public function Sign($cert_filename, $key_filename, $key_pass) {
+    $this->sign_cert_file = $cert_filename;
+    $this->sign_key_file = $key_filename;
+    $this->sign_key_pass = $key_pass;
+  }
+
+  /**
+   * Set the private key file and password to sign the message.
+   *
+   * @access public
+   * @param string $key_filename Parameter File Name
+   * @param string $key_pass Password for private key
+   */
+  public function DKIM_QP($txt) {
+    $tmp="";
+    $line="";
+    for ($i=0;$i<strlen($txt);$i++) {
+      $ord=ord($txt[$i]);
+      if ( ((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E)) ) {
+        $line .=$txt[$i];
+      }
+      else {
+        $line .="=" . sprintf("%02X", $ord);
+      }
+    }
+    return $line;
+  }
+
+  /**
+   * Generate DKIM signature
+   *
+   * @access public
+   * @param string $s Header
+   */
+  public function DKIM_Sign($s) {
+    $privKeyStr = file_get_contents($this->DKIM_private);
+    if ($this->DKIM_passphrase!='') {
+      $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
+    }
+    else {
+      $privKey = $privKeyStr;
+    }
+    if (openssl_sign($s, $signature, $privKey)) {
+      return base64_encode($signature);
+    }
+  }
+
+  /**
+   * Generate DKIM Canonicalization Header
+   *
+   * @access public
+   * @param string $s Header
+   */
+  public function DKIM_HeaderC($s) {
+    $s=preg_replace("/\r\n\s+/", " ", $s);
+    $lines=explode("\r\n", $s);
+    foreach ($lines as $key => $line) {
+      list($heading, $value)=explode(":", $line, 2);
+      $heading=strtolower($heading);
+      $value=preg_replace("/\s+/", " ", $value); // Compress useless spaces
+      $lines[$key]=$heading . ":" . trim($value); // Don't forget to remove WSP around the value
+    }
+    $s=implode("\r\n", $lines);
+    return $s;
+  }
+
+  /**
+   * Generate DKIM Canonicalization Body
+   *
+   * @access public
+   * @param string $body Message Body
+   */
+  public function DKIM_BodyC($body) {
+    if ($body == '') return "\r\n";
+    // stabilize line endings
+    $body=str_replace("\r\n", "\n", $body);
+    $body=str_replace("\n", "\r\n", $body);
+    // END stabilize line endings
+    while (substr($body, strlen($body)-4, 4) == "\r\n\r\n") {
+      $body=substr($body, 0, strlen($body)-2);
+    }
+    return $body;
+  }
+
+  /**
+   * Create the DKIM header, body, as new header
+   *
+   * @access public
+   * @param string $headers_line Header lines
+   * @param string $subject Subject
+   * @param string $body Body
+   */
+  public function DKIM_Add($headers_line, $subject, $body) {
+    $DKIMsignatureType    = 'rsa-sha1'; // Signature & hash algorithms
+    $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
+    $DKIMquery            = 'dns/txt'; // Query method
+    $DKIMtime             = REQUEST_TIME; // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
+    $subject_header       = "Subject: $subject";
+    $headers              = explode("\r\n", $headers_line);
+    foreach ($headers as $header) {
+      if (strpos($header, 'From:') === 0) {
+        $from_header=$header;
+      }
+      elseif (strpos($header, 'To:') === 0) {
+        $to_header=$header;
+      }
+    }
+    $from     = str_replace('|', '=7C', $this->DKIM_QP($from_header));
+    $to       = str_replace('|', '=7C', $this->DKIM_QP($to_header));
+    $subject  = str_replace('|', '=7C', $this->DKIM_QP($subject_header)); // Copied header fields (dkim-quoted-printable
+    $body     = $this->DKIM_BodyC($body);
+    $DKIMlen  = strlen($body) ; // Length of body
+    $DKIMb64  = base64_encode(pack("H*", sha1($body))) ; // Base64 of packed binary SHA-1 hash of body
+    $ident    = ($this->DKIM_identity == '')? '' : " i=" . $this->DKIM_identity . ";";
+    $dkimhdrs = "DKIM-Signature: v=1; a=" . $DKIMsignatureType . "; q=" . $DKIMquery . "; l=" . $DKIMlen . "; s=" . $this->DKIM_selector . ";\r\n" .
+                "\tt=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\r\n" .
+                "\th=From:To:Subject;\r\n" .
+                "\td=" . $this->DKIM_domain . ";" . $ident . "\r\n" .
+                "\tz=$from\r\n" .
+                "\t|$to\r\n" .
+                "\t|$subject;\r\n" .
+                "\tbh=" . $DKIMb64 . ";\r\n" .
+                "\tb=";
+    $toSign   = $this->DKIM_HeaderC($from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs);
+    $signed   = $this->DKIM_Sign($toSign);
+    return "X-PHPMAILER-DKIM: phpmailer.worxware.com\r\n" . $dkimhdrs . $signed . "\r\n";
+  }
+
+  protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body) {
+    if (!empty($this->action_function) && function_exists($this->action_function)) {
+      $params = array($isSent, $to, $cc, $bcc, $subject, $body);
+      call_user_func_array($this->action_function, $params);
+    }
+  }
+}
+
+class phpmailerException extends Exception {
+  public function errorMessage() {
+    $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
+    return $errorMsg;
+  }
+}
\ No newline at end of file
diff --git a/profiles/wcm_base/modules/contrib/smtp/smtp.transport.inc b/profiles/wcm_base/modules/contrib/smtp/smtp.transport.inc
new file mode 100644
index 00000000..01013d5a
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/smtp/smtp.transport.inc
@@ -0,0 +1,816 @@
+<?php
+/**
+ * @file
+ * SMTP mail transport class for the smtp module,based on code of the phpmailer
+ * library, customized and relicensed to GPLv2
+ *
+ */
+/*~ class.smtp.php
+Orginal release information:
+.---------------------------------------------------------------------------.
+|  Software: PHPMailer - PHP email class                                    |
+|   Version: 5.1                                                            |
+|   Contact: via sourceforge.net support pages (also www.codeworxtech.com)  |
+|      Info: http://phpmailer.sourceforge.net                               |
+|   Support: http://sourceforge.net/projects/phpmailer/                     |
+| ------------------------------------------------------------------------- |
+|     Admin: Andy Prevost (project admininistrator)                         |
+|   Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
+|          : Marcus Bointon (coolbru) coolbru@users.sourceforge.net         |
+|   Founder: Brent R. Matzelle (original founder)                           |
+| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved.               |
+| Copyright (c) 2001-2003, Brent R. Matzelle                                |
+| ------------------------------------------------------------------------- |
+|   License: Distributed under the Lesser General Public License (LGPL)     |
+|            http://www.gnu.org/copyleft/lesser.html                        |
+| This program is distributed in the hope that it will be useful - WITHOUT  |
+| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     |
+| FITNESS FOR A PARTICULAR PURPOSE.                                         |
+| ------------------------------------------------------------------------- |
+| We offer a number of paid services (www.codeworxtech.com):                |
+| - Web Hosting on highly optimized fast and secure servers                 |
+| - Technology Consulting                                                   |
+| - Oursourcing (highly qualified programmers and graphic designers)        |
+'---------------------------------------------------------------------------'
+*/
+
+/**
+ * PHPMailer - PHP SMTP email transport class
+ * NOTE: Designed for use with PHP version 5 and up
+ * @package PHPMailer
+ * @author Andy Prevost
+ * @author Marcus Bointon
+ * @copyright 2004 - 2008 Andy Prevost
+ */
+
+/**
+ * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP
+ * commands except TURN which will always return a not implemented
+ * error. SMTP also provides some utility methods for sending mail
+ * to an SMTP server.
+ * original author: Chris Ryan
+ */
+
+class SMTP {
+  /**
+   *  SMTP server port
+   *  @var int
+   */
+  public $SMTP_PORT = 25;
+
+  /**
+   *  SMTP reply line ending
+   *  @var string
+   */
+  public $CRLF = "\r\n";
+
+  /**
+   *  Sets whether debugging is turned on
+   *  @var bool
+   */
+  public $do_debug;       // the level of debug to perform
+
+  /**
+   *  Sets VERP use on/off (default is off)
+   *  @var bool
+   */
+  public $do_verp = FALSE;
+
+  /////////////////////////////////////////////////
+  // PROPERTIES, PRIVATE AND PROTECTED
+  /////////////////////////////////////////////////
+
+  private $smtp_conn; // the socket to the server
+  private $error;     // error if any on the last call
+  private $helo_rply; // the reply the server sent to us for HELO
+
+  /**
+   * Initialize the class so that the data is in a known state.
+   * @access public
+   * @return void
+   */
+  public function __construct() {
+    $this->smtp_conn = 0;
+    $this->error = NULL;
+    $this->helo_rply = NULL;
+
+    $this->do_debug = 0;
+  }
+
+  /////////////////////////////////////////////////
+  // CONNECTION FUNCTIONS
+  /////////////////////////////////////////////////
+
+  /**
+   * Connect to the server specified on the port specified.
+   * If the port is not specified use the default SMTP_PORT.
+   * If tval is specified then a connection will try and be
+   * established with the server for that number of seconds.
+   * If tval is not specified the default is 30 seconds to
+   * try on the connection.
+   *
+   * SMTP CODE SUCCESS: 220
+   * SMTP CODE FAILURE: 421
+   * @access public
+   * @return bool
+   */
+  public function Connect($host, $port = 0, $tval = 30) {
+    // set the error val to NULL so there is no confusion
+    $this->error = NULL;
+
+    // make sure we are __not__ connected
+    if ($this->connected()) {
+      // already connected, generate error
+      $this->error = array("error" => "Already connected to a server");
+      return FALSE;
+    }
+
+    if (empty($port)) {
+      $port = $this->SMTP_PORT;
+    }
+
+    // connect to the smtp server
+    $this->smtp_conn = @fsockopen($host,    // the host of the server
+                                 $port,    // the port to use
+                                 $errno,   // error number if any
+                                 $errstr,  // error message if any
+                                 $tval);   // give up after ? secs
+    // verify we connected properly
+    if (empty($this->smtp_conn)) {
+      $this->error = array("error" => "Failed to connect to server",
+                           "errno" => $errno,
+                           "errstr" => $errstr);
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+
+    // SMTP server can take longer to respond, give longer timeout for first read
+    // Windows does not have support for this timeout function
+    if (substr(PHP_OS, 0, 3) != "WIN")
+     socket_set_timeout($this->smtp_conn, $tval, 0);
+
+    // get any announcement
+    $announce = $this->get_lines();
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '<br />';
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * Initiate a TLS communication with the server.
+   *
+   * SMTP CODE 220 Ready to start TLS
+   * SMTP CODE 501 Syntax error (no parameters allowed)
+   * SMTP CODE 454 TLS not available due to temporary reason
+   * @access public
+   * @return bool success
+   */
+  public function StartTLS() {
+    $this->error = NULL; # to avoid confusion
+
+    if (!$this->connected()) {
+      $this->error = array("error" => "Called StartTLS() without being connected");
+      return FALSE;
+    }
+
+    fputs($this->smtp_conn, "STARTTLS" . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+    }
+
+    if ($code != 220) {
+      $this->error =
+         array("error"     => "STARTTLS not accepted from server",
+               "smtp_code" => $code,
+               "smtp_msg"  => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+
+    // Begin encrypted connection
+    if (!stream_socket_enable_crypto($this->smtp_conn, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
+      return FALSE;
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * Performs SMTP authentication.  Must be run after running the
+   * Hello() method.  Returns TRUE if successfully authenticated.
+   * @access public
+   * @return bool
+   */
+  public function Authenticate($username, $password) {
+    // Start authentication
+    fputs($this->smtp_conn, "AUTH LOGIN" . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($code != 334) {
+      $this->error =
+        array("error" => "AUTH not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+
+    // Send encoded username
+    fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($code != 334) {
+      $this->error =
+        array("error" => "Username not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+
+    // Send encoded password
+    fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($code != 235) {
+      $this->error =
+        array("error" => "Password not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * Returns TRUE if connected to a server otherwise FALSE
+   * @access public
+   * @return bool
+   */
+  public function Connected() {
+    if (!empty($this->smtp_conn)) {
+      $sock_status = socket_get_status($this->smtp_conn);
+      if ($sock_status["eof"]) {
+        // the socket is valid but we are not connected
+        if ($this->do_debug >= 1) {
+            echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected";
+        }
+        $this->Close();
+        return FALSE;
+      }
+      return TRUE; // everything looks good
+    }
+    return FALSE;
+  }
+
+  /**
+   * Closes the socket and cleans up the state of the class.
+   * It is not considered good to use this function without
+   * first trying to use QUIT.
+   * @access public
+   * @return void
+   */
+  public function Close() {
+    $this->error = NULL; // so there is no confusion
+    $this->helo_rply = NULL;
+    if (!empty($this->smtp_conn)) {
+      // close the connection and cleanup
+      fclose($this->smtp_conn);
+      $this->smtp_conn = 0;
+    }
+  }
+
+  /////////////////////////////////////////////////
+  // SMTP COMMANDS
+  /////////////////////////////////////////////////
+
+  /**
+   * Issues a data command and sends the msg_data to the server
+   * finializing the mail transaction. $msg_data is the message
+   * that is to be send with the headers. Each header needs to be
+   * on a single line followed by a <CRLF> with the message headers
+   * and the message body being seperated by and additional <CRLF>.
+   *
+   * Implements rfc 821: DATA <CRLF>
+   *
+   * SMTP CODE INTERMEDIATE: 354
+   *     [data]
+   *     <CRLF>.<CRLF>
+   *     SMTP CODE SUCCESS: 250
+   *     SMTP CODE FAILURE: 552,554,451,452
+   * SMTP CODE FAILURE: 451,554
+   * SMTP CODE ERROR  : 500,501,503,421
+   * @access public
+   * @return bool
+   */
+  public function Data($msg_data) {
+    $this->error = NULL; // so no confusion is caused
+
+    if (!$this->connected()) {
+      $this->error = array(
+              "error" => "Called Data() without being connected");
+      return FALSE;
+    }
+
+    fputs($this->smtp_conn, "DATA" . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+    }
+
+    if ($code != 354) {
+      $this->error =
+        array("error" => "DATA command not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+
+    /* the server is ready to accept data!
+     * according to rfc 821 we should not send more than 1000
+     * including the CRLF
+     * characters on a single line so we will break the data up
+     * into lines by \r and/or \n then if needed we will break
+     * each of those into smaller lines to fit within the limit.
+     * in addition we will be looking for lines that start with
+     * a period '.' and append and additional period '.' to that
+     * line. NOTE: this does not count towards limit.
+     */
+
+    // normalize the line breaks so we know the explode works
+    $msg_data = str_replace("\r\n", "\n", $msg_data);
+    $msg_data = str_replace("\r", "\n", $msg_data);
+    $lines = explode("\n", $msg_data);
+
+    /* we need to find a good way to determine is headers are
+     * in the msg_data or if it is a straight msg body
+     * currently I am assuming rfc 822 definitions of msg headers
+     * and if the first field of the first line (':' sperated)
+     * does not contain a space then it _should_ be a header
+     * and we can process all lines before a blank "" line as
+     * headers.
+     */
+
+    $field = substr($lines[0], 0, strpos($lines[0], ":"));
+    $in_headers = FALSE;
+    if (!empty($field) && !strstr($field, " ")) {
+      $in_headers = TRUE;
+    }
+
+    $max_line_length = 998; // used below; set here for ease in change
+
+    while (list(, $line) = @each($lines)) {
+      $lines_out = NULL;
+      if ($line == "" && $in_headers) {
+        $in_headers = FALSE;
+      }
+      // ok we need to break this line up into several smaller lines
+      while (strlen($line) > $max_line_length) {
+        $pos = strrpos(substr($line, 0, $max_line_length), " ");
+
+        // Patch to fix DOS attack
+        if (!$pos) {
+          $pos = $max_line_length - 1;
+          $lines_out[] = substr($line, 0, $pos);
+          $line = substr($line, $pos);
+        }
+        else {
+          $lines_out[] = substr($line, 0, $pos);
+          $line = substr($line, $pos + 1);
+        }
+
+        /* if processing headers add a LWSP-char to the front of new line
+         * rfc 822 on long msg headers
+         */
+        if ($in_headers) {
+          $line = "\t" . $line;
+        }
+      }
+      $lines_out[] = $line;
+
+      // send the lines to the server
+      while (list(, $line_out) = @each($lines_out)) {
+        if (strlen($line_out) > 0) {
+          if (substr($line_out, 0, 1) == ".") {
+            $line_out = "." . $line_out;
+          }
+        }
+        fputs($this->smtp_conn, $line_out . $this->CRLF);
+      }
+    }
+
+    // message data has been sent
+    fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+    }
+
+    if ($code != 250) {
+      $this->error =
+        array("error" => "DATA not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  /**
+   * Sends the HELO command to the smtp server.
+   * This makes sure that we and the server are in
+   * the same known state.
+   *
+   * Implements from rfc 821: HELO <SP> <domain> <CRLF>
+   *
+   * SMTP CODE SUCCESS: 250
+   * SMTP CODE ERROR  : 500, 501, 504, 421
+   * @access public
+   * @return bool
+   */
+  public function Hello($host = '') {
+    $this->error = NULL; // so no confusion is caused
+
+    if (!$this->connected()) {
+      $this->error = array(
+            "error" => "Called Hello() without being connected");
+      return FALSE;
+    }
+
+    // if hostname for HELO was not specified send default
+    if (empty($host)) {
+      // determine appropriate default to send to server
+      $host = "localhost";
+    }
+
+    // Send extended hello first (RFC 2821)
+    if (!$this->SendHello("EHLO", $host)) {
+      if (!$this->SendHello("HELO", $host)) {
+        return FALSE;
+      }
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * Sends a HELO/EHLO command.
+   * @access private
+   * @return bool
+   */
+  private function SendHello($hello, $host) {
+    fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '<br />';
+    }
+
+    if ($code != 250) {
+      $this->error =
+        array("error" => $hello . " not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+
+    $this->helo_rply = $rply;
+
+    return TRUE;
+  }
+
+  /**
+   * Starts a mail transaction from the email address specified in
+   * $from. Returns TRUE if successful or FALSE otherwise. If True
+   * the mail transaction is started and then one or more Recipient
+   * commands may be called followed by a Data command.
+   *
+   * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
+   *
+   * SMTP CODE SUCCESS: 250
+   * SMTP CODE SUCCESS: 552,451,452
+   * SMTP CODE SUCCESS: 500,501,421
+   * @access public
+   * @return bool
+   */
+  public function Mail($from) {
+    $this->error = NULL; // so no confusion is caused
+
+    if (!$this->connected()) {
+      $this->error = array(
+              "error" => "Called Mail() without being connected");
+      return FALSE;
+    }
+
+    $useVerp = ($this->do_verp ? "XVERP" : "");
+    fputs($this->smtp_conn, "MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+    }
+
+    if ($code != 250) {
+      $this->error =
+        array("error" => "MAIL not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  /**
+   * Sends the quit command to the server and then closes the socket
+   * if there is no error or the $close_on_error argument is TRUE.
+   *
+   * Implements from rfc 821: QUIT <CRLF>
+   *
+   * SMTP CODE SUCCESS: 221
+   * SMTP CODE ERROR  : 500
+   * @access public
+   * @return bool
+   */
+  public function Quit($close_on_error = TRUE) {
+    $this->error = NULL; // so there is no confusion
+
+    if (!$this->connected()) {
+      $this->error = array(
+              "error" => "Called Quit() without being connected");
+      return FALSE;
+    }
+
+    // send the quit command to the server
+    fputs($this->smtp_conn, "quit" . $this->CRLF);
+
+    // get any good-bye messages
+    $byemsg = $this->get_lines();
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '<br />';
+    }
+
+    $rval = TRUE;
+    $e = NULL;
+
+    $code = substr($byemsg, 0, 3);
+    if ($code != 221) {
+      // use e as a tmp var cause Close will overwrite $this->error
+      $e = array("error" => "SMTP server rejected quit command",
+                 "smtp_code" => $code,
+                 "smtp_rply" => substr($byemsg, 4));
+      $rval = FALSE;
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '<br />';
+      }
+    }
+
+    if (empty($e) || $close_on_error) {
+      $this->Close();
+    }
+
+    return $rval;
+  }
+
+  /**
+   * Sends the command RCPT to the SMTP server with the TO: argument of $to.
+   * Returns TRUE if the recipient was accepted FALSE if it was rejected.
+   *
+   * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
+   *
+   * SMTP CODE SUCCESS: 250,251
+   * SMTP CODE FAILURE: 550,551,552,553,450,451,452
+   * SMTP CODE ERROR  : 500,501,503,421
+   * @access public
+   * @return bool
+   */
+  public function Recipient($to) {
+    $this->error = NULL; // so no confusion is caused
+
+    if (!$this->connected()) {
+      $this->error = array(
+              "error" => "Called Recipient() without being connected");
+      return FALSE;
+    }
+
+    fputs($this->smtp_conn, "RCPT TO:<" . $to . ">" . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+    }
+
+    if ($code != 250 && $code != 251) {
+      $this->error =
+        array("error" => "RCPT not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  /**
+   * Sends the RSET command to abort and transaction that is
+   * currently in progress. Returns TRUE if successful FALSE
+   * otherwise.
+   *
+   * Implements rfc 821: RSET <CRLF>
+   *
+   * SMTP CODE SUCCESS: 250
+   * SMTP CODE ERROR  : 500,501,504,421
+   * @access public
+   * @return bool
+   */
+  public function Reset() {
+    $this->error = NULL; // so no confusion is caused
+
+    if (!$this->connected()) {
+      $this->error = array(
+              "error" => "Called Reset() without being connected");
+      return FALSE;
+    }
+
+    fputs($this->smtp_conn, "RSET" . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+    }
+
+    if ($code != 250) {
+      $this->error =
+        array("error" => "RSET failed",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * Starts a mail transaction from the email address specified in
+   * $from. Returns TRUE if successful or FALSE otherwise. If True
+   * the mail transaction is started and then one or more Recipient
+   * commands may be called followed by a Data command. This command
+   * will send the message to the users terminal if they are logged
+   * in and send them an email.
+   *
+   * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
+   *
+   * SMTP CODE SUCCESS: 250
+   * SMTP CODE SUCCESS: 552,451,452
+   * SMTP CODE SUCCESS: 500,501,502,421
+   * @access public
+   * @return bool
+   */
+  public function SendAndMail($from) {
+    $this->error = NULL; // so no confusion is caused
+
+    if (!$this->connected()) {
+      $this->error = array("error" => "Called SendAndMail() without being connected");
+      return FALSE;
+    }
+
+    fputs($this->smtp_conn, "SAML FROM:" . $from . $this->CRLF);
+
+    $rply = $this->get_lines();
+    $code = substr($rply, 0, 3);
+
+    if ($this->do_debug >= 2) {
+      echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+    }
+
+    if ($code != 250) {
+      $this->error =
+        array("error" => "SAML not accepted from server",
+              "smtp_code" => $code,
+              "smtp_msg" => substr($rply, 4));
+      if ($this->do_debug >= 1) {
+        echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
+      }
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  /**
+   * This is an optional command for SMTP that this class does not
+   * support. This method is here to make the RFC821 Definition
+   * complete for this class and __may__ be implimented in the future
+   *
+   * Implements from rfc 821: TURN <CRLF>
+   *
+   * SMTP CODE SUCCESS: 250
+   * SMTP CODE FAILURE: 502
+   * SMTP CODE ERROR  : 500, 503
+   * @access public
+   * @return bool
+   */
+  public function Turn() {
+    $this->error = array("error" => "This method, TURN, of the SMTP is not implemented");
+    if ($this->do_debug >= 1) {
+      echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '<br />';
+    }
+    return FALSE;
+  }
+
+  /**
+  * Get the current error
+  * @access public
+  * @return array
+  */
+  public function getError() {
+    return $this->error;
+  }
+
+  /////////////////////////////////////////////////
+  // INTERNAL FUNCTIONS
+  /////////////////////////////////////////////////
+
+  /**
+   * Read in as many lines as possible
+   * either before eof or socket timeout occurs on the operation.
+   * With SMTP we can tell if we have more lines to read if the
+   * 4th character is '-' symbol. If it is a space then we don't
+   * need to read anything else.
+   * @access private
+   * @return string
+   */
+  private function get_lines() {
+    $data = "";
+    while ($str = @fgets($this->smtp_conn, 515)) {
+      if ($this->do_debug >= 4) {
+        echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '<br />';
+        echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '<br />';
+      }
+      $data .= $str;
+      if ($this->do_debug >= 4) {
+        echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '<br />';
+      }
+      // if 4th character is a space, we are done reading, break the loop
+      if (substr($str, 3, 1) == " ") {
+        break;
+      }
+    }
+    return $data;
+  }
+}
\ No newline at end of file
diff --git a/profiles/wcm_base/modules/contrib/uuid_features/readme.md b/profiles/wcm_base/modules/contrib/uuid_features/readme.md
new file mode 100644
index 00000000..e6971cdd
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/uuid_features/readme.md
@@ -0,0 +1,89 @@
+CONTENTS OF THIS FILE
+---------------------
+
+ * Introduction
+ * Requirements
+ * Installation
+ * Configuration
+ * Customization
+ * Maintainers
+
+
+INTRODUCTION
+------------
+The UUID Features Integration module provides a mechanism for exporting content
+(nodes, taxonomy, fields) into a features module. What's that you say? You
+thought features was only for configuration? This module is meant to be used in
+the cases where certain pieces of content straddle the line between pure content
+and configuration.
+You've to configure the entity types / bundles to be exportable. Read the
+documentation for further information.
+
+
+ * For a full description of the module, visit the project page:
+   https://www.drupal.org/project/uuid_features
+
+
+ * To submit bug reports and feature suggestions, or to track changes:
+   https://www.drupal.org/project/issues/uuid_features
+
+
+REQUIREMENTS
+------------
+This module requires the following modules:
+ * Features (https://drupal.org/project/features)
+ * UUID (https://drupal.org/project/uuid)
+ * #808690: Support for filefield (https://www.drupal.org/node/808690)
+   for filefield integration
+
+
+INSTALLATION
+------------
+ * Install as you would normally install a contributed Drupal module. See:
+   https://drupal.org/documentation/install/modules-themes/modules-7
+   for further information.
+
+
+CUSTOMIZATION
+-------------
+* Customize the UUID Features Integration settings in Administration �
+  Structure � Features � UUID export settings.
+
+
+API
+-------------
+To alter query of features export options use hook_query_TAG_alter().
+
+It allows to limit or filter export options using custom module to make
+them more specific.
+
+Tags available for use:
+ * uuid_bean_features_export_options
+ * uuid_book_features_export_options
+ * uuid_commerce_product_features_export_options
+ * uuid_current_search_configuration_features_export_options
+ * uuid_field_collection_features_export_options
+ * uuid_file_entity_features_export_options
+ * uuid_fpp_features_export_options
+ * uuid_node_features_export_options
+ * uuid_nodequeue_item_features_export_options
+ * uuid_panelizer_features_export_options
+ * uuid_paragraphs_features_export_options
+ * uuid_term_features_export_options
+ * uuid_user_features_export_options
+
+
+MAINTAINERS
+-----------
+Current maintainers:
+ * Peter Philipp (das-peter) - https://www.drupal.org/u/das-peter
+ * Brant Wynn (brantwynn) - https://www.drupal.org/u/brantwynn
+ * Jeffrey C. - https://www.drupal.org/u/jeffrey-c.
+ * Rob Loach (RobLoach) - https://www.drupal.org/u/robloach
+ * Ezra Gildesgame (ezra-g) - https://www.drupal.org/u/ezra-g
+
+
+This project has been sponsored by:
+ * Treehouse Agency - https://www.phase2technology.com
+
+
diff --git a/profiles/wcm_base/modules/contrib/wysiwyg/editors/js/ckeditor-3.0.js b/profiles/wcm_base/modules/contrib/wysiwyg/editors/js/ckeditor-3.0.js
index 519a62ca..12e5233a 100644
--- a/profiles/wcm_base/modules/contrib/wysiwyg/editors/js/ckeditor-3.0.js
+++ b/profiles/wcm_base/modules/contrib/wysiwyg/editors/js/ckeditor-3.0.js
@@ -7,23 +7,45 @@ Drupal.wysiwyg.excludeIdSelectors.wysiwyg_ckeditor = ['[id^="cke_"]'];
 
 /**
  * Initialize the editor library.
+ *
+ * This method is called once the first time a library is needed. If new
+ * WYSIWYG fieldsare added later, update() will be called instead.
+ *
+ * @param settings
+ *   An object containing editor settings for each input format.
+ * @param pluginInfo
+ *   An object containing global plugin configuration.
+ */
+Drupal.wysiwyg.editor.init.ckeditor = function(settings, pluginInfo) {
+  // Nothing to do here other than register new plugins etc.
+  Drupal.wysiwyg.editor.update.ckeditor(settings, pluginInfo);
+};
+
+/**
+ * Update the editor library when new settings are available.
+ *
+ * This method is called instead of init() when at least one new WYSIWYG field
+ * has been added to the document and the library has already been initialized.
+ *
+ * $param settings
+ *   An object containing editor settings for each input format.
+ * $param pluginInfo
+ *   An object containing global plugin configuration.
  */
-Drupal.wysiwyg.editor.init.ckeditor = function (settings, pluginInfo) {
+Drupal.wysiwyg.editor.update.ckeditor = function(settings, pluginInfo) {
   // Register native external plugins.
   // Array syntax required; 'native' is a predefined token in JavaScript.
   for (var pluginId in pluginInfo['native']) {
-    if (!pluginInfo['native'].hasOwnProperty(pluginId)) {
-      continue;
+    if (pluginInfo['native'].hasOwnProperty(pluginId) && (!CKEDITOR.plugins.externals || !CKEDITOR.plugins.externals[pluginId])) {
+      var plugin = pluginInfo['native'][pluginId];
+      CKEDITOR.plugins.addExternal(pluginId, plugin.path, plugin.fileName);
     }
-    var plugin = pluginInfo['native'][pluginId];
-    CKEDITOR.plugins.addExternal(pluginId, plugin.path, plugin.fileName);
   }
   // Build and register Drupal plugin wrappers.
   for (var pluginId in pluginInfo.drupal) {
-    if (!pluginInfo.drupal.hasOwnProperty(pluginId)) {
-      continue;
+    if (pluginInfo.drupal.hasOwnProperty(pluginId) && (!CKEDITOR.plugins.registered || !CKEDITOR.plugins.registered[pluginId])) {
+      Drupal.wysiwyg.editor.instance.ckeditor.addPlugin(pluginId, pluginInfo.drupal[pluginId]);
     }
-    Drupal.wysiwyg.editor.instance.ckeditor.addPlugin(pluginId, pluginInfo.drupal[pluginId]);
   }
   // Register Font styles (versions 3.2.1 and above).
   for (var format in settings) {
diff --git a/profiles/wcm_base/modules/contrib/wysiwyg/editors/js/tinymce-3.js b/profiles/wcm_base/modules/contrib/wysiwyg/editors/js/tinymce-3.js
index d7f3b1b4..06223629 100644
--- a/profiles/wcm_base/modules/contrib/wysiwyg/editors/js/tinymce-3.js
+++ b/profiles/wcm_base/modules/contrib/wysiwyg/editors/js/tinymce-3.js
@@ -3,14 +3,7 @@
 /**
  * Initialize editor instances.
  *
- * @todo Is the following note still valid for 3.x?
- * This function needs to be called before the page is fully loaded, as
- * calling tinyMCE.init() after the page is loaded breaks IE6.
- *
- * @param editorSettings
- *   An object containing editor settings for each input format.
- * @param pluginInfo
- *   An object containing global plugin configuration.
+ * @see Drupal.wysiwyg.editor.init.ckeditor()
  */
 Drupal.wysiwyg.editor.init.tinymce = function(settings, pluginInfo) {
   // Fix Drupal toolbar obscuring editor toolbar in fullscreen mode.
@@ -29,15 +22,28 @@ Drupal.wysiwyg.editor.init.tinymce = function(settings, pluginInfo) {
       delete ed._drupalWysiwygInstance;
     }
   });
+  // Register new plugins.
+  Drupal.wysiwyg.editor.update.tinymce(settings, pluginInfo);
+};
 
+/**
+ * Update the editor library when new settings are available.
+ *
+ * @see Drupal.wysiwyg.editor.update.ckeditor()
+ */
+Drupal.wysiwyg.editor.update.tinymce = function(settings, pluginInfo) {
   // Load native external plugins.
   // Array syntax required; 'native' is a predefined token in JavaScript.
   for (var plugin in pluginInfo['native']) {
-    tinymce.PluginManager.load(plugin, pluginInfo['native'][plugin]);
+    if (!(plugin in tinymce.PluginManager.lookup || plugin in tinymce.PluginManager.urls)) {
+      tinymce.PluginManager.load(plugin, pluginInfo['native'][plugin]);
+    }
   }
   // Load Drupal plugins.
   for (var plugin in pluginInfo.drupal) {
-    Drupal.wysiwyg.editor.instance.tinymce.addPlugin(plugin, pluginInfo.drupal[plugin]);
+    if (!(plugin in tinymce.PluginManager.lookup)) {
+      Drupal.wysiwyg.editor.instance.tinymce.addPlugin(plugin, pluginInfo.drupal[plugin]);
+    }
   }
 };
 
diff --git a/profiles/wcm_base/modules/contrib/wysiwyg/editors/tinymce.inc b/profiles/wcm_base/modules/contrib/wysiwyg/editors/tinymce.inc
index 5a21da4b..9261d381 100644
--- a/profiles/wcm_base/modules/contrib/wysiwyg/editors/tinymce.inc
+++ b/profiles/wcm_base/modules/contrib/wysiwyg/editors/tinymce.inc
@@ -39,6 +39,7 @@ function wysiwyg_tinymce_editor() {
         'proxy' => TRUE,
       ),
     ),
+    'proxy plugin settings callback' => '_wysiwyg_tinymce_proxy_plugin_settings',
     'versions' => array(
       '2.1' => array(
         'js files' => array('tinymce-2.js'),
@@ -517,6 +518,18 @@ function _wysiwyg_tinymce_plugin_name($op, $name) {
   }
 }
 
+/**
+ * Build a JS settings array for Drupal plugins loaded via the proxy plugin.
+ */
+function _wysiwyg_tinymce_proxy_plugin_settings($editor, $profile, $plugins) {
+  $settings = array();
+  foreach ($plugins as $name => $plugin) {
+    // Just need a list of all enabled plugins for each instance.
+    $settings[$name] = TRUE;
+  }
+  return $settings;
+}
+
 /**
  * Return internal plugins for this editor; semi-implementation of hook_wysiwyg_plugin().
  */
diff --git a/profiles/wcm_base/modules/contrib/wysiwyg/tests/wysiwyg_test.info b/profiles/wcm_base/modules/contrib/wysiwyg/tests/wysiwyg_test.info
index 98011820..bb4fd02a 100644
--- a/profiles/wcm_base/modules/contrib/wysiwyg/tests/wysiwyg_test.info
+++ b/profiles/wcm_base/modules/contrib/wysiwyg/tests/wysiwyg_test.info
@@ -6,9 +6,9 @@ hidden = TRUE
 dependencies[] = wysiwyg
 files[] = wysiwyg_test.module
 
-; Information added by Drupal.org packaging script on 2015-10-25
-version = "7.x-2.2+70-dev"
+; Information added by Drupal.org packaging script on 2015-11-18
+version = "7.x-2.2+72-dev"
 core = "7.x"
 project = "wysiwyg"
-datestamp = "1445739545"
+datestamp = "1447885145"
 
diff --git a/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.info b/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.info
index f852be42..838c79d6 100644
--- a/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.info
+++ b/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.info
@@ -9,9 +9,9 @@ configure = admin/config/content/wysiwyg
 files[] = wysiwyg.module
 files[] = tests/wysiwyg.test
 
-; Information added by Drupal.org packaging script on 2015-10-25
-version = "7.x-2.2+70-dev"
+; Information added by Drupal.org packaging script on 2015-11-18
+version = "7.x-2.2+72-dev"
 core = "7.x"
 project = "wysiwyg"
-datestamp = "1445739545"
+datestamp = "1447885145"
 
diff --git a/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.init.js b/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.init.js
index 92bb23ce..11fdd7f4 100644
--- a/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.init.js
+++ b/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.init.js
@@ -1,7 +1,7 @@
 
 Drupal.wysiwyg = Drupal.wysiwyg || { 'instances': {}, 'excludeIdSelectors': {} };
 
-Drupal.wysiwyg.editor = Drupal.wysiwyg.editor || { 'init': {}, 'attach': {}, 'detach': {}, 'instance': {} };
+Drupal.wysiwyg.editor = Drupal.wysiwyg.editor || { 'init': {}, 'update': {}, 'attach': {}, 'detach': {}, 'instance': {} };
 
 Drupal.wysiwyg.plugins = Drupal.wysiwyg.plugins || {};
 
diff --git a/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.js b/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.js
index cfb848de..daa44386 100644
--- a/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.js
+++ b/profiles/wcm_base/modules/contrib/wysiwyg/wysiwyg.js
@@ -168,8 +168,13 @@ Drupal.behaviors.attachWysiwyg = {
     if (/KDE/.test(navigator.vendor)) {
       return;
     }
+    var wysiwygs = $('.wysiwyg:input', context);
+    if (!wysiwygs.length) {
+      // No new fields, nothing to update.
+      return;
+    }
     updateInternalState(settings.wysiwyg, context);
-    $('.wysiwyg:input', context).once('wysiwyg', function () {
+    wysiwygs.once('wysiwyg', function () {
       // Skip processing if the element is unknown or does not exist in this
       // document. Can happen after a form was removed but Drupal.ajax keeps a
       // lingering reference to the form and calls Drupal.attachBehaviors().
@@ -466,6 +471,10 @@ function updateInternalState(settings, context) {
       Drupal.wysiwyg.editor.init[editor](jQuery.extend(true, {}, settings.configs[editor]), getPluginInfo('global:' + editor));
       _initializedLibraries[editor] = true;
     }
+    // Update libraries, in case new plugins etc have not been initialized yet.
+    else if (typeof Drupal.wysiwyg.editor.update[editor] === 'function') {
+      Drupal.wysiwyg.editor.update[editor](jQuery.extend(true, {}, settings.configs[editor]), getPluginInfo('global:' + editor));
+    }
   }
   //settings.configs = {};
   for (var triggerId in settings.triggers) {
diff --git a/profiles/wcm_base/modules/custom/ocio_news/ocio_news.context.inc b/profiles/wcm_base/modules/custom/ocio_news/ocio_news.context.inc
index b2fc8641..859339ee 100644
--- a/profiles/wcm_base/modules/custom/ocio_news/ocio_news.context.inc
+++ b/profiles/wcm_base/modules/custom/ocio_news/ocio_news.context.inc
@@ -20,6 +20,7 @@ function ocio_news_context_default_contexts() {
     'path' => array(
       'values' => array(
         'news' => 'news',
+        'news/*' => 'news/*',
       ),
     ),
   );
diff --git a/profiles/wcm_base/modules/custom/ocio_news/ocio_news.ds.inc b/profiles/wcm_base/modules/custom/ocio_news/ocio_news.ds.inc
index 4df83f22..31963c8b 100644
--- a/profiles/wcm_base/modules/custom/ocio_news/ocio_news.ds.inc
+++ b/profiles/wcm_base/modules/custom/ocio_news/ocio_news.ds.inc
@@ -41,6 +41,11 @@ function ocio_news_ds_field_settings_info() {
         ),
       ),
     ),
+    'field_featured_image' => array(
+      'formatter_settings' => array(
+        'ft' => array(),
+      ),
+    ),
   );
   $export['node|article|full'] = $ds_fieldsetting;
 
@@ -88,11 +93,6 @@ function ocio_news_ds_field_settings_info() {
       'label' => 'hidden',
       'format' => 'default',
     ),
-    'field_ocio_body' => array(
-      'formatter_settings' => array(
-        'ft' => array(),
-      ),
-    ),
   );
   $export['node|article|teaser'] = $ds_fieldsetting;
 
@@ -211,15 +211,17 @@ function ocio_news_ds_layout_settings_info() {
   $ds_layout->layout = 'ds_1col';
   $ds_layout->settings = array(
     'regions' => array(
-      'ds_content' => array(
+      'ds_hidden' => array(
         0 => 'field_featured_image',
+      ),
+      'ds_content' => array(
         1 => 'title',
         2 => 'field_ocio_body',
         3 => 'node_link',
       ),
     ),
     'fields' => array(
-      'field_featured_image' => 'ds_content',
+      'field_featured_image' => 'ds_hidden',
       'title' => 'ds_content',
       'field_ocio_body' => 'ds_content',
       'node_link' => 'ds_content',
diff --git a/profiles/wcm_base/modules/custom/ocio_news/ocio_news.features.field_instance.inc b/profiles/wcm_base/modules/custom/ocio_news/ocio_news.features.field_instance.inc
index 779cd3c5..d0c3ddff 100644
--- a/profiles/wcm_base/modules/custom/ocio_news/ocio_news.features.field_instance.inc
+++ b/profiles/wcm_base/modules/custom/ocio_news/ocio_news.features.field_instance.inc
@@ -75,7 +75,7 @@ function ocio_news_field_default_field_instances() {
         'label' => 'hidden',
         'module' => 'file_entity',
         'settings' => array(
-          'file_view_mode' => 'default',
+          'file_view_mode' => 'teaser',
         ),
         'type' => 'file_rendered',
         'weight' => 1,
@@ -94,7 +94,7 @@ function ocio_news_field_default_field_instances() {
         'module' => 'image',
         'settings' => array(
           'image_link' => '',
-          'image_style' => 'image_style_large',
+          'image_style' => 'large',
         ),
         'type' => 'image',
         'weight' => 0,
@@ -120,7 +120,7 @@ function ocio_news_field_default_field_instances() {
         'module' => 'image',
         'settings' => array(
           'image_link' => '',
-          'image_style' => 'teaser_image',
+          'image_style' => 'medium',
         ),
         'type' => 'image',
         'weight' => 0,
diff --git a/profiles/wcm_base/modules/custom/ocio_panels_settings/ocio_panels_settings.module b/profiles/wcm_base/modules/custom/ocio_panels_settings/ocio_panels_settings.module
index b1413b0b..101a8b3b 100644
--- a/profiles/wcm_base/modules/custom/ocio_panels_settings/ocio_panels_settings.module
+++ b/profiles/wcm_base/modules/custom/ocio_panels_settings/ocio_panels_settings.module
@@ -169,6 +169,9 @@ function ocio_panels_settings_form_node_form_alter(&$form, &$form_state) {
   if (!empty($form['options']['private'])) {
     $form['options']['private']['#title'] = t('Make this content private');
   }
+  //$form['options']['field_display_in_view_panes'] = $form['field_display_in_view_panes'];
+  //$form['options']['field_display_in_view_panes']['#weight'] = 0;
+  //unset($form['field_display_in_view_panes']);
 }
 
 /*
diff --git a/profiles/wcm_base/modules/custom/ocio_simplesamlphp_auth/ocio_simplesamlphp_auth.module b/profiles/wcm_base/modules/custom/ocio_simplesamlphp_auth/ocio_simplesamlphp_auth.module
index 2701ef97..4c2c6f85 100644
--- a/profiles/wcm_base/modules/custom/ocio_simplesamlphp_auth/ocio_simplesamlphp_auth.module
+++ b/profiles/wcm_base/modules/custom/ocio_simplesamlphp_auth/ocio_simplesamlphp_auth.module
@@ -612,19 +612,42 @@ function _ocio_simplesamlphp_auth_check_cron_key() {
   $path = DRUPAL_ROOT . $file;
   $cron_key = '';
 
+  // look for the config file
   if (file_exists($path)) {
+  	// parse out the cron key line
     $line = preg_grep('/cronkey/', file($path));
+    // grab the value of cron key if it exists
     if (preg_match("/(?!'cronkey'\s*=>\s*')\w+(?=',)/", array_pop($line), $matches)) {
       $cron_key = $matches[0];
     }
   }
 
-  if (empty($cron_key) || strlen($cron_key) != 54 || !base64_decode($cron_key)) {
-    $cron_key = variable_get('ocio_simplesamlphp_auth_cron_key', user_password(54));
-    drupal_set_message(t('Missing or invalid cron key detected. Add or update the value inside the $config array in %file using the key below<br><br>@cron_key ', array('@cron_key' => $cron_key, '%file' => $file)), 'warning');
+  // check for parsed cron key
+  if (empty($cron_key)) {
+  	// generate/get a valid key
+   	$cron_key = variable_get('ocio_simplesamlphp_auth_cron_key', user_password(54));
+    variable_set('ocio_simplesamlphp_auth_cron_key', $cron_key);
+    // feedback msg
+  	drupal_set_message(t('The cron key could not be found in %file. Add or update the value inside the $config array in %file using the key below<br><br>@cron_key', array('@cron_key' => $cron_key, '%file' => $file)), 'warning');
+  }
+  
+  // check key length
+  if (strlen($cron_key) != 54) {
+  	// generate/get a valid key
+  	$cron_key = variable_get('ocio_simplesamlphp_auth_cron_key', user_password(54));
+    variable_set('ocio_simplesamlphp_auth_cron_key', $cron_key);
+    // feedback msg
+  	drupal_set_message(t('The cron key detected in the simpleSAMLphp config is not 54 characters in length. Add or update the value inside the $config array in %file using the key below<br><br>@cron_key ', array('@cron_key' => $cron_key, '%file' => $file)), 'warning');
   }
 
-  variable_set('ocio_simplesamlphp_auth_cron_key', $cron_key);
+  // check for illegal characters
+  if (!base64_decode($cron_key)) {
+  	// generate/get a valid key
+    $cron_key = variable_get('ocio_simplesamlphp_auth_cron_key', user_password(54));
+    variable_set('ocio_simplesamlphp_auth_cron_key', $cron_key);
+    // feedback msg
+    drupal_set_message(t('The cron key detected in the simpleSAMLphp config contains illegal characters. Add or update the value inside the $config array in %file using the key below<br><br>@cron_key ', array('@cron_key' => $cron_key, '%file' => $file)), 'warning');
+  }
 
   return $cron_key;
 }
diff --git a/profiles/wcm_base/modules/custom/ocio_url_aliases/ocio_url_aliases.info b/profiles/wcm_base/modules/custom/ocio_url_aliases/ocio_url_aliases.info
index 9b64956b..bc82c493 100644
--- a/profiles/wcm_base/modules/custom/ocio_url_aliases/ocio_url_aliases.info
+++ b/profiles/wcm_base/modules/custom/ocio_url_aliases/ocio_url_aliases.info
@@ -14,19 +14,34 @@ dependencies[] = strongarm
 features[ctools][] = strongarm:strongarm:1
 features[features_api][] = api:2
 features[user_permission][] = administer redirects
+features[variable][] = pathauto_blog_pattern
 features[variable][] = pathauto_file_audio_pattern
 features[variable][] = pathauto_file_document_pattern
 features[variable][] = pathauto_file_image_pattern
 features[variable][] = pathauto_file_pattern
 features[variable][] = pathauto_file_video_pattern
+features[variable][] = pathauto_forum_pattern
+features[variable][] = pathauto_node_article_pattern
+features[variable][] = pathauto_node_basic_page_pattern
+features[variable][] = pathauto_node_book_page_pattern
+features[variable][] = pathauto_node_calendar_entry_pattern
+features[variable][] = pathauto_node_faq_pattern
+features[variable][] = pathauto_node_featured_slide_pattern
 features[variable][] = pathauto_node_ocio_basic_page_pattern
 features[variable][] = pathauto_node_ocio_landing_page_pattern
 features[variable][] = pathauto_node_ocio_news_article_pattern
 features[variable][] = pathauto_node_pattern
+features[variable][] = pathauto_node_web_form_pattern
 features[variable][] = pathauto_punctuation_hyphen
 features[variable][] = pathauto_taxonomy_term_ocio_tags_pattern
+features[variable][] = pathauto_taxonomy_term_osu_ap_file_category_pattern
+features[variable][] = pathauto_taxonomy_term_osu_ap_file_department_pattern
+features[variable][] = pathauto_taxonomy_term_osu_ap_file_subject_pattern
 features[variable][] = pathauto_taxonomy_term_panopoly_categories_pattern
 features[variable][] = pathauto_taxonomy_term_pattern
+features[variable][] = pathauto_taxonomy_term_wcm_file_tags_pattern
+features[variable][] = pathauto_taxonomy_term_wcm_user_contact_group_pattern
+features[variable][] = pathauto_taxonomy_term_wcm_user_leadership_group_pattern
 features[variable][] = pathauto_update_action
 features[variable][] = pathauto_user_pattern
 features[variable][] = redirect_auto_redirect
diff --git a/profiles/wcm_base/modules/custom/ocio_url_aliases/ocio_url_aliases.strongarm.inc b/profiles/wcm_base/modules/custom/ocio_url_aliases/ocio_url_aliases.strongarm.inc
index 2842dae3..7c399ce5 100644
--- a/profiles/wcm_base/modules/custom/ocio_url_aliases/ocio_url_aliases.strongarm.inc
+++ b/profiles/wcm_base/modules/custom/ocio_url_aliases/ocio_url_aliases.strongarm.inc
@@ -10,6 +10,13 @@
 function ocio_url_aliases_strongarm() {
   $export = array();
 
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_blog_pattern';
+  $strongarm->value = 'blogs/[user:name]';
+  $export['pathauto_blog_pattern'] = $strongarm;
+
   $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
@@ -45,6 +52,55 @@ function ocio_url_aliases_strongarm() {
   $strongarm->value = '';
   $export['pathauto_file_video_pattern'] = $strongarm;
 
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_forum_pattern';
+  $strongarm->value = '[term:vocabulary]/[term:name]';
+  $export['pathauto_forum_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_node_article_pattern';
+  $strongarm->value = 'news/[node:created:custom:Y]/[node:created:custom:m]/[node:created:custom:d]/[node:title]';
+  $export['pathauto_node_article_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_node_basic_page_pattern';
+  $strongarm->value = '[node:menu-link:parents:join:/]/[node:title]';
+  $export['pathauto_node_basic_page_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_node_book_page_pattern';
+  $strongarm->value = '';
+  $export['pathauto_node_book_page_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_node_calendar_entry_pattern';
+  $strongarm->value = '';
+  $export['pathauto_node_calendar_entry_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_node_faq_pattern';
+  $strongarm->value = 'faq/[node:title]';
+  $export['pathauto_node_faq_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_node_featured_slide_pattern';
+  $strongarm->value = '';
+  $export['pathauto_node_featured_slide_pattern'] = $strongarm;
+
   $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
@@ -56,7 +112,7 @@ function ocio_url_aliases_strongarm() {
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'pathauto_node_ocio_landing_page_pattern';
-  $strongarm->value = '[node:title]';
+  $strongarm->value = '[node:menu-link:parents:join:/]/[node:title]';
   $export['pathauto_node_ocio_landing_page_pattern'] = $strongarm;
 
   $strongarm = new stdClass();
@@ -73,6 +129,13 @@ function ocio_url_aliases_strongarm() {
   $strongarm->value = '[node:title]';
   $export['pathauto_node_pattern'] = $strongarm;
 
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_node_web_form_pattern';
+  $strongarm->value = '';
+  $export['pathauto_node_web_form_pattern'] = $strongarm;
+
   $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
@@ -87,6 +150,27 @@ function ocio_url_aliases_strongarm() {
   $strongarm->value = '';
   $export['pathauto_taxonomy_term_ocio_tags_pattern'] = $strongarm;
 
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_taxonomy_term_osu_ap_file_category_pattern';
+  $strongarm->value = '';
+  $export['pathauto_taxonomy_term_osu_ap_file_category_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_taxonomy_term_osu_ap_file_department_pattern';
+  $strongarm->value = '';
+  $export['pathauto_taxonomy_term_osu_ap_file_department_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_taxonomy_term_osu_ap_file_subject_pattern';
+  $strongarm->value = '';
+  $export['pathauto_taxonomy_term_osu_ap_file_subject_pattern'] = $strongarm;
+
   $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
@@ -101,6 +185,27 @@ function ocio_url_aliases_strongarm() {
   $strongarm->value = '[term:vocabulary]/[term:name]';
   $export['pathauto_taxonomy_term_pattern'] = $strongarm;
 
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_taxonomy_term_wcm_file_tags_pattern';
+  $strongarm->value = '';
+  $export['pathauto_taxonomy_term_wcm_file_tags_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_taxonomy_term_wcm_user_contact_group_pattern';
+  $strongarm->value = '';
+  $export['pathauto_taxonomy_term_wcm_user_contact_group_pattern'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'pathauto_taxonomy_term_wcm_user_leadership_group_pattern';
+  $strongarm->value = '';
+  $export['pathauto_taxonomy_term_wcm_user_leadership_group_pattern'] = $strongarm;
+
   $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
diff --git a/profiles/wcm_base/wcm_base.info b/profiles/wcm_base/wcm_base.info
index 5c26a46a..837f2fdb 100644
--- a/profiles/wcm_base/wcm_base.info
+++ b/profiles/wcm_base/wcm_base.info
@@ -61,6 +61,7 @@ dependencies[] = override_node_options
 dependencies[] = panels_accordion
 dependencies[] = private
 dependencies[] = private_files_download_permission
+dependencies[] = smtp
 dependencies[] = telephone
 dependencies[] = textformatter
 dependencies[] = uuid_features
diff --git a/profiles/wcm_base/wcm_base.make b/profiles/wcm_base/wcm_base.make
index e3e99e3f..a9992ff1 100644
--- a/profiles/wcm_base/wcm_base.make
+++ b/profiles/wcm_base/wcm_base.make
@@ -98,6 +98,9 @@ projects[realname][subdir] = contrib
 projects[redis][version] = 2.12
 projects[redis][subdir] = contrib
 
+projects[smtp][version] = 1.2
+projects[smtp][subdir] = contrib
+
 projects[special_menu_items][version] = 2.0
 projects[special_menu_items][subdir] = contrib
 
-- 
GitLab