diff --git a/BuildParams b/BuildParams
index 0d3d1922e9d971c6cfbb76e6a85a63290f69e657..7aff447ddaec679146a99d8e76e8d8e354c7afc4 100755
--- a/BuildParams
+++ b/BuildParams
@@ -70,15 +70,12 @@ additional_packages = ""
 # the viewer_channel_suffix is prefixed by a blank and then appended to the viewer_channel
 # for the package in a setting that overrides the compiled-in value
 ################################################################
-## Removed 2015-07-02 (MAINT-5360) until we fix packaging step in Team City
-## additional_packages = "EDU"
+additional_packages = "EDU"
 
 # The EDU package allows us to create a separate release channel whose expirations
 # are synchronized as much as possible with the academic year
-## Removed 2015-07-02 (MAINT-5360) until we fix packaging step in Team City
-## EDU_sourceid = ""
-## Removed 2015-07-02 (MAINT-5360) until we fix packaging step in Team City
-## EDU_viewer_channel_suffix = "edu"
+EDU_sourceid = ""
+EDU_viewer_channel_suffix = "edu"
 
 # Notifications - to configure email notices, add a setting like this:
 # <username>_<reponame>.email = <email-address>
diff --git a/autobuild.xml b/autobuild.xml
index bee2d29d9f6635317c4a92b209516d68166adcc3..010d85d2bc8487b36f182999eb177b87a8a61fa6 100755
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1482,11 +1482,11 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>fe4b09930b509d322b10bd27821bd876</string>
+              <string>29a1f64df46094eda0d681821a98d17e</string>
               <key>hash_algorithm</key>
               <string>md5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/310159/arch/Darwin/installer/llceflib-1.5.3.310159-darwin-310159.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/311349/arch/Darwin/installer/llceflib-1.5.3.311349-darwin-311349.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin</string>
@@ -1496,18 +1496,18 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>8fe98baea7ecb950d9611e9f6850cb1f</string>
+              <string>827b7c339a2cd401d9d23f9ee02cb83f</string>
               <key>hash_algorithm</key>
               <string>md5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/310159/arch/CYGWIN/installer/llceflib-1.5.3.310159-windows-310159.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/311349/arch/CYGWIN/installer/llceflib-1.5.3.311349-windows-311349.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.5.3.310159</string>
+        <string>1.5.1.310043</string>
       </map>
       <key>llphysicsextensions_source</key>
       <map>
diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt
index 4aecf61bd7a3df07b3f56f4db029bf666cf5c3da..0bb0348d26b9f9a8112e104ba91fde2f1ea89fad 100755
--- a/indra/llcorehttp/CMakeLists.txt
+++ b/indra/llcorehttp/CMakeLists.txt
@@ -144,6 +144,43 @@ if (LL_TESTS)
                           "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_llcorehttp_peer.py"
                           )
 
+if (DARWIN)
+  # Path inside the app bundle where we'll need to copy libraries
+  set(LL_TEST_DESTINATION_DIR
+    ${CMAKE_SOURCE_DIR}/../build-darwin-i386/sharedlibs/Resources
+  )
+
+  # Create the Contents/Resources directory
+  add_custom_command(
+    TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
+    COMMAND ${CMAKE_COMMAND}
+    ARGS
+      -E
+      make_directory
+      ${LL_TEST_DESTINATION_DIR}
+    COMMENT "Creating Resources directory in app bundle."
+  )
+  
+  # Copy the required libraries to the package app
+  add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib ${LL_TEST_DESTINATION_DIR}
+    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib
+  )
+  add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib ${LL_TEST_DESTINATION_DIR}
+    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib
+  )
+  add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib ${LL_TEST_DESTINATION_DIR}
+    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib
+  )
+  add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib ${LL_TEST_DESTINATION_DIR}
+    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib
+  )
+
+endif (DARWIN)
+
   #
   # Example Programs
   #
diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index 07b5af819e74867ee4dfb1120143a7fec517f76b..db471c7906c9900b9a4e77e06c475126d6fc7243 100644
--- a/indra/media_plugins/cef/CMakeLists.txt
+++ b/indra/media_plugins/cef/CMakeLists.txt
@@ -113,4 +113,12 @@ if (DARWIN)
     LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
   )
 
+  add_custom_command(TARGET media_plugin_cef
+    POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "@executable_path/Chromium Embedded Framework"
+        "@executable_path/../../../../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework"
+        "$<TARGET_FILE:media_plugin_cef>"
+    VERBATIM
+    COMMENT "Fixing path to CEF Framework"
+  )
+
 endif (DARWIN)
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 9bcb6fce9f71441d7ef6f781ce1bb16df5ca7955..1c77cf805e94c362ecd917ecaf217a13f2b13c32 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -28,6 +28,7 @@
 """
 import sys
 import os.path
+import shutil
 import errno
 import re
 import tarfile
@@ -853,14 +854,17 @@ def path_optional(src, dst):
                 # This code constructs a relative path from the
                 # target framework folder back to the location of the symlink.
                 # It needs to be relative so that the symlink still works when
-                # (as is normal) the user moves the app bunlde out of the DMG
+                # (as is normal) the user moves the app bundle out of the DMG
                 # and into the /Applications folder. Note we also call 'raise'
                 # to terminate the process if we get an error since without
                 # this symlink, Second Life web media can't possibly work.
                 # Real Framework folder:
                 #   Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/
-                # Location of symlink and why it'ds relavie 
+                # Location of symlink and why it'ds relative 
                 #   Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/
+                # Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative)
+                #   <top level>.app/Contents/Frameworks/Chromium Embedded Framework.framework/
+                #   <top level>.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework ->
                 frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir, os.pardir, "Frameworks", "Chromium Embedded Framework.framework")
                 try:
                     symlinkf(frameworkpath, pluginframeworkpath)
@@ -870,10 +874,6 @@ def path_optional(src, dst):
 
             self.end_prefix("Contents")
 
-        # fix up media_plugin.dylib so it knows where to look for CEF files it needs
-        self.run_command('install_name_tool -change "@executable_path/Chromium Embedded Framework" "@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%(config)s/Second Life.app/Contents/Resources/llplugin/media_plugin_cef.dylib"' %
-                        { 'config' : self.args['configuration'] })
-
         # NOTE: the -S argument to strip causes it to keep enough info for
         # annotated backtraces (i.e. function names in the crash log).  'strip' with no
         # arguments yields a slightly smaller binary but makes crash logs mostly useless.
@@ -1245,12 +1245,33 @@ def symlinkf(src, dst):
         # file, but that strategy doesn't work so well if we don't have
         # permissions to remove it. Check to see if it's already the
         # symlink we want, which is the usual reason for EEXIST.
-        if not (os.path.islink(dst) and os.readlink(dst) == src):
-            # Here either dst isn't a symlink or it's the wrong symlink.
-            # Remove and recreate. Caller will just have to deal with any
-            # exceptions at this stage.
+        elif os.path.islink(dst):
+            if os.readlink(dst) == src:
+                # the requested link already exists
+                pass
+            else:
+                # dst is the wrong symlink; attempt to remove and recreate it
+                os.remove(dst)
+                os.symlink(src, dst)
+        elif os.path.isdir(dst):
+            print "Requested symlink (%s) exists but is a directory; replacing" % dst
+            shutil.rmtree(dst)
+            os.symlink(src, dst)
+        elif os.path.exists(dst):
+            print "Requested symlink (%s) exists but is a file; replacing" % dst
             os.remove(dst)
             os.symlink(src, dst)
+        else:
+            # see if the problem is that the parent directory does not exist
+            # and try to explain what is missing
+            (parent, tail) = os.path.split(dst)
+            while not os.path.exists(parent):
+                (parent, tail) = os.path.split(parent)
+            if tail:
+                raise Exception("Requested symlink (%s) cannot be created because %s does not exist"
+                                % os.path.join(parent, tail))
+            else:
+                raise
 
 if __name__ == "__main__":
     main()