Qos per queue: que1=qos1,que2=qos2,que3=qos3
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
index 0bda74e..afbf425 100644
--- a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
@@ -73,6 +73,8 @@
 import java.nio.ByteBuffer;
 import java.security.SecureRandom;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 //import org.apache.airavata.commons.gfac.type.ActualParameter;
 
@@ -457,12 +459,12 @@
         }
 
         if (crp.getQualityOfService() != null) {
-            jobDescriptor.setQoS(crp.getQualityOfService());
+            // qos per queue
+            jobDescriptor.setQoS(
+                    getQoS(crp.getQualityOfService(), crp.getPreferredBatchQueue()));
         }
 
-        if (crp.getReservation() != null) {
-            jobDescriptor.setReservation(crp.getReservation());
-        }
+        jobDescriptor.setReservation(crp.getReservation());
         // To make job name alpha numeric
         jobDescriptor.setJobName("A" + String.valueOf(generateJobName()));
         jobDescriptor.setWorkingDirectory(processContext.getWorkingDir());
@@ -634,6 +636,16 @@
         return jobDescriptor;
     }
 
+    private static String getQoS(String qualityOfService, String preferredBatchQueue) {
+        final String qos = "qos";
+        Pattern pattern = Pattern.compile(preferredBatchQueue + "=(?<" + qos + ">[^,]*)");
+        Matcher matcher = pattern.matcher(qualityOfService);
+        if (matcher.matches()) {
+            return matcher.group(qos);
+        }
+        return null;
+    }
+
     private static int generateJobName() {
         Random random = new Random();
         int i = random.nextInt(Integer.MAX_VALUE);