diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
index 4cfa808e38b738de0c906c377fae0c548468c792..9086ceb37f74d3373bbbc5160d18b8a65ff71a0e 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
@@ -438,6 +438,10 @@ public class MeetingService implements MessageListener {
     return recordingService.getCaptionsDir();
   }
 
+  public boolean isRecordingExist(String recordId) {
+    return recordingService.isRecordingExist(recordId);
+  }
+
   public String getRecordings2x(List<String> idList, List<String> states, Map<String, String> metadataFilters) {
     return recordingService.getRecordings2x(idList, states, metadataFilters);
   }
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/RecordingService.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/RecordingService.java
index dad597e22f1fd5161f30086bd6ec3a9d67f09e87..7a4fc132b8361bc4012c5546f53c3bcab44dabd5 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/api/RecordingService.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/RecordingService.java
@@ -243,6 +243,16 @@ public class RecordingService {
         return ids;
     }
 
+    public boolean isRecordingExist(String recordId) {
+        List<String> publishList = getAllRecordingIds(publishedDir);
+        List<String> unpublishList = getAllRecordingIds(unpublishedDir);
+        if (publishList.contains(recordId) || unpublishList.contains(recordId)) {
+            return true;
+        }
+
+        return false;
+    }
+
     public boolean existAnyRecording(List<String> idList) {
         List<String> publishList = getAllRecordingIds(publishedDir);
         List<String> unpublishList = getAllRecordingIds(unpublishedDir);
diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/RecordingController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/RecordingController.groovy
index 51ccee962c107befbaca3307186980d340209d75..ccc238cfc05f30963d7946b7ec715a71b3ccd07b 100755
--- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/RecordingController.groovy
+++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/RecordingController.groovy
@@ -10,6 +10,7 @@ import org.bigbluebutton.api.ApiParams
 import org.apache.commons.lang3.StringUtils
 import org.json.JSONArray
 import org.springframework.web.multipart.commons.CommonsMultipartFile
+import org.apache.commons.lang.LocaleUtils
 
 class RecordingController {
   private static final String CONTROLLER_NAME = 'RecordingController'
@@ -110,17 +111,14 @@ class RecordingController {
     String recordId = StringUtils.strip(params.recordID)
     log.debug("Captions for recordID: " + recordId)
 
-
     if (!paramsProcessorUtil.isChecksumSame(API_CALL, params.checksum, request.getQueryString())) {
       invalid("checksumError", "You did not pass the checksum security check")
       return
     }
-
-    String captionsDirPath = meetingService.getCaptionsDir() + File.separatorChar + recordId
-    File captionsDir = new File(captionsDirPath);
-    if (!captionsDir.exists() || !captionsDir.isDirectory()) {
+    
+    if (!meetingService.isRecordingExist(recordId)) {
       respondWithError("noRecordings", "No recording was found for " + recordId)
-      return;
+      return
     }
 
     if (StringUtils.isEmpty(params.kind)) {
@@ -136,7 +134,7 @@ class RecordingController {
       respondWithError("invalidKind", "Invalid kind parameter, expected='subtitles|captions' actual=" + captionsKind)
       return
     }
-    
+
     Locale locale
     if (StringUtils.isEmpty(params.lang)) {
       respondWithError("paramError", "Missing param lang.")
@@ -146,25 +144,17 @@ class RecordingController {
     String paramsLang = StringUtils.strip(params.lang)
     log.debug("Captions lang: " + paramsLang)
 
-    Locale paramLocale = Locale.forLanguageTag(paramsLang)
-    log.debug("Captions locale: " + paramLocale.toString())
 
-    Collection<Locale> locales = new ArrayList<>()
-    locales.add(paramLocale)
     try {
-      List<Locale.LanguageRange> languageRanges = Locale.LanguageRange.parse(paramsLang)
-      locale = Locale.lookup(languageRanges, locales)
-      if (locale == null) {
-        respondWithError("invalidLang", "Invalid lang param, received=" + paramsLang)
-        return
-      }
+      locale = LocaleUtils.toLocale(paramsLang)
+      log.debug("Captions locale: " + locale.toLanguageTag())
     } catch (IllegalArgumentException e) {
       respondWithError("invalidLang", "Malformed lang param, received=" + paramsLang)
       return
     }
 
-    String captionsLang = locale.toString()
-    String captionsLabel = paramLocale.getDisplayLanguage()
+    String captionsLang = locale.toLanguageTag()
+    String captionsLabel = locale.getDisplayLanguage()
 
     if (!StringUtils.isEmpty(params.label)) {
       captionsLabel = StringUtils.strip(params.label)