diff --git a/docroot/sites/all/modules/contrib/ooyala/ooyala.module b/docroot/sites/all/modules/contrib/ooyala/ooyala.module
index c564a21..9706b04 100755
--- a/docroot/sites/all/modules/contrib/ooyala/ooyala.module
+++ b/docroot/sites/all/modules/contrib/ooyala/ooyala.module
@@ -118,6 +118,7 @@
     'ooyala_player' => array(
       'variables' => array(
         'embedcode' => NULL,
+        'container_id' => NULL,
         'params' => NULL,
       ),
     ),
@@ -841,22 +842,45 @@
 
   // Setup some default paramaters.
   $params += array(
-    'embedCode' => $embedcode,
     'height' => variable_get('ooyala_video_height', 300),
-    'playerId' => 'ooyala_player',
     'width' => variable_get('ooyala_video_width', 400),
-    'playerContainerId' => $container_id,
-    'ooyalaPlayerId' => variable_get('ooyala_player_id', ''),
   );
 
-  // The callback paramter determines the name of an optional javascript
-  // function that should recieve notification of Player API events. We do not
-  // allow this to be modified to ensure that multiple modules can play together
-  // nicely. See ooyala_player.js for additional information about resonding to
-  // Player API events.
-  $params['callback'] = 'receiveOoyalaEvent';
+  // Set remaining parameters based on the version of the player being used.
+  if (variable_get('ooyala_player_version', 'v3') === 'v3') {
+    $params += array(
+      // Channels are not supported fully in the v3 player (Flash-only). Enable
+      // them for the players that support it.
+      'enableChannels' => TRUE,
+      // Add the required v3 player ID.
+      'ooyalaPlayerId' => variable_get('ooyala_player_id', ''),
+    );
 
-  return theme('ooyala_player', array('embedcode' => $embedcode, 'params' => $params));
+    if (isset($params['playerId'])) {
+      unset($params['playerId']);
+    }
+
+    // Provide a callback function to register the message event system for the
+    // v3 player. See ooyala_player.js for additional information about resonding to
+    // Player API events.
+    $params['onCreate'] = 'Drupal.ooyala.onCreate';
+  }
+  else {
+    $params += array(
+      'embedCode' => $embedcode,
+      'playerId' => 'ooyala_player',
+      'playerContainerId' => $container_id,
+    );
+
+    // The callback paramter determines the name of an optional javascript
+    // function that should receive notification of Player API events. We do not
+    // allow this to be modified to ensure that multiple modules can play together
+    // nicely. See ooyala_player.js for additional information about resonding to
+    // Player API events.
+    $params['callback'] = 'receiveOoyalaEvent';
+  }
+
+  return theme('ooyala_player', array('embedcode' => $embedcode, 'container_id' => $container_id, 'params' => $params));
 }
 
 /**
@@ -866,12 +890,22 @@
   static $js_added;
 
   if (!isset($js_added)) {
+    $settings = array(
+      'listeners' => (object) array(),
+      'onCreateHandlers' => (object) array(),
+      'players' => (object) array(),
+    );
     drupal_add_js('http://player.ooyala.com/v3/' . $vars['params']['ooyalaPlayerId'], 'external');
+    drupal_add_js(drupal_get_path('module', 'ooyala') . "/ooyala_player.js");
+    drupal_add_js("Drupal.ooyala = Drupal.ooyala || {'listeners': {}, 'onCreateHandlers': {}, 'players': {} };", array('type' =>  'inline', 'weight' => 10, 'group' => JS_THEME));
   }
 
-  $params = '{enableChannels: true, width: ' . $vars['params']['width'] .', height: ' . $vars['params']['height'] . '}';
+  $params = drupal_json_encode($vars['params']);
 
-  return '<div id="' . $vars['params']['playerContainerId'] . '"></div><script type="text/javascript"> var videoPlayer = OO.Player.create("' . $vars['params']['playerContainerId'] . '",' . '"' . $vars['embedcode'] . '", ' . $params . ');</script>';
+  // Ensure callbacks are registered.
+  $params = str_replace('"Drupal.ooyala.onCreate"', 'Drupal.ooyala.onCreate', $params);
+
+  return '<div id="' . $vars['container_id'] . '"></div><script type="text/javascript">Drupal.ooyala.players[\'' . $vars['container_id'] . '\'] = OO.Player.create("' . $vars['container_id'] . '",' . '"' . $vars['embedcode'] . '", ' . $params . ');</script>';
 }
 
 /**
diff --git a/docroot/sites/all/modules/contrib/ooyala/ooyala_player.js b/docroot/sites/all/modules/contrib/ooyala/ooyala_player.js
index e5cbec5..7a90163 100644
--- a/docroot/sites/all/modules/contrib/ooyala/ooyala_player.js
+++ b/docroot/sites/all/modules/contrib/ooyala/ooyala_player.js
@@ -19,7 +19,7 @@
  * top of their javascript files as it is possible for the module's javascript
  * to be included before this file.
  */
-Drupal.ooyala = Drupal.ooyala || {'listeners': {}};
+Drupal.ooyala = Drupal.ooyala || {'listeners': {}, 'onCreateHandlers': {}, 'players': {} };
 
 /**
  * Dispatch Ooyala player callback events to all registered listeners.
@@ -48,6 +48,20 @@
   });
 };
 
+/**
+ * Allow modules to respond to the creation of a new player.
+ *
+ * Typically a module providing an onCreate handler will register a
+ * "message bus" using the Ooyala API.
+ *
+ * @see http://support.ooyala.com/developers/documentation/reference/player_v3_dev_listenevent.html
+ */
+Drupal.ooyala.onCreate = function(player) {
+  jQuery.each(Drupal.ooyala.onCreateHandlers, function() {
+    this(player);
+  });
+};
+
 (function ($) {
   Drupal.ooyala.listeners.ooyala = function(player, eventName, p) {
     var playerId = $(player).attr('id');
@@ -68,9 +82,13 @@
 })(jQuery);
 
 /**
- * Callback function for Ooyala Javascript API. Recieves events for the player
+ * Callback function for Ooyala Javascript API. Receives events for the player
  * and then dispatches them so that other modules can interact with the player.
  *
+ * Use of this callback function is DEPRECATED. It only works with the Ooyala
+ * V2 player. If your site is using the V3 player, see
+ * Drupal.ooyala.onCreate().
+ *
  * @see Drupal.ooyala.notifyListeners()
  */
 function receiveOoyalaEvent(playerId, eventName, p) {