diff --git a/bigbluebutton-config/bigbluebutton-release b/bigbluebutton-config/bigbluebutton-release
index 522ced7df4e8d7563e3dedc6bba032c06b600249..7d81d9da891fb5fcf66b59dd74b102f0561b1bc5 100644
--- a/bigbluebutton-config/bigbluebutton-release
+++ b/bigbluebutton-config/bigbluebutton-release
@@ -1 +1 @@
-BIGBLUEBUTTON_RELEASE=2.2.0-beta-10
+BIGBLUEBUTTON_RELEASE=2.2.0-beta-11
diff --git a/record-and-playback/presentation/scripts/process/presentation.rb b/record-and-playback/presentation/scripts/process/presentation.rb
index 4a8e140547fbdb8666a9146210004f5403eabc6b..d7d594eb839720174d67b132c752fec34a297419 100755
--- a/record-and-playback/presentation/scripts/process/presentation.rb
+++ b/record-and-playback/presentation/scripts/process/presentation.rb
@@ -47,10 +47,6 @@ recording_dir = props['recording_dir']
 raw_archive_dir = "#{recording_dir}/raw/#{meeting_id}"
 log_dir = props['log_dir']
 
-BigBlueButton.logger.info("setting captions dir")
-captions_dir = props['captions_dir']
-captions_meeting_dir = "#{captions_dir}/#{meeting_id}"
-
 target_dir = "#{recording_dir}/process/presentation/#{meeting_id}"
 if not FileTest.directory?(target_dir)
   FileUtils.mkdir_p "#{log_dir}/presentation"
@@ -202,22 +198,11 @@ if not FileTest.directory?(target_dir)
       FileUtils.cp_r("#{pres_dir}/thumbnails", "#{target_pres_dir}/thumbnails")
     end
 
-    BigBlueButton.logger.info("Copying closed captions")
-
-    captions = JSON.load(File.new("#{captions_meeting_dir}/captions.json"))
-    captions_json = []
-    captions.each do |track|
-      caption = {}
-      caption[:localeName] = track['label']
-      caption[:locale] = track['lang']
-      captions_json << caption
-      FileUtils.cp("#{captions_meeting_dir}/caption_" + track['lang'] + ".vtt", target_dir)
+    BigBlueButton.logger.info("Generating closed captions")
+    ret = BigBlueButton.exec_ret('utils/gen_webvtt', '-i', raw_archive_dir, '-o', target_dir)
+    if ret != 0
+      raise "Generating closed caption files failed"
     end
-
-    File.open("#{target_dir}/captions.json", "w") do |f|
-      f.write(captions_json.to_json)
-    end
-
     captions = JSON.load(File.new("#{target_dir}/captions.json", 'r'))
 
     if not presentation_text.empty?
diff --git a/record-and-playback/presentation/scripts/publish/presentation.rb b/record-and-playback/presentation/scripts/publish/presentation.rb
index 072b2f3d69362d647fe5a910502ba4eb5bdff006..f347eb339429b1de4729c164194bb95e6064810b 100755
--- a/record-and-playback/presentation/scripts/publish/presentation.rb
+++ b/record-and-playback/presentation/scripts/publish/presentation.rb
@@ -1185,9 +1185,6 @@ begin
     $process_dir = "#{recording_dir}/process/presentation/#{$meeting_id}"
     BigBlueButton.logger.info("setting publish dir")
     publish_dir = $presentation_props['publish_dir']
-    BigBlueButton.logger.info("setting captions dir")
-    captions_dir = bbb_props['captions_dir']
-    captions_meeting_dir = "#{captions_dir}/#{$meeting_id}"
     BigBlueButton.logger.info("setting playback url info")
     playback_protocol = bbb_props['playback_protocol']
     playback_host = bbb_props['playback_host']
@@ -1228,21 +1225,6 @@ begin
           BigBlueButton.logger.info("Copied audio.ogg file")
         end
 
-        BigBlueButton.logger.info("Copying caption files to #{target_dir}")
-        captions = JSON.load(File.new("#{captions_meeting_dir}/captions.json"))
-        captions_json = []
-        captions.each do |track|
-          caption = {}
-          caption[:localeName] = track['label']
-          caption[:locale] = track['lang']
-          captions_json << caption
-          FileUtils.cp("#{captions_meeting_dir}/caption_" + track['lang'] + ".vtt", target_dir)
-        end
-
-        File.open("#{target_dir}/captions.json", "w") do |f|
-          f.write(captions_json.to_json)
-        end
-
         if File.exist?("#{$process_dir}/captions.json")
           BigBlueButton.logger.info("Copying caption files")
           FileUtils.cp("#{$process_dir}/captions.json", package_dir)