diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/entities/UserAllocationDetailEntity.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/entities/UserAllocationDetailEntity.java
index 1ebcc9f..c05efca 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/entities/UserAllocationDetailEntity.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/entities/UserAllocationDetailEntity.java
@@ -4,10 +4,7 @@
 import javax.persistence.*;
 import java.math.BigInteger;
 
-/**
- *
- * @author harsha
- */
+
 /**
  * The persistent class for the USER_ALLOCATION_DETAILS database table.
  * 
@@ -42,6 +39,9 @@
 	@Column(name="FIELD_OF_SCIENCE")
 	private String fieldOfScience;
 
+	@Column(name="IS_PRIMARY_OWNER")
+	private byte isPrimaryOwner;
+
 	@Lob
 	@Column(name="KEYWORDS")
 	private String keywords;
@@ -145,6 +145,14 @@
 		this.fieldOfScience = fieldOfScience;
 	}
 
+	public byte getIsPrimaryOwner() {
+		return this.isPrimaryOwner;
+	}
+
+	public void setIsPrimaryOwner(byte isPrimaryOwner) {
+		this.isPrimaryOwner = isPrimaryOwner;
+	}
+
 	public String getKeywords() {
 		return this.keywords;
 	}
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/repositories/ProjectReviewerRepository.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/repositories/ProjectReviewerRepository.java
index 897bd62..58b6b7c 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/repositories/ProjectReviewerRepository.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/repositories/ProjectReviewerRepository.java
@@ -1,14 +1,31 @@
 package org.apache.airavata.allocation.manager.db.repositories;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import org.apache.airavata.allocation.manager.db.entities.ProjectReviewerEntity;
+import org.apache.airavata.allocation.manager.db.entities.ProjectReviewerEntityPK;
+import org.apache.airavata.allocation.manager.db.utils.DBConstants;
+import org.apache.airavata.allocation.manager.models.AllocationManagerException;
 import org.apache.airavata.allocation.manager.models.ProjectReviewer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ProjectReviewerRepository extends AbstractRepository<ProjectReviewer, ProjectReviewerEntity, String> {
+public class ProjectReviewerRepository extends AbstractRepository<ProjectReviewer, ProjectReviewerEntity, ProjectReviewerEntityPK> {
     private final static Logger logger = LoggerFactory.getLogger(DomainRepository.class);
 
     public ProjectReviewerRepository(){
         super(ProjectReviewer.class, ProjectReviewerEntity.class);
     }
+    
+    /*Method for getting a list of project assigned to a reviewer*/
+    public List<ProjectReviewer> getProjectForReviewer(String reviewerUserName) throws AllocationManagerException, Exception {
+        String query = "SELECT "+ DBConstants.ProjectReviewerTable.PROJECTID +" from " + ProjectReviewerEntity.class.getSimpleName();
+        query += " WHERE ";
+        query += DBConstants.ProjectReviewerTable.REVIEWER + " = " + reviewerUserName;
+        Map<String,Object> queryParameters = new HashMap<>();
+        queryParameters.put(DBConstants.ProjectReviewerTable.REVIEWER, reviewerUserName);
+        return select(query, queryParameters, 0, -1);
+    }
+    
 }
\ No newline at end of file
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/repositories/UserAllocationDetailRepository.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/repositories/UserAllocationDetailRepository.java
index adfd6d2..f2ec4f3 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/repositories/UserAllocationDetailRepository.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/repositories/UserAllocationDetailRepository.java
@@ -1,14 +1,29 @@
 package org.apache.airavata.allocation.manager.db.repositories;
 
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
 import org.apache.airavata.allocation.manager.db.entities.UserAllocationDetailEntity;
+import org.apache.airavata.allocation.manager.db.entities.UserAllocationDetailEntityPK;
+import org.apache.airavata.allocation.manager.db.utils.DBConstants;
 import org.apache.airavata.allocation.manager.models.UserAllocationDetail;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class UserAllocationDetailRepository extends AbstractRepository<UserAllocationDetail, UserAllocationDetailEntity, String> {
+public class UserAllocationDetailRepository extends AbstractRepository<UserAllocationDetail, UserAllocationDetailEntity, UserAllocationDetailEntityPK> {
     private final static Logger logger = LoggerFactory.getLogger(DomainRepository.class);
 
     public UserAllocationDetailRepository(){
         super(UserAllocationDetail.class, UserAllocationDetailEntity.class);
     }
+    
+    public String getPrimaryOwner(String projectId) throws Exception{
+        Map<String,Object> queryParameters = new HashMap<>();
+        String query = "SELECT * from " + UserAllocationDetailEntity.class.getSimpleName();
+        query += " WHERE ";
+        query += DBConstants.UserAllocationDetailTable.PROJECTID + " = " + projectId + " AND "; 
+        query += DBConstants.UserAllocationDetailTable.ISPRIMARYOWNER + " = TRUE" ;
+        queryParameters.put(DBConstants.UserAllocationDetailTable.PROJECTID, projectId);
+        return select(query, queryParameters, 0, -1).get(0).getId().getUsername();
+    }
 }
\ No newline at end of file
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/utils/DBConstants.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/utils/DBConstants.java
index 749fb40..e740ac0 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/utils/DBConstants.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/db/utils/DBConstants.java
@@ -35,80 +35,18 @@
         public static final String UPDATED_TIME = "updatedTime";
     }
 
-    public static class UserTable {
-        public static final String USER_ID = "userId";
-        public static final String DOMAIN_ID = "domainId";
-        public static final String USER_NAME = "userName";
-        public static final String CREATED_TIME = "createdTime";
-        public static final String UPDATED_TIME = "updatedTime";
+    // Added the ProjectReviewer table fields
+    public static class ProjectReviewerTable{
+        public static final String PROJECTID = "PROJECT_ID";
+        public static final String REVIEWER = "REVIEWER";  
     }
-
-    public static class UserGroupTable {
-        public static final String GROUP_ID = "groupId";
-        public static final String DOMAIN_ID = "domainId";
-        public static final String NAME = "name";
-        public static final String DESCRIPTION = "description";
-        public static final String OWNER_ID = "ownerId";
-        public static final String GROUP_TYPE = "groupType";
-        public static final String GROUP_CARDINALITY = "groupCardinality";
-        public static final String CREATED_TIME = "createdTime";
-        public static final String UPDATED_TIME = "updatedTime";
+    
+    public static class UserAllocationDetailTable{
+        public static final String PROJECTID = "PROJECT_ID";
+        public static final String ISPRIMARYOWNER = "IS_PRIMARY_OWNER";
     }
-
-    public static class GroupMembershipTable {
-        public static final String PARENT_ID = "parentId";
-        public static final String CHILD_ID = "childId";
-        public static final String CHILD_TYPE = "childType";
-        public static final String DOMAIN_ID = "domainId";
-        public static final String CREATED_TIME = "createdTime";
-        public static final String UPDATED_TIME = "updatedTime";
-    }
-
-    public static class EntityTypeTable {
-        public static final String ENTITY_TYPE_ID = "entityTypeId";
-        public static final String DOMAIN_ID = "domainId";
-        public static final String CREATED_TIME = "createdTime";
-        public static final String UPDATED_TIME = "updatedTime";
-    }
-
-    public static class PermissionTypeTable {
-        public static final String ENTITY_TYPE_ID = "permissionTypeId";
-        public static final String DOMAIN_ID = "domainId";
-        public static final String NAME = "name";
-        public static final String CREATED_TIME = "createdTime";
-        public static final String UPDATED_TIME = "updatedTime";
-    }
-
-    public static class EntityTable {
-        public static final String ENTITY_ID = "entityId";
-        public static final String PARENT_ENTITY_ID = "parentEntityId";
-        public static final String ENTITY_TYPE_ID = "entityTypeId";
-        public static final String NAME = "name";
-        public static final String DESCRIPTION = "description";
-        public static final String FULL_TEXT = "fullText";
-        public static final String CREATED_TIME = "createdTime";
-        public static final String UPDATED_TIME = "updatedTime";
-        public static final String DOMAIN_ID = "domainId";
-        public static final String ORIGINAL_ENTITY_CREATION_TIME = "originalEntityCreationTime";
-        public static final String SHARED = "shared";
-    }
-
-    public static class SharingTable {
-        public static final String DOMAIN_ID = "domainId";
-        public static final String PERMISSION_TYPE_ID = "permissionTypeId";
-        public static final String ENTITY_ID = "entityId";
-        public static final String GROUP_ID = "groupId";
-        public static final String INHERITED_PARENT_ID = "inheritedParentId";
-        public static final String SHARING_TYPE = "sharingType";
-        public static final String CREATED_TIME = "createdTime";
-        public static final String UPDATED_TIME = "updatedTime";
-    }
-    // Added the UserDetail table fields 
-    public static class UserDetailTable {
-        public static final String USERNAME = "username";
-        public static final String EMAIL = "email";
-        public static final String FULLNAME = "fullName";
-        public static final String PASSWORD = "password";
-        public static final String USERTYPE = "userType";
+    
+    public static class UserDetailTable{
+        public static final String USERTYPE = "USER_TYPE";
     }
 }
\ No newline at end of file
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/messaging/AllocationServiceDBEventHandler.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/messaging/AllocationServiceDBEventHandler.java
index fd33c59..35834d4 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/messaging/AllocationServiceDBEventHandler.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/messaging/AllocationServiceDBEventHandler.java
@@ -80,7 +80,7 @@
                             case READ:
                                 log.info("Updating user. User name : " + user.id.getUsername());
 
-                                allocationManagerClient.getAllocationRequest(user.id.projectId);
+                                allocationManagerClient.getAllocationRequest(user.id.projectId, user.id.getUsername());
                                 log.debug("User updated. User Id : " + user.id.getUsername());
 
                                 break;
@@ -95,7 +95,7 @@
                             case DELETE:
                                 log.info("Deleting user. User name : " + user.id.getUsername());
 
-                                allocationManagerClient.deleteAllocationRequest(user.id.projectId);
+                                allocationManagerClient.deleteAllocationRequest(user.id.projectId, user.id.getUsername());
                                 log.debug("User deleted. User name : " + user.id.getUsername());
 
                                 break;
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/server/AllocationManagerServerHandler.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/server/AllocationManagerServerHandler.java
index 0c88673..405f5c2 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/server/AllocationManagerServerHandler.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/main/java/org/apache/airavata/allocation/manager/server/AllocationManagerServerHandler.java
@@ -19,9 +19,13 @@
  */
 package org.apache.airavata.allocation.manager.server;
 
+import static java.lang.System.in;
+import java.util.ArrayList;
 import java.util.List;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.allocation.manager.client.NotificationManager;
+import org.apache.airavata.allocation.manager.db.entities.ProjectReviewerEntityPK;
+import org.apache.airavata.allocation.manager.db.entities.UserAllocationDetailEntityPK;
 import org.apache.airavata.allocation.manager.db.repositories.*;
 import org.apache.airavata.allocation.manager.db.utils.JPAUtils;
 import org.apache.airavata.allocation.manager.models.*;
@@ -46,7 +50,11 @@
     @Override
     public String createAllocationRequest(UserAllocationDetail reqDetails) throws AllocationManagerException, TException {
         try{
-            if((new UserAllocationDetailPKRepository()).isExists(reqDetails.id.projectId))  
+            UserAllocationDetailEntityPK objAllocationDetailEntityPK = new UserAllocationDetailEntityPK();
+            objAllocationDetailEntityPK.setProjectId(reqDetails.id.projectId);
+            objAllocationDetailEntityPK.setUsername(reqDetails.id.username);
+            
+            if((new UserAllocationDetailRepository()).isExists(objAllocationDetailEntityPK))  
             throw new TException("There exist project with the id");
             UserAllocationDetail create = (new UserAllocationDetailRepository()).create(reqDetails);
             return reqDetails.id.projectId;
@@ -58,11 +66,13 @@
 
     //Implementing isAllocationRequestExists method to check if the allocation request exists
     @Override
-    public boolean isAllocationRequestExists(String projectId) throws AllocationManagerException, TException {
+    public boolean isAllocationRequestExists(String projectId, String userName) throws AllocationManagerException, TException {
         try{
-            UserAllocationDetailPK alloc = new UserAllocationDetailPK();
-            alloc.setProjectId(projectId);
-            return ((new UserAllocationDetailRepository()).isExists(alloc.projectId));
+            UserAllocationDetailEntityPK objAllocationDetailEntityPK = new UserAllocationDetailEntityPK();
+            objAllocationDetailEntityPK.setProjectId(projectId);
+            objAllocationDetailEntityPK.setUsername(userName);
+            
+            return ((new UserAllocationDetailRepository()).isExists(objAllocationDetailEntityPK));
         }catch (Exception ex) {
             throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
         }
@@ -70,11 +80,13 @@
 
     //Implementing deleteAllocationRequest method to delete an allocation request
     @Override
-    public boolean deleteAllocationRequest(String projectId) throws AllocationManagerException, TException {
+    public boolean deleteAllocationRequest(String projectId, String userName) throws AllocationManagerException, TException {
         try{
-            UserAllocationDetailPK alloc = new UserAllocationDetailPK();
-            alloc.setProjectId(projectId);
-            (new UserAllocationDetailPKRepository()).delete(alloc.projectId);
+            UserAllocationDetailEntityPK objAllocationDetailEntityPK = new UserAllocationDetailEntityPK();
+            objAllocationDetailEntityPK.setProjectId(projectId);
+            objAllocationDetailEntityPK.setUsername(userName);
+            
+            (new UserAllocationDetailRepository()).delete(objAllocationDetailEntityPK);
             return true;
         }catch (Exception ex) {
             logger.error(ex.getMessage(), ex);
@@ -84,11 +96,13 @@
 
     //Implementing getAllocationRequest method to get an allocation request
     @Override
-    public UserAllocationDetail getAllocationRequest(String projectId) throws AllocationManagerException, TException {
+    public UserAllocationDetail getAllocationRequest(String projectId, String userName) throws AllocationManagerException, TException {
         try{
-            UserAllocationDetailPK alloc = new UserAllocationDetailPK();
-            alloc.setProjectId(projectId);
-            return (new UserAllocationDetailRepository()).get(alloc.projectId);
+            UserAllocationDetailEntityPK objAllocationDetailEntityPK = new UserAllocationDetailEntityPK();
+            objAllocationDetailEntityPK.setProjectId(projectId);
+            objAllocationDetailEntityPK.setUsername(userName);
+            
+            return (new UserAllocationDetailRepository().get(objAllocationDetailEntityPK));
         }catch (Exception ex) {
             logger.error(ex.getMessage(), ex);
             throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
@@ -123,9 +137,12 @@
     }
     
     @Override
-    public String getAllocationRequestStatus(String projectId) throws org.apache.thrift.TException{ 
-        try{
-            return (new RequestStatusRepository()).get(projectId).status;
+    public String getAllocationRequestStatus(String projectId, String userName) throws org.apache.thrift.TException{ 
+       try{
+            UserAllocationDetailEntityPK objAllocDetails = new UserAllocationDetailEntityPK();
+            objAllocDetails.setProjectId(projectId);
+            objAllocDetails.setUsername(userName);
+            return (new UserAllocationDetailRepository()).get(objAllocDetails).status;
         }catch (Exception ex) {
             logger.error(ex.getMessage(), ex);
             throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
@@ -166,12 +183,15 @@
     @Override
     public void updateAllocationRequestStatus(String projectId, String status) throws TException {
         // TODO Auto-generated method stub
-        RequestStatusRepository request = new RequestStatusRepository();
+        UserAllocationDetailRepository userAllocationDetail = new UserAllocationDetailRepository();
         try {
-
-                request.get(projectId).setStatus(status);
-                 //once status updated notify user
-                (new NotificationManager()).notificationSender(projectId);
+            UserAllocationDetailEntityPK userAllocationDetailPK  = new UserAllocationDetailEntityPK();
+            userAllocationDetailPK.setProjectId(projectId);
+            userAllocationDetailPK.setUsername(new UserAllocationDetailRepository().getPrimaryOwner(projectId));
+            userAllocationDetail.get(userAllocationDetailPK).setStatus(status);
+            
+            //once status updated notify user
+            (new NotificationManager()).notificationSender(projectId);
         } catch (Exception ex) {
                 logger.error(ex.getMessage(), ex);
     throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
@@ -203,7 +223,22 @@
 
     @Override
     public List<UserAllocationDetail> getAllRequestsForReviewers(String userName)  throws AllocationManagerException, TException {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        List<UserAllocationDetail> userAllocationDetailList = new ArrayList<UserAllocationDetail>(); 
+        try{
+            if(!isReviewer(userName)){
+                throw new AllocationManagerException().setMessage("Invalid reviewer id!");
+            }
+            List<ProjectReviewer> projReviewerList = (new ProjectReviewerRepository()).getProjectForReviewer(userName);
+            for(ProjectReviewer objProj : projReviewerList){
+                UserAllocationDetailEntityPK userAllocationDetailPK  = new UserAllocationDetailEntityPK();
+                userAllocationDetailPK.setProjectId(objProj.id.getProjectId());
+                userAllocationDetailPK.setUsername(new UserAllocationDetailRepository().getPrimaryOwner(objProj.id.getProjectId()));
+                userAllocationDetailList.add(new UserAllocationDetailRepository().get(userAllocationDetailPK));
+            }
+        }catch (Exception ex) {
+            throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
+        }
+        return userAllocationDetailList;
     }
 
     @Override
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/test/java/org/apache/airavata/allocation/manager/AllocationManagerServerHandlerTest.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/test/java/org/apache/airavata/allocation/manager/AllocationManagerServerHandlerTest.java
index 80dc934..3a5e59e 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/test/java/org/apache/airavata/allocation/manager/AllocationManagerServerHandlerTest.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-server/src/test/java/org/apache/airavata/allocation/manager/AllocationManagerServerHandlerTest.java
@@ -70,7 +70,7 @@
 
 
         Assert.assertNotNull(allocationManagerServerHandler.createAllocationRequest(userAllocationDetails));
-        Assert.assertEquals(allocationManagerServerHandler.getAllocationRequest("123"),userAllocationDetails);
+        Assert.assertEquals(allocationManagerServerHandler.getAllocationRequest("123",""),userAllocationDetails);
 
         UserAllocationDetail userAllocationDetails1 = new UserAllocationDetail();
         UserAllocationDetailPK userAllocationDetailPK1 = new UserAllocationDetailPK(); 
@@ -78,9 +78,9 @@
         userAllocationDetailPK1.setUsername("harsha");
         userAllocationDetails1.setId(userAllocationDetailPK1);
 
-        Assert.assertTrue(allocationManagerServerHandler.isAllocationRequestExists(userAllocationDetailPK1.getProjectId()));
+        Assert.assertTrue(allocationManagerServerHandler.isAllocationRequestExists(userAllocationDetailPK1.getProjectId(),""));
         Assert.assertEquals(allocationManagerServerHandler.createAllocationRequest(userAllocationDetails1),"There exist project with the id");
 
-        Assert.assertTrue(allocationManagerServerHandler.deleteAllocationRequest("123"));
+        Assert.assertTrue(allocationManagerServerHandler.deleteAllocationRequest("123",""));
     }
 }
\ No newline at end of file
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/client/AllocationManagerAdminClient.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/client/AllocationManagerAdminClient.java
index 2cd65ba..dc6b90c 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/client/AllocationManagerAdminClient.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/client/AllocationManagerAdminClient.java
@@ -22,6 +22,7 @@
 			if (requestType.equals("UPDATE_REQUEST")) {
 				client.updateAllocationRequestStatus(projectId, status);
 			} else if(requestType.equals("GET_REQUEST")){
+                            
 				client.getAllocationRequest(projectId);
 			}	else if(requestType.equals("GET_REQUEST_STATUS")){
 				client.getAllocationRequestStatus(projectId);
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/AllocationManagerException.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/AllocationManagerException.java
index ef4e395..24647dd 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/AllocationManagerException.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/AllocationManagerException.java
@@ -1,5 +1,5 @@
 /**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
+ * Autogenerated by Thrift Compiler (0.10.0)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -11,7 +11,7 @@
  * <p>Exception model used in the allocation manager service</p>
  * 
  */
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class AllocationManagerException extends org.apache.thrift.TException implements org.apache.thrift.TBase<AllocationManagerException, AllocationManagerException._Fields>, java.io.Serializable, Cloneable, Comparable<AllocationManagerException> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("AllocationManagerException");
 
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/Domain.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/Domain.java
index 4d43a75..6de324d 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/Domain.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/Domain.java
@@ -1,5 +1,5 @@
 /**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
+ * Autogenerated by Thrift Compiler (0.10.0)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -16,7 +16,7 @@
  * <li>updatedTime: Time when domain was updated</li>
  * 
  */
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class Domain implements org.apache.thrift.TBase<Domain, Domain._Fields>, java.io.Serializable, Cloneable, Comparable<Domain> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("Domain");
 
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewer.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewer.java
index 418d589..70185f2 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewer.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewer.java
@@ -1,5 +1,5 @@
 /**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
+ * Autogenerated by Thrift Compiler (0.10.0)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -17,7 +17,7 @@
  * <li>status: Status of the allocation request</li>
  * 
  */
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class ProjectReviewer implements org.apache.thrift.TBase<ProjectReviewer, ProjectReviewer._Fields>, java.io.Serializable, Cloneable, Comparable<ProjectReviewer> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ProjectReviewer");
 
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewerEntityPK.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewerEntityPK.java
deleted file mode 100644
index c70929c..0000000
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewerEntityPK.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
- *
- * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
- *  @generated
- */
-package org.apache.airavata.allocation.manager.models;
-
-@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
-public class ProjectReviewerEntityPK implements org.apache.thrift.TBase<ProjectReviewerEntityPK, ProjectReviewerEntityPK._Fields>, java.io.Serializable, Cloneable, Comparable<ProjectReviewerEntityPK> {
-  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ProjectReviewerEntityPK");
-
-  private static final org.apache.thrift.protocol.TField PROJECT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("projectId", org.apache.thrift.protocol.TType.STRING, (short)1);
-  private static final org.apache.thrift.protocol.TField REVIEWER_FIELD_DESC = new org.apache.thrift.protocol.TField("reviewer", org.apache.thrift.protocol.TType.STRING, (short)4);
-
-  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ProjectReviewerEntityPKStandardSchemeFactory();
-  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ProjectReviewerEntityPKTupleSchemeFactory();
-
-  public java.lang.String projectId; // optional
-  public java.lang.String reviewer; // optional
-
-  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
-  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-    PROJECT_ID((short)1, "projectId"),
-    REVIEWER((short)4, "reviewer");
-
-    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
-
-    static {
-      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
-        byName.put(field.getFieldName(), field);
-      }
-    }
-
-    /**
-     * Find the _Fields constant that matches fieldId, or null if its not found.
-     */
-    public static _Fields findByThriftId(int fieldId) {
-      switch(fieldId) {
-        case 1: // PROJECT_ID
-          return PROJECT_ID;
-        case 4: // REVIEWER
-          return REVIEWER;
-        default:
-          return null;
-      }
-    }
-
-    /**
-     * Find the _Fields constant that matches fieldId, throwing an exception
-     * if it is not found.
-     */
-    public static _Fields findByThriftIdOrThrow(int fieldId) {
-      _Fields fields = findByThriftId(fieldId);
-      if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
-      return fields;
-    }
-
-    /**
-     * Find the _Fields constant that matches name, or null if its not found.
-     */
-    public static _Fields findByName(java.lang.String name) {
-      return byName.get(name);
-    }
-
-    private final short _thriftId;
-    private final java.lang.String _fieldName;
-
-    _Fields(short thriftId, java.lang.String fieldName) {
-      _thriftId = thriftId;
-      _fieldName = fieldName;
-    }
-
-    public short getThriftFieldId() {
-      return _thriftId;
-    }
-
-    public java.lang.String getFieldName() {
-      return _fieldName;
-    }
-  }
-
-  // isset id assignments
-  private static final _Fields optionals[] = {_Fields.PROJECT_ID,_Fields.REVIEWER};
-  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
-  static {
-    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
-    tmpMap.put(_Fields.PROJECT_ID, new org.apache.thrift.meta_data.FieldMetaData("projectId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
-        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
-    tmpMap.put(_Fields.REVIEWER, new org.apache.thrift.meta_data.FieldMetaData("reviewer", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
-        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
-    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
-    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ProjectReviewerEntityPK.class, metaDataMap);
-  }
-
-  public ProjectReviewerEntityPK() {
-  }
-
-  /**
-   * Performs a deep copy on <i>other</i>.
-   */
-  public ProjectReviewerEntityPK(ProjectReviewerEntityPK other) {
-    if (other.isSetProjectId()) {
-      this.projectId = other.projectId;
-    }
-    if (other.isSetReviewer()) {
-      this.reviewer = other.reviewer;
-    }
-  }
-
-  public ProjectReviewerEntityPK deepCopy() {
-    return new ProjectReviewerEntityPK(this);
-  }
-
-  @Override
-  public void clear() {
-    this.projectId = null;
-    this.reviewer = null;
-  }
-
-  public java.lang.String getProjectId() {
-    return this.projectId;
-  }
-
-  public ProjectReviewerEntityPK setProjectId(java.lang.String projectId) {
-    this.projectId = projectId;
-    return this;
-  }
-
-  public void unsetProjectId() {
-    this.projectId = null;
-  }
-
-  /** Returns true if field projectId is set (has been assigned a value) and false otherwise */
-  public boolean isSetProjectId() {
-    return this.projectId != null;
-  }
-
-  public void setProjectIdIsSet(boolean value) {
-    if (!value) {
-      this.projectId = null;
-    }
-  }
-
-  public java.lang.String getReviewer() {
-    return this.reviewer;
-  }
-
-  public ProjectReviewerEntityPK setReviewer(java.lang.String reviewer) {
-    this.reviewer = reviewer;
-    return this;
-  }
-
-  public void unsetReviewer() {
-    this.reviewer = null;
-  }
-
-  /** Returns true if field reviewer is set (has been assigned a value) and false otherwise */
-  public boolean isSetReviewer() {
-    return this.reviewer != null;
-  }
-
-  public void setReviewerIsSet(boolean value) {
-    if (!value) {
-      this.reviewer = null;
-    }
-  }
-
-  public void setFieldValue(_Fields field, java.lang.Object value) {
-    switch (field) {
-    case PROJECT_ID:
-      if (value == null) {
-        unsetProjectId();
-      } else {
-        setProjectId((java.lang.String)value);
-      }
-      break;
-
-    case REVIEWER:
-      if (value == null) {
-        unsetReviewer();
-      } else {
-        setReviewer((java.lang.String)value);
-      }
-      break;
-
-    }
-  }
-
-  public java.lang.Object getFieldValue(_Fields field) {
-    switch (field) {
-    case PROJECT_ID:
-      return getProjectId();
-
-    case REVIEWER:
-      return getReviewer();
-
-    }
-    throw new java.lang.IllegalStateException();
-  }
-
-  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
-  public boolean isSet(_Fields field) {
-    if (field == null) {
-      throw new java.lang.IllegalArgumentException();
-    }
-
-    switch (field) {
-    case PROJECT_ID:
-      return isSetProjectId();
-    case REVIEWER:
-      return isSetReviewer();
-    }
-    throw new java.lang.IllegalStateException();
-  }
-
-  @Override
-  public boolean equals(java.lang.Object that) {
-    if (that == null)
-      return false;
-    if (that instanceof ProjectReviewerEntityPK)
-      return this.equals((ProjectReviewerEntityPK)that);
-    return false;
-  }
-
-  public boolean equals(ProjectReviewerEntityPK that) {
-    if (that == null)
-      return false;
-    if (this == that)
-      return true;
-
-    boolean this_present_projectId = true && this.isSetProjectId();
-    boolean that_present_projectId = true && that.isSetProjectId();
-    if (this_present_projectId || that_present_projectId) {
-      if (!(this_present_projectId && that_present_projectId))
-        return false;
-      if (!this.projectId.equals(that.projectId))
-        return false;
-    }
-
-    boolean this_present_reviewer = true && this.isSetReviewer();
-    boolean that_present_reviewer = true && that.isSetReviewer();
-    if (this_present_reviewer || that_present_reviewer) {
-      if (!(this_present_reviewer && that_present_reviewer))
-        return false;
-      if (!this.reviewer.equals(that.reviewer))
-        return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int hashCode = 1;
-
-    hashCode = hashCode * 8191 + ((isSetProjectId()) ? 131071 : 524287);
-    if (isSetProjectId())
-      hashCode = hashCode * 8191 + projectId.hashCode();
-
-    hashCode = hashCode * 8191 + ((isSetReviewer()) ? 131071 : 524287);
-    if (isSetReviewer())
-      hashCode = hashCode * 8191 + reviewer.hashCode();
-
-    return hashCode;
-  }
-
-  @Override
-  public int compareTo(ProjectReviewerEntityPK other) {
-    if (!getClass().equals(other.getClass())) {
-      return getClass().getName().compareTo(other.getClass().getName());
-    }
-
-    int lastComparison = 0;
-
-    lastComparison = java.lang.Boolean.valueOf(isSetProjectId()).compareTo(other.isSetProjectId());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetProjectId()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.projectId, other.projectId);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
-    lastComparison = java.lang.Boolean.valueOf(isSetReviewer()).compareTo(other.isSetReviewer());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetReviewer()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reviewer, other.reviewer);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
-    return 0;
-  }
-
-  public _Fields fieldForId(int fieldId) {
-    return _Fields.findByThriftId(fieldId);
-  }
-
-  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
-    scheme(iprot).read(iprot, this);
-  }
-
-  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
-    scheme(oprot).write(oprot, this);
-  }
-
-  @Override
-  public java.lang.String toString() {
-    java.lang.StringBuilder sb = new java.lang.StringBuilder("ProjectReviewerEntityPK(");
-    boolean first = true;
-
-    if (isSetProjectId()) {
-      sb.append("projectId:");
-      if (this.projectId == null) {
-        sb.append("null");
-      } else {
-        sb.append(this.projectId);
-      }
-      first = false;
-    }
-    if (isSetReviewer()) {
-      if (!first) sb.append(", ");
-      sb.append("reviewer:");
-      if (this.reviewer == null) {
-        sb.append("null");
-      } else {
-        sb.append(this.reviewer);
-      }
-      first = false;
-    }
-    sb.append(")");
-    return sb.toString();
-  }
-
-  public void validate() throws org.apache.thrift.TException {
-    // check for required fields
-    // check for sub-struct validity
-  }
-
-  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
-    try {
-      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
-    } catch (org.apache.thrift.TException te) {
-      throw new java.io.IOException(te);
-    }
-  }
-
-  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {
-    try {
-      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
-    } catch (org.apache.thrift.TException te) {
-      throw new java.io.IOException(te);
-    }
-  }
-
-  private static class ProjectReviewerEntityPKStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-    public ProjectReviewerEntityPKStandardScheme getScheme() {
-      return new ProjectReviewerEntityPKStandardScheme();
-    }
-  }
-
-  private static class ProjectReviewerEntityPKStandardScheme extends org.apache.thrift.scheme.StandardScheme<ProjectReviewerEntityPK> {
-
-    public void read(org.apache.thrift.protocol.TProtocol iprot, ProjectReviewerEntityPK struct) throws org.apache.thrift.TException {
-      org.apache.thrift.protocol.TField schemeField;
-      iprot.readStructBegin();
-      while (true)
-      {
-        schemeField = iprot.readFieldBegin();
-        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
-          break;
-        }
-        switch (schemeField.id) {
-          case 1: // PROJECT_ID
-            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
-              struct.projectId = iprot.readString();
-              struct.setProjectIdIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
-            }
-            break;
-          case 4: // REVIEWER
-            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
-              struct.reviewer = iprot.readString();
-              struct.setReviewerIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
-            }
-            break;
-          default:
-            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
-        }
-        iprot.readFieldEnd();
-      }
-      iprot.readStructEnd();
-
-      // check for required fields of primitive type, which can't be checked in the validate method
-      struct.validate();
-    }
-
-    public void write(org.apache.thrift.protocol.TProtocol oprot, ProjectReviewerEntityPK struct) throws org.apache.thrift.TException {
-      struct.validate();
-
-      oprot.writeStructBegin(STRUCT_DESC);
-      if (struct.projectId != null) {
-        if (struct.isSetProjectId()) {
-          oprot.writeFieldBegin(PROJECT_ID_FIELD_DESC);
-          oprot.writeString(struct.projectId);
-          oprot.writeFieldEnd();
-        }
-      }
-      if (struct.reviewer != null) {
-        if (struct.isSetReviewer()) {
-          oprot.writeFieldBegin(REVIEWER_FIELD_DESC);
-          oprot.writeString(struct.reviewer);
-          oprot.writeFieldEnd();
-        }
-      }
-      oprot.writeFieldStop();
-      oprot.writeStructEnd();
-    }
-
-  }
-
-  private static class ProjectReviewerEntityPKTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-    public ProjectReviewerEntityPKTupleScheme getScheme() {
-      return new ProjectReviewerEntityPKTupleScheme();
-    }
-  }
-
-  private static class ProjectReviewerEntityPKTupleScheme extends org.apache.thrift.scheme.TupleScheme<ProjectReviewerEntityPK> {
-
-    @Override
-    public void write(org.apache.thrift.protocol.TProtocol prot, ProjectReviewerEntityPK struct) throws org.apache.thrift.TException {
-      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
-      java.util.BitSet optionals = new java.util.BitSet();
-      if (struct.isSetProjectId()) {
-        optionals.set(0);
-      }
-      if (struct.isSetReviewer()) {
-        optionals.set(1);
-      }
-      oprot.writeBitSet(optionals, 2);
-      if (struct.isSetProjectId()) {
-        oprot.writeString(struct.projectId);
-      }
-      if (struct.isSetReviewer()) {
-        oprot.writeString(struct.reviewer);
-      }
-    }
-
-    @Override
-    public void read(org.apache.thrift.protocol.TProtocol prot, ProjectReviewerEntityPK struct) throws org.apache.thrift.TException {
-      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
-      java.util.BitSet incoming = iprot.readBitSet(2);
-      if (incoming.get(0)) {
-        struct.projectId = iprot.readString();
-        struct.setProjectIdIsSet(true);
-      }
-      if (incoming.get(1)) {
-        struct.reviewer = iprot.readString();
-        struct.setReviewerIsSet(true);
-      }
-    }
-  }
-
-  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {
-    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
-  }
-}
-
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewerPK.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewerPK.java
index f6bd0c2..2ca2a85 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewerPK.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/ProjectReviewerPK.java
@@ -1,5 +1,5 @@
 /**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
+ * Autogenerated by Thrift Compiler (0.10.0)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -7,7 +7,7 @@
 package org.apache.airavata.allocation.manager.models;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class ProjectReviewerPK implements org.apache.thrift.TBase<ProjectReviewerPK, ProjectReviewerPK._Fields>, java.io.Serializable, Cloneable, Comparable<ProjectReviewerPK> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ProjectReviewerPK");
 
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserAllocationDetail.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserAllocationDetail.java
index 557049d..256ff4c 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserAllocationDetail.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserAllocationDetail.java
@@ -1,5 +1,5 @@
 /**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
+ * Autogenerated by Thrift Compiler (0.10.0)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -27,7 +27,7 @@
  * <li>typicalSuPerJob :  An optional field to help reviewer and PI for allocation approval</li>
  * 
  */
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class UserAllocationDetail implements org.apache.thrift.TBase<UserAllocationDetail, UserAllocationDetail._Fields>, java.io.Serializable, Cloneable, Comparable<UserAllocationDetail> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("UserAllocationDetail");
 
@@ -51,6 +51,7 @@
   private static final org.apache.thrift.protocol.TField START_DATE_FIELD_DESC = new org.apache.thrift.protocol.TField("startDate", org.apache.thrift.protocol.TType.I64, (short)18);
   private static final org.apache.thrift.protocol.TField END_DATE_FIELD_DESC = new org.apache.thrift.protocol.TField("endDate", org.apache.thrift.protocol.TType.I64, (short)19);
   private static final org.apache.thrift.protocol.TField STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("status", org.apache.thrift.protocol.TType.STRING, (short)20);
+  private static final org.apache.thrift.protocol.TField IS_PRIMARY_OWNER_FIELD_DESC = new org.apache.thrift.protocol.TField("isPrimaryOwner", org.apache.thrift.protocol.TType.BOOL, (short)21);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new UserAllocationDetailStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new UserAllocationDetailTupleSchemeFactory();
@@ -75,6 +76,7 @@
   public long startDate; // optional
   public long endDate; // optional
   public java.lang.String status; // optional
+  public boolean isPrimaryOwner; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -97,7 +99,8 @@
     AWARD_ALLOCATION((short)17, "awardAllocation"),
     START_DATE((short)18, "startDate"),
     END_DATE((short)19, "endDate"),
-    STATUS((short)20, "status");
+    STATUS((short)20, "status"),
+    IS_PRIMARY_OWNER((short)21, "isPrimaryOwner");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -152,6 +155,8 @@
           return END_DATE;
         case 20: // STATUS
           return STATUS;
+        case 21: // IS_PRIMARY_OWNER
+          return IS_PRIMARY_OWNER;
         default:
           return null;
       }
@@ -201,8 +206,9 @@
   private static final int __AWARDALLOCATION_ISSET_ID = 6;
   private static final int __STARTDATE_ISSET_ID = 7;
   private static final int __ENDDATE_ISSET_ID = 8;
+  private static final int __ISPRIMARYOWNER_ISSET_ID = 9;
   private short __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.ID,_Fields.APPLICATIONS_TO_BE_USED,_Fields.DISK_USAGE_RANGE_PER_JOB,_Fields.DOCUMENTS,_Fields.FIELD_OF_SCIENCE,_Fields.KEYWORDS,_Fields.MAX_MEMORY_PER_CPU,_Fields.NUMBER_OF_CPU_PER_JOB,_Fields.PROJECT_DESCRIPTION,_Fields.PROJECT_REVIEWED_AND_FUNDED_BY,_Fields.REQUESTED_DATE,_Fields.SERVICE_UNITS,_Fields.SPECIFIC_RESOURCE_SELECTION,_Fields.TITLE,_Fields.TYPE_OF_ALLOCATION,_Fields.TYPICAL_SU_PER_JOB,_Fields.AWARD_ALLOCATION,_Fields.START_DATE,_Fields.END_DATE,_Fields.STATUS};
+  private static final _Fields optionals[] = {_Fields.ID,_Fields.APPLICATIONS_TO_BE_USED,_Fields.DISK_USAGE_RANGE_PER_JOB,_Fields.DOCUMENTS,_Fields.FIELD_OF_SCIENCE,_Fields.KEYWORDS,_Fields.MAX_MEMORY_PER_CPU,_Fields.NUMBER_OF_CPU_PER_JOB,_Fields.PROJECT_DESCRIPTION,_Fields.PROJECT_REVIEWED_AND_FUNDED_BY,_Fields.REQUESTED_DATE,_Fields.SERVICE_UNITS,_Fields.SPECIFIC_RESOURCE_SELECTION,_Fields.TITLE,_Fields.TYPE_OF_ALLOCATION,_Fields.TYPICAL_SU_PER_JOB,_Fields.AWARD_ALLOCATION,_Fields.START_DATE,_Fields.END_DATE,_Fields.STATUS,_Fields.IS_PRIMARY_OWNER};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -246,6 +252,8 @@
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.STATUS, new org.apache.thrift.meta_data.FieldMetaData("status", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.IS_PRIMARY_OWNER, new org.apache.thrift.meta_data.FieldMetaData("isPrimaryOwner", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(UserAllocationDetail.class, metaDataMap);
   }
@@ -300,6 +308,7 @@
     if (other.isSetStatus()) {
       this.status = other.status;
     }
+    this.isPrimaryOwner = other.isPrimaryOwner;
   }
 
   public UserAllocationDetail deepCopy() {
@@ -337,6 +346,8 @@
     setEndDateIsSet(false);
     this.endDate = 0;
     this.status = null;
+    setIsPrimaryOwnerIsSet(false);
+    this.isPrimaryOwner = false;
   }
 
   public UserAllocationDetailPK getId() {
@@ -820,6 +831,29 @@
     }
   }
 
+  public boolean isIsPrimaryOwner() {
+    return this.isPrimaryOwner;
+  }
+
+  public UserAllocationDetail setIsPrimaryOwner(boolean isPrimaryOwner) {
+    this.isPrimaryOwner = isPrimaryOwner;
+    setIsPrimaryOwnerIsSet(true);
+    return this;
+  }
+
+  public void unsetIsPrimaryOwner() {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ISPRIMARYOWNER_ISSET_ID);
+  }
+
+  /** Returns true if field isPrimaryOwner is set (has been assigned a value) and false otherwise */
+  public boolean isSetIsPrimaryOwner() {
+    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ISPRIMARYOWNER_ISSET_ID);
+  }
+
+  public void setIsPrimaryOwnerIsSet(boolean value) {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ISPRIMARYOWNER_ISSET_ID, value);
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case ID:
@@ -986,6 +1020,14 @@
       }
       break;
 
+    case IS_PRIMARY_OWNER:
+      if (value == null) {
+        unsetIsPrimaryOwner();
+      } else {
+        setIsPrimaryOwner((java.lang.Boolean)value);
+      }
+      break;
+
     }
   }
 
@@ -1051,6 +1093,9 @@
     case STATUS:
       return getStatus();
 
+    case IS_PRIMARY_OWNER:
+      return isIsPrimaryOwner();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -1102,6 +1147,8 @@
       return isSetEndDate();
     case STATUS:
       return isSetStatus();
+    case IS_PRIMARY_OWNER:
+      return isSetIsPrimaryOwner();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -1301,6 +1348,15 @@
         return false;
     }
 
+    boolean this_present_isPrimaryOwner = true && this.isSetIsPrimaryOwner();
+    boolean that_present_isPrimaryOwner = true && that.isSetIsPrimaryOwner();
+    if (this_present_isPrimaryOwner || that_present_isPrimaryOwner) {
+      if (!(this_present_isPrimaryOwner && that_present_isPrimaryOwner))
+        return false;
+      if (this.isPrimaryOwner != that.isPrimaryOwner)
+        return false;
+    }
+
     return true;
   }
 
@@ -1388,6 +1444,10 @@
     if (isSetStatus())
       hashCode = hashCode * 8191 + status.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetIsPrimaryOwner()) ? 131071 : 524287);
+    if (isSetIsPrimaryOwner())
+      hashCode = hashCode * 8191 + ((isPrimaryOwner) ? 131071 : 524287);
+
     return hashCode;
   }
 
@@ -1599,6 +1659,16 @@
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetIsPrimaryOwner()).compareTo(other.isSetIsPrimaryOwner());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetIsPrimaryOwner()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.isPrimaryOwner, other.isPrimaryOwner);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -1782,6 +1852,12 @@
       }
       first = false;
     }
+    if (isSetIsPrimaryOwner()) {
+      if (!first) sb.append(", ");
+      sb.append("isPrimaryOwner:");
+      sb.append(this.isPrimaryOwner);
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -1991,6 +2067,14 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 21: // IS_PRIMARY_OWNER
+            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+              struct.isPrimaryOwner = iprot.readBool();
+              struct.setIsPrimaryOwnerIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -2128,6 +2212,11 @@
           oprot.writeFieldEnd();
         }
       }
+      if (struct.isSetIsPrimaryOwner()) {
+        oprot.writeFieldBegin(IS_PRIMARY_OWNER_FIELD_DESC);
+        oprot.writeBool(struct.isPrimaryOwner);
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -2206,7 +2295,10 @@
       if (struct.isSetStatus()) {
         optionals.set(19);
       }
-      oprot.writeBitSet(optionals, 20);
+      if (struct.isSetIsPrimaryOwner()) {
+        optionals.set(20);
+      }
+      oprot.writeBitSet(optionals, 21);
       if (struct.isSetId()) {
         struct.id.write(oprot);
       }
@@ -2267,12 +2359,15 @@
       if (struct.isSetStatus()) {
         oprot.writeString(struct.status);
       }
+      if (struct.isSetIsPrimaryOwner()) {
+        oprot.writeBool(struct.isPrimaryOwner);
+      }
     }
 
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, UserAllocationDetail struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
-      java.util.BitSet incoming = iprot.readBitSet(20);
+      java.util.BitSet incoming = iprot.readBitSet(21);
       if (incoming.get(0)) {
         struct.id = new UserAllocationDetailPK();
         struct.id.read(iprot);
@@ -2354,6 +2449,10 @@
         struct.status = iprot.readString();
         struct.setStatusIsSet(true);
       }
+      if (incoming.get(20)) {
+        struct.isPrimaryOwner = iprot.readBool();
+        struct.setIsPrimaryOwnerIsSet(true);
+      }
     }
   }
 
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserAllocationDetailPK.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserAllocationDetailPK.java
index cb46d72..1e50a0c 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserAllocationDetailPK.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserAllocationDetailPK.java
@@ -1,5 +1,5 @@
 /**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
+ * Autogenerated by Thrift Compiler (0.10.0)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -13,7 +13,7 @@
  * <li>sponsorName : Name of supervisor, manager, group leader or self</li>
  * 
  */
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class UserAllocationDetailPK implements org.apache.thrift.TBase<UserAllocationDetailPK, UserAllocationDetailPK._Fields>, java.io.Serializable, Cloneable, Comparable<UserAllocationDetailPK> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("UserAllocationDetailPK");
 
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserDetail.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserDetail.java
index 03cc2f5..6348406 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserDetail.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/models/UserDetail.java
@@ -1,5 +1,5 @@
 /**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
+ * Autogenerated by Thrift Compiler (0.10.0)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -16,7 +16,7 @@
  * <li>userType: Type of the user</li>
  * 
  */
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class UserDetail implements org.apache.thrift.TBase<UserDetail, UserDetail._Fields>, java.io.Serializable, Cloneable, Comparable<UserDetail> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("UserDetail");
 
diff --git a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/service/cpi/AllocationRegistryService.java b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/service/cpi/AllocationRegistryService.java
index 65234f8..2faba92 100644
--- a/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/service/cpi/AllocationRegistryService.java
+++ b/allocation-manager/airavata-allocation-manager/airavata-allocation-manager-stubs/src/main/java/org/apache/airavata/allocation/manager/service/cpi/AllocationRegistryService.java
@@ -1,5 +1,5 @@
 /**
- * Autogenerated by Thrift Compiler (1.0.0-dev)
+ * Autogenerated by Thrift Compiler (0.10.0)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -7,7 +7,7 @@
 package org.apache.airavata.allocation.manager.service.cpi;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
-@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (1.0.0-dev)", date = "2017-12-08")
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class AllocationRegistryService {
 
   public interface Iface {
@@ -23,22 +23,25 @@
      * <p>API method to check if the allocation request exists</p>
      * 
      * @param projectId
+     * @param userName
      */
-    public boolean isAllocationRequestExists(java.lang.String projectId) throws org.apache.thrift.TException;
+    public boolean isAllocationRequestExists(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException;
 
     /**
      * <p>API method to delete allocation request</p>
      * 
      * @param projectId
+     * @param userName
      */
-    public boolean deleteAllocationRequest(java.lang.String projectId) throws org.apache.thrift.TException;
+    public boolean deleteAllocationRequest(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException;
 
     /**
      * <p>API method to get an allocation Request</p>
      * 
      * @param projectId
+     * @param userName
      */
-    public org.apache.airavata.allocation.manager.models.UserAllocationDetail getAllocationRequest(java.lang.String projectId) throws org.apache.thrift.TException;
+    public org.apache.airavata.allocation.manager.models.UserAllocationDetail getAllocationRequest(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException;
 
     /**
      * <p>API method to update an allocation Request</p>
@@ -51,8 +54,9 @@
      * <p>API method to get an allocation Request status</p>
      * 
      * @param projectId
+     * @param userName
      */
-    public java.lang.String getAllocationRequestStatus(java.lang.String projectId) throws org.apache.thrift.TException;
+    public java.lang.String getAllocationRequestStatus(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException;
 
     /**
      * <p>API method to get an allocation Request PI email</p>
@@ -147,15 +151,15 @@
 
     public void createAllocationRequest(org.apache.airavata.allocation.manager.models.UserAllocationDetail allocDetail, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler) throws org.apache.thrift.TException;
 
-    public void isAllocationRequestExists(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;
+    public void isAllocationRequestExists(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;
 
-    public void deleteAllocationRequest(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;
+    public void deleteAllocationRequest(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;
 
-    public void getAllocationRequest(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.allocation.manager.models.UserAllocationDetail> resultHandler) throws org.apache.thrift.TException;
+    public void getAllocationRequest(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.allocation.manager.models.UserAllocationDetail> resultHandler) throws org.apache.thrift.TException;
 
     public void updateAllocationRequest(org.apache.airavata.allocation.manager.models.UserAllocationDetail allocDetail, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;
 
-    public void getAllocationRequestStatus(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler) throws org.apache.thrift.TException;
+    public void getAllocationRequestStatus(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler) throws org.apache.thrift.TException;
 
     public void getAllocationRequestUserEmail(java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler) throws org.apache.thrift.TException;
 
@@ -226,16 +230,17 @@
       throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "createAllocationRequest failed: unknown result");
     }
 
-    public boolean isAllocationRequestExists(java.lang.String projectId) throws org.apache.thrift.TException
+    public boolean isAllocationRequestExists(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException
     {
-      send_isAllocationRequestExists(projectId);
+      send_isAllocationRequestExists(projectId, userName);
       return recv_isAllocationRequestExists();
     }
 
-    public void send_isAllocationRequestExists(java.lang.String projectId) throws org.apache.thrift.TException
+    public void send_isAllocationRequestExists(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException
     {
       isAllocationRequestExists_args args = new isAllocationRequestExists_args();
       args.setProjectId(projectId);
+      args.setUserName(userName);
       sendBase("isAllocationRequestExists", args);
     }
 
@@ -249,16 +254,17 @@
       throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "isAllocationRequestExists failed: unknown result");
     }
 
-    public boolean deleteAllocationRequest(java.lang.String projectId) throws org.apache.thrift.TException
+    public boolean deleteAllocationRequest(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException
     {
-      send_deleteAllocationRequest(projectId);
+      send_deleteAllocationRequest(projectId, userName);
       return recv_deleteAllocationRequest();
     }
 
-    public void send_deleteAllocationRequest(java.lang.String projectId) throws org.apache.thrift.TException
+    public void send_deleteAllocationRequest(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException
     {
       deleteAllocationRequest_args args = new deleteAllocationRequest_args();
       args.setProjectId(projectId);
+      args.setUserName(userName);
       sendBase("deleteAllocationRequest", args);
     }
 
@@ -272,16 +278,17 @@
       throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "deleteAllocationRequest failed: unknown result");
     }
 
-    public org.apache.airavata.allocation.manager.models.UserAllocationDetail getAllocationRequest(java.lang.String projectId) throws org.apache.thrift.TException
+    public org.apache.airavata.allocation.manager.models.UserAllocationDetail getAllocationRequest(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException
     {
-      send_getAllocationRequest(projectId);
+      send_getAllocationRequest(projectId, userName);
       return recv_getAllocationRequest();
     }
 
-    public void send_getAllocationRequest(java.lang.String projectId) throws org.apache.thrift.TException
+    public void send_getAllocationRequest(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException
     {
       getAllocationRequest_args args = new getAllocationRequest_args();
       args.setProjectId(projectId);
+      args.setUserName(userName);
       sendBase("getAllocationRequest", args);
     }
 
@@ -318,16 +325,17 @@
       throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "updateAllocationRequest failed: unknown result");
     }
 
-    public java.lang.String getAllocationRequestStatus(java.lang.String projectId) throws org.apache.thrift.TException
+    public java.lang.String getAllocationRequestStatus(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException
     {
-      send_getAllocationRequestStatus(projectId);
+      send_getAllocationRequestStatus(projectId, userName);
       return recv_getAllocationRequestStatus();
     }
 
-    public void send_getAllocationRequestStatus(java.lang.String projectId) throws org.apache.thrift.TException
+    public void send_getAllocationRequestStatus(java.lang.String projectId, java.lang.String userName) throws org.apache.thrift.TException
     {
       getAllocationRequestStatus_args args = new getAllocationRequestStatus_args();
       args.setProjectId(projectId);
+      args.setUserName(userName);
       sendBase("getAllocationRequestStatus", args);
     }
 
@@ -667,24 +675,27 @@
       }
     }
 
-    public void isAllocationRequestExists(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
+    public void isAllocationRequestExists(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      isAllocationRequestExists_call method_call = new isAllocationRequestExists_call(projectId, resultHandler, this, ___protocolFactory, ___transport);
+      isAllocationRequestExists_call method_call = new isAllocationRequestExists_call(projectId, userName, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
 
     public static class isAllocationRequestExists_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {
       private java.lang.String projectId;
-      public isAllocationRequestExists_call(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private java.lang.String userName;
+      public isAllocationRequestExists_call(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
         this.projectId = projectId;
+        this.userName = userName;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
         prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("isAllocationRequestExists", org.apache.thrift.protocol.TMessageType.CALL, 0));
         isAllocationRequestExists_args args = new isAllocationRequestExists_args();
         args.setProjectId(projectId);
+        args.setUserName(userName);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -699,24 +710,27 @@
       }
     }
 
-    public void deleteAllocationRequest(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
+    public void deleteAllocationRequest(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      deleteAllocationRequest_call method_call = new deleteAllocationRequest_call(projectId, resultHandler, this, ___protocolFactory, ___transport);
+      deleteAllocationRequest_call method_call = new deleteAllocationRequest_call(projectId, userName, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
 
     public static class deleteAllocationRequest_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {
       private java.lang.String projectId;
-      public deleteAllocationRequest_call(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private java.lang.String userName;
+      public deleteAllocationRequest_call(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
         this.projectId = projectId;
+        this.userName = userName;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
         prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("deleteAllocationRequest", org.apache.thrift.protocol.TMessageType.CALL, 0));
         deleteAllocationRequest_args args = new deleteAllocationRequest_args();
         args.setProjectId(projectId);
+        args.setUserName(userName);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -731,24 +745,27 @@
       }
     }
 
-    public void getAllocationRequest(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.allocation.manager.models.UserAllocationDetail> resultHandler) throws org.apache.thrift.TException {
+    public void getAllocationRequest(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.allocation.manager.models.UserAllocationDetail> resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      getAllocationRequest_call method_call = new getAllocationRequest_call(projectId, resultHandler, this, ___protocolFactory, ___transport);
+      getAllocationRequest_call method_call = new getAllocationRequest_call(projectId, userName, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
 
     public static class getAllocationRequest_call extends org.apache.thrift.async.TAsyncMethodCall<org.apache.airavata.allocation.manager.models.UserAllocationDetail> {
       private java.lang.String projectId;
-      public getAllocationRequest_call(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.allocation.manager.models.UserAllocationDetail> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private java.lang.String userName;
+      public getAllocationRequest_call(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.allocation.manager.models.UserAllocationDetail> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
         this.projectId = projectId;
+        this.userName = userName;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
         prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("getAllocationRequest", org.apache.thrift.protocol.TMessageType.CALL, 0));
         getAllocationRequest_args args = new getAllocationRequest_args();
         args.setProjectId(projectId);
+        args.setUserName(userName);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -795,24 +812,27 @@
       }
     }
 
-    public void getAllocationRequestStatus(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler) throws org.apache.thrift.TException {
+    public void getAllocationRequestStatus(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      getAllocationRequestStatus_call method_call = new getAllocationRequestStatus_call(projectId, resultHandler, this, ___protocolFactory, ___transport);
+      getAllocationRequestStatus_call method_call = new getAllocationRequestStatus_call(projectId, userName, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
 
     public static class getAllocationRequestStatus_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.String> {
       private java.lang.String projectId;
-      public getAllocationRequestStatus_call(java.lang.String projectId, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private java.lang.String userName;
+      public getAllocationRequestStatus_call(java.lang.String projectId, java.lang.String userName, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
         this.projectId = projectId;
+        this.userName = userName;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
         prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("getAllocationRequestStatus", org.apache.thrift.protocol.TMessageType.CALL, 0));
         getAllocationRequestStatus_args args = new getAllocationRequestStatus_args();
         args.setProjectId(projectId);
+        args.setUserName(userName);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -1267,11 +1287,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public createAllocationRequest_result getResult(I iface, createAllocationRequest_args args) throws org.apache.thrift.TException {
         createAllocationRequest_result result = new createAllocationRequest_result();
         result.success = iface.createAllocationRequest(args.allocDetail);
@@ -1292,14 +1307,9 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public isAllocationRequestExists_result getResult(I iface, isAllocationRequestExists_args args) throws org.apache.thrift.TException {
         isAllocationRequestExists_result result = new isAllocationRequestExists_result();
-        result.success = iface.isAllocationRequestExists(args.projectId);
+        result.success = iface.isAllocationRequestExists(args.projectId, args.userName);
         result.setSuccessIsSet(true);
         return result;
       }
@@ -1318,14 +1328,9 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public deleteAllocationRequest_result getResult(I iface, deleteAllocationRequest_args args) throws org.apache.thrift.TException {
         deleteAllocationRequest_result result = new deleteAllocationRequest_result();
-        result.success = iface.deleteAllocationRequest(args.projectId);
+        result.success = iface.deleteAllocationRequest(args.projectId, args.userName);
         result.setSuccessIsSet(true);
         return result;
       }
@@ -1344,14 +1349,9 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getAllocationRequest_result getResult(I iface, getAllocationRequest_args args) throws org.apache.thrift.TException {
         getAllocationRequest_result result = new getAllocationRequest_result();
-        result.success = iface.getAllocationRequest(args.projectId);
+        result.success = iface.getAllocationRequest(args.projectId, args.userName);
         return result;
       }
     }
@@ -1369,11 +1369,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public updateAllocationRequest_result getResult(I iface, updateAllocationRequest_args args) throws org.apache.thrift.TException {
         updateAllocationRequest_result result = new updateAllocationRequest_result();
         result.success = iface.updateAllocationRequest(args.allocDetail);
@@ -1395,14 +1390,9 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getAllocationRequestStatus_result getResult(I iface, getAllocationRequestStatus_args args) throws org.apache.thrift.TException {
         getAllocationRequestStatus_result result = new getAllocationRequestStatus_result();
-        result.success = iface.getAllocationRequestStatus(args.projectId);
+        result.success = iface.getAllocationRequestStatus(args.projectId, args.userName);
         return result;
       }
     }
@@ -1420,11 +1410,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getAllocationRequestUserEmail_result getResult(I iface, getAllocationRequestUserEmail_args args) throws org.apache.thrift.TException {
         getAllocationRequestUserEmail_result result = new getAllocationRequestUserEmail_result();
         result.success = iface.getAllocationRequestUserEmail(args.userName);
@@ -1445,11 +1430,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getAllocationManagerAdminEmail_result getResult(I iface, getAllocationManagerAdminEmail_args args) throws org.apache.thrift.TException {
         getAllocationManagerAdminEmail_result result = new getAllocationManagerAdminEmail_result();
         result.success = iface.getAllocationManagerAdminEmail(args.userType);
@@ -1470,11 +1450,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getAllocationRequestUserName_result getResult(I iface, getAllocationRequestUserName_args args) throws org.apache.thrift.TException {
         getAllocationRequestUserName_result result = new getAllocationRequestUserName_result();
         result.success = iface.getAllocationRequestUserName(args.projectId);
@@ -1495,11 +1470,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public updateAllocationRequestStatus_result getResult(I iface, updateAllocationRequestStatus_args args) throws org.apache.thrift.TException {
         updateAllocationRequestStatus_result result = new updateAllocationRequestStatus_result();
         iface.updateAllocationRequestStatus(args.projectId, args.status);
@@ -1520,11 +1490,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getAllRequestsForAdmin_result getResult(I iface, getAllRequestsForAdmin_args args) throws org.apache.thrift.TException {
         getAllRequestsForAdmin_result result = new getAllRequestsForAdmin_result();
         result.success = iface.getAllRequestsForAdmin(args.userName);
@@ -1545,11 +1510,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public assignReviewers_result getResult(I iface, assignReviewers_args args) throws org.apache.thrift.TException {
         assignReviewers_result result = new assignReviewers_result();
         result.success = iface.assignReviewers(args.projectId, args.userName);
@@ -1571,11 +1531,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public updateRequestByReviewer_result getResult(I iface, updateRequestByReviewer_args args) throws org.apache.thrift.TException {
         updateRequestByReviewer_result result = new updateRequestByReviewer_result();
         result.success = iface.updateRequestByReviewer(args.projectId, args.userAllocationDetail);
@@ -1597,11 +1552,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public isAdmin_result getResult(I iface, isAdmin_args args) throws org.apache.thrift.TException {
         isAdmin_result result = new isAdmin_result();
         result.success = iface.isAdmin(args.userName);
@@ -1623,11 +1573,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public isReviewer_result getResult(I iface, isReviewer_args args) throws org.apache.thrift.TException {
         isReviewer_result result = new isReviewer_result();
         result.success = iface.isReviewer(args.userName);
@@ -1649,11 +1594,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getAllRequestsForReviewers_result getResult(I iface, getAllRequestsForReviewers_args args) throws org.apache.thrift.TException {
         getAllRequestsForReviewers_result result = new getAllRequestsForReviewers_result();
         result.success = iface.getAllRequestsForReviewers(args.userName);
@@ -1674,11 +1614,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getUserDetails_result getResult(I iface, getUserDetails_args args) throws org.apache.thrift.TException {
         getUserDetails_result result = new getUserDetails_result();
         result.success = iface.getUserDetails(args.userName);
@@ -1699,11 +1634,6 @@
         return false;
       }
 
-      @Override
-      protected boolean handleRuntimeExceptions() {
-        return false;
-      }
-
       public getReviewsForRequest_result getResult(I iface, getReviewsForRequest_args args) throws org.apache.thrift.TException {
         getReviewsForRequest_result result = new getReviewsForRequest_result();
         result.success = iface.getReviewsForRequest(args.projectId);
@@ -1864,7 +1794,7 @@
       }
 
       public void start(I iface, isAllocationRequestExists_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
-        iface.isAllocationRequestExists(args.projectId,resultHandler);
+        iface.isAllocationRequestExists(args.projectId, args.userName,resultHandler);
       }
     }
 
@@ -1926,7 +1856,7 @@
       }
 
       public void start(I iface, deleteAllocationRequest_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
-        iface.deleteAllocationRequest(args.projectId,resultHandler);
+        iface.deleteAllocationRequest(args.projectId, args.userName,resultHandler);
       }
     }
 
@@ -1987,7 +1917,7 @@
       }
 
       public void start(I iface, getAllocationRequest_args args, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.allocation.manager.models.UserAllocationDetail> resultHandler) throws org.apache.thrift.TException {
-        iface.getAllocationRequest(args.projectId,resultHandler);
+        iface.getAllocationRequest(args.projectId, args.userName,resultHandler);
       }
     }
 
@@ -2110,7 +2040,7 @@
       }
 
       public void start(I iface, getAllocationRequestStatus_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.String> resultHandler) throws org.apache.thrift.TException {
-        iface.getAllocationRequestStatus(args.projectId,resultHandler);
+        iface.getAllocationRequestStatus(args.projectId, args.userName,resultHandler);
       }
     }
 
@@ -3577,15 +3507,18 @@
     private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("isAllocationRequestExists_args");
 
     private static final org.apache.thrift.protocol.TField PROJECT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("projectId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField USER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("userName", org.apache.thrift.protocol.TType.STRING, (short)2);
 
     private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new isAllocationRequestExists_argsStandardSchemeFactory();
     private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new isAllocationRequestExists_argsTupleSchemeFactory();
 
     public java.lang.String projectId; // required
+    public java.lang.String userName; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-      PROJECT_ID((short)1, "projectId");
+      PROJECT_ID((short)1, "projectId"),
+      USER_NAME((short)2, "userName");
 
       private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -3602,6 +3535,8 @@
         switch(fieldId) {
           case 1: // PROJECT_ID
             return PROJECT_ID;
+          case 2: // USER_NAME
+            return USER_NAME;
           default:
             return null;
         }
@@ -3647,6 +3582,8 @@
       java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
       tmpMap.put(_Fields.PROJECT_ID, new org.apache.thrift.meta_data.FieldMetaData("projectId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.USER_NAME, new org.apache.thrift.meta_data.FieldMetaData("userName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
       org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(isAllocationRequestExists_args.class, metaDataMap);
     }
@@ -3655,10 +3592,12 @@
     }
 
     public isAllocationRequestExists_args(
-      java.lang.String projectId)
+      java.lang.String projectId,
+      java.lang.String userName)
     {
       this();
       this.projectId = projectId;
+      this.userName = userName;
     }
 
     /**
@@ -3668,6 +3607,9 @@
       if (other.isSetProjectId()) {
         this.projectId = other.projectId;
       }
+      if (other.isSetUserName()) {
+        this.userName = other.userName;
+      }
     }
 
     public isAllocationRequestExists_args deepCopy() {
@@ -3677,6 +3619,7 @@
     @Override
     public void clear() {
       this.projectId = null;
+      this.userName = null;
     }
 
     public java.lang.String getProjectId() {
@@ -3703,6 +3646,30 @@
       }
     }
 
+    public java.lang.String getUserName() {
+      return this.userName;
+    }
+
+    public isAllocationRequestExists_args setUserName(java.lang.String userName) {
+      this.userName = userName;
+      return this;
+    }
+
+    public void unsetUserName() {
+      this.userName = null;
+    }
+
+    /** Returns true if field userName is set (has been assigned a value) and false otherwise */
+    public boolean isSetUserName() {
+      return this.userName != null;
+    }
+
+    public void setUserNameIsSet(boolean value) {
+      if (!value) {
+        this.userName = null;
+      }
+    }
+
     public void setFieldValue(_Fields field, java.lang.Object value) {
       switch (field) {
       case PROJECT_ID:
@@ -3713,6 +3680,14 @@
         }
         break;
 
+      case USER_NAME:
+        if (value == null) {
+          unsetUserName();
+        } else {
+          setUserName((java.lang.String)value);
+        }
+        break;
+
       }
     }
 
@@ -3721,6 +3696,9 @@
       case PROJECT_ID:
         return getProjectId();
 
+      case USER_NAME:
+        return getUserName();
+
       }
       throw new java.lang.IllegalStateException();
     }
@@ -3734,6 +3712,8 @@
       switch (field) {
       case PROJECT_ID:
         return isSetProjectId();
+      case USER_NAME:
+        return isSetUserName();
       }
       throw new java.lang.IllegalStateException();
     }
@@ -3762,6 +3742,15 @@
           return false;
       }
 
+      boolean this_present_userName = true && this.isSetUserName();
+      boolean that_present_userName = true && that.isSetUserName();
+      if (this_present_userName || that_present_userName) {
+        if (!(this_present_userName && that_present_userName))
+          return false;
+        if (!this.userName.equals(that.userName))
+          return false;
+      }
+
       return true;
     }
 
@@ -3773,6 +3762,10 @@
       if (isSetProjectId())
         hashCode = hashCode * 8191 + projectId.hashCode();
 
+      hashCode = hashCode * 8191 + ((isSetUserName()) ? 131071 : 524287);
+      if (isSetUserName())
+        hashCode = hashCode * 8191 + userName.hashCode();
+
       return hashCode;
     }
 
@@ -3794,6 +3787,16 @@
           return lastComparison;
         }
       }
+      lastComparison = java.lang.Boolean.valueOf(isSetUserName()).compareTo(other.isSetUserName());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetUserName()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userName, other.userName);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
       return 0;
     }
 
@@ -3821,6 +3824,14 @@
         sb.append(this.projectId);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("userName:");
+      if (this.userName == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.userName);
+      }
+      first = false;
       sb.append(")");
       return sb.toString();
     }
@@ -3830,6 +3841,9 @@
       if (projectId == null) {
         throw new org.apache.thrift.protocol.TProtocolException("Required field 'projectId' was not present! Struct: " + toString());
       }
+      if (userName == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'userName' was not present! Struct: " + toString());
+      }
       // check for sub-struct validity
     }
 
@@ -3875,6 +3889,14 @@
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
               break;
+            case 2: // USER_NAME
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.userName = iprot.readString();
+                struct.setUserNameIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
             default:
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
           }
@@ -3895,6 +3917,11 @@
           oprot.writeString(struct.projectId);
           oprot.writeFieldEnd();
         }
+        if (struct.userName != null) {
+          oprot.writeFieldBegin(USER_NAME_FIELD_DESC);
+          oprot.writeString(struct.userName);
+          oprot.writeFieldEnd();
+        }
         oprot.writeFieldStop();
         oprot.writeStructEnd();
       }
@@ -3913,6 +3940,7 @@
       public void write(org.apache.thrift.protocol.TProtocol prot, isAllocationRequestExists_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         oprot.writeString(struct.projectId);
+        oprot.writeString(struct.userName);
       }
 
       @Override
@@ -3920,6 +3948,8 @@
         org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         struct.projectId = iprot.readString();
         struct.setProjectIdIsSet(true);
+        struct.userName = iprot.readString();
+        struct.setUserNameIsSet(true);
       }
     }
 
@@ -4292,15 +4322,18 @@
     private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("deleteAllocationRequest_args");
 
     private static final org.apache.thrift.protocol.TField PROJECT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("projectId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField USER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("userName", org.apache.thrift.protocol.TType.STRING, (short)2);
 
     private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new deleteAllocationRequest_argsStandardSchemeFactory();
     private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new deleteAllocationRequest_argsTupleSchemeFactory();
 
     public java.lang.String projectId; // required
+    public java.lang.String userName; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-      PROJECT_ID((short)1, "projectId");
+      PROJECT_ID((short)1, "projectId"),
+      USER_NAME((short)2, "userName");
 
       private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -4317,6 +4350,8 @@
         switch(fieldId) {
           case 1: // PROJECT_ID
             return PROJECT_ID;
+          case 2: // USER_NAME
+            return USER_NAME;
           default:
             return null;
         }
@@ -4362,6 +4397,8 @@
       java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
       tmpMap.put(_Fields.PROJECT_ID, new org.apache.thrift.meta_data.FieldMetaData("projectId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.USER_NAME, new org.apache.thrift.meta_data.FieldMetaData("userName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
       org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(deleteAllocationRequest_args.class, metaDataMap);
     }
@@ -4370,10 +4407,12 @@
     }
 
     public deleteAllocationRequest_args(
-      java.lang.String projectId)
+      java.lang.String projectId,
+      java.lang.String userName)
     {
       this();
       this.projectId = projectId;
+      this.userName = userName;
     }
 
     /**
@@ -4383,6 +4422,9 @@
       if (other.isSetProjectId()) {
         this.projectId = other.projectId;
       }
+      if (other.isSetUserName()) {
+        this.userName = other.userName;
+      }
     }
 
     public deleteAllocationRequest_args deepCopy() {
@@ -4392,6 +4434,7 @@
     @Override
     public void clear() {
       this.projectId = null;
+      this.userName = null;
     }
 
     public java.lang.String getProjectId() {
@@ -4418,6 +4461,30 @@
       }
     }
 
+    public java.lang.String getUserName() {
+      return this.userName;
+    }
+
+    public deleteAllocationRequest_args setUserName(java.lang.String userName) {
+      this.userName = userName;
+      return this;
+    }
+
+    public void unsetUserName() {
+      this.userName = null;
+    }
+
+    /** Returns true if field userName is set (has been assigned a value) and false otherwise */
+    public boolean isSetUserName() {
+      return this.userName != null;
+    }
+
+    public void setUserNameIsSet(boolean value) {
+      if (!value) {
+        this.userName = null;
+      }
+    }
+
     public void setFieldValue(_Fields field, java.lang.Object value) {
       switch (field) {
       case PROJECT_ID:
@@ -4428,6 +4495,14 @@
         }
         break;
 
+      case USER_NAME:
+        if (value == null) {
+          unsetUserName();
+        } else {
+          setUserName((java.lang.String)value);
+        }
+        break;
+
       }
     }
 
@@ -4436,6 +4511,9 @@
       case PROJECT_ID:
         return getProjectId();
 
+      case USER_NAME:
+        return getUserName();
+
       }
       throw new java.lang.IllegalStateException();
     }
@@ -4449,6 +4527,8 @@
       switch (field) {
       case PROJECT_ID:
         return isSetProjectId();
+      case USER_NAME:
+        return isSetUserName();
       }
       throw new java.lang.IllegalStateException();
     }
@@ -4477,6 +4557,15 @@
           return false;
       }
 
+      boolean this_present_userName = true && this.isSetUserName();
+      boolean that_present_userName = true && that.isSetUserName();
+      if (this_present_userName || that_present_userName) {
+        if (!(this_present_userName && that_present_userName))
+          return false;
+        if (!this.userName.equals(that.userName))
+          return false;
+      }
+
       return true;
     }
 
@@ -4488,6 +4577,10 @@
       if (isSetProjectId())
         hashCode = hashCode * 8191 + projectId.hashCode();
 
+      hashCode = hashCode * 8191 + ((isSetUserName()) ? 131071 : 524287);
+      if (isSetUserName())
+        hashCode = hashCode * 8191 + userName.hashCode();
+
       return hashCode;
     }
 
@@ -4509,6 +4602,16 @@
           return lastComparison;
         }
       }
+      lastComparison = java.lang.Boolean.valueOf(isSetUserName()).compareTo(other.isSetUserName());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetUserName()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userName, other.userName);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
       return 0;
     }
 
@@ -4536,6 +4639,14 @@
         sb.append(this.projectId);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("userName:");
+      if (this.userName == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.userName);
+      }
+      first = false;
       sb.append(")");
       return sb.toString();
     }
@@ -4545,6 +4656,9 @@
       if (projectId == null) {
         throw new org.apache.thrift.protocol.TProtocolException("Required field 'projectId' was not present! Struct: " + toString());
       }
+      if (userName == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'userName' was not present! Struct: " + toString());
+      }
       // check for sub-struct validity
     }
 
@@ -4590,6 +4704,14 @@
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
               break;
+            case 2: // USER_NAME
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.userName = iprot.readString();
+                struct.setUserNameIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
             default:
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
           }
@@ -4610,6 +4732,11 @@
           oprot.writeString(struct.projectId);
           oprot.writeFieldEnd();
         }
+        if (struct.userName != null) {
+          oprot.writeFieldBegin(USER_NAME_FIELD_DESC);
+          oprot.writeString(struct.userName);
+          oprot.writeFieldEnd();
+        }
         oprot.writeFieldStop();
         oprot.writeStructEnd();
       }
@@ -4628,6 +4755,7 @@
       public void write(org.apache.thrift.protocol.TProtocol prot, deleteAllocationRequest_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         oprot.writeString(struct.projectId);
+        oprot.writeString(struct.userName);
       }
 
       @Override
@@ -4635,6 +4763,8 @@
         org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         struct.projectId = iprot.readString();
         struct.setProjectIdIsSet(true);
+        struct.userName = iprot.readString();
+        struct.setUserNameIsSet(true);
       }
     }
 
@@ -5007,15 +5137,18 @@
     private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("getAllocationRequest_args");
 
     private static final org.apache.thrift.protocol.TField PROJECT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("projectId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField USER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("userName", org.apache.thrift.protocol.TType.STRING, (short)2);
 
     private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getAllocationRequest_argsStandardSchemeFactory();
     private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getAllocationRequest_argsTupleSchemeFactory();
 
     public java.lang.String projectId; // required
+    public java.lang.String userName; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-      PROJECT_ID((short)1, "projectId");
+      PROJECT_ID((short)1, "projectId"),
+      USER_NAME((short)2, "userName");
 
       private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -5032,6 +5165,8 @@
         switch(fieldId) {
           case 1: // PROJECT_ID
             return PROJECT_ID;
+          case 2: // USER_NAME
+            return USER_NAME;
           default:
             return null;
         }
@@ -5077,6 +5212,8 @@
       java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
       tmpMap.put(_Fields.PROJECT_ID, new org.apache.thrift.meta_data.FieldMetaData("projectId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.USER_NAME, new org.apache.thrift.meta_data.FieldMetaData("userName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
       org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getAllocationRequest_args.class, metaDataMap);
     }
@@ -5085,10 +5222,12 @@
     }
 
     public getAllocationRequest_args(
-      java.lang.String projectId)
+      java.lang.String projectId,
+      java.lang.String userName)
     {
       this();
       this.projectId = projectId;
+      this.userName = userName;
     }
 
     /**
@@ -5098,6 +5237,9 @@
       if (other.isSetProjectId()) {
         this.projectId = other.projectId;
       }
+      if (other.isSetUserName()) {
+        this.userName = other.userName;
+      }
     }
 
     public getAllocationRequest_args deepCopy() {
@@ -5107,6 +5249,7 @@
     @Override
     public void clear() {
       this.projectId = null;
+      this.userName = null;
     }
 
     public java.lang.String getProjectId() {
@@ -5133,6 +5276,30 @@
       }
     }
 
+    public java.lang.String getUserName() {
+      return this.userName;
+    }
+
+    public getAllocationRequest_args setUserName(java.lang.String userName) {
+      this.userName = userName;
+      return this;
+    }
+
+    public void unsetUserName() {
+      this.userName = null;
+    }
+
+    /** Returns true if field userName is set (has been assigned a value) and false otherwise */
+    public boolean isSetUserName() {
+      return this.userName != null;
+    }
+
+    public void setUserNameIsSet(boolean value) {
+      if (!value) {
+        this.userName = null;
+      }
+    }
+
     public void setFieldValue(_Fields field, java.lang.Object value) {
       switch (field) {
       case PROJECT_ID:
@@ -5143,6 +5310,14 @@
         }
         break;
 
+      case USER_NAME:
+        if (value == null) {
+          unsetUserName();
+        } else {
+          setUserName((java.lang.String)value);
+        }
+        break;
+
       }
     }
 
@@ -5151,6 +5326,9 @@
       case PROJECT_ID:
         return getProjectId();
 
+      case USER_NAME:
+        return getUserName();
+
       }
       throw new java.lang.IllegalStateException();
     }
@@ -5164,6 +5342,8 @@
       switch (field) {
       case PROJECT_ID:
         return isSetProjectId();
+      case USER_NAME:
+        return isSetUserName();
       }
       throw new java.lang.IllegalStateException();
     }
@@ -5192,6 +5372,15 @@
           return false;
       }
 
+      boolean this_present_userName = true && this.isSetUserName();
+      boolean that_present_userName = true && that.isSetUserName();
+      if (this_present_userName || that_present_userName) {
+        if (!(this_present_userName && that_present_userName))
+          return false;
+        if (!this.userName.equals(that.userName))
+          return false;
+      }
+
       return true;
     }
 
@@ -5203,6 +5392,10 @@
       if (isSetProjectId())
         hashCode = hashCode * 8191 + projectId.hashCode();
 
+      hashCode = hashCode * 8191 + ((isSetUserName()) ? 131071 : 524287);
+      if (isSetUserName())
+        hashCode = hashCode * 8191 + userName.hashCode();
+
       return hashCode;
     }
 
@@ -5224,6 +5417,16 @@
           return lastComparison;
         }
       }
+      lastComparison = java.lang.Boolean.valueOf(isSetUserName()).compareTo(other.isSetUserName());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetUserName()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userName, other.userName);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
       return 0;
     }
 
@@ -5251,6 +5454,14 @@
         sb.append(this.projectId);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("userName:");
+      if (this.userName == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.userName);
+      }
+      first = false;
       sb.append(")");
       return sb.toString();
     }
@@ -5260,6 +5471,9 @@
       if (projectId == null) {
         throw new org.apache.thrift.protocol.TProtocolException("Required field 'projectId' was not present! Struct: " + toString());
       }
+      if (userName == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'userName' was not present! Struct: " + toString());
+      }
       // check for sub-struct validity
     }
 
@@ -5305,6 +5519,14 @@
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
               break;
+            case 2: // USER_NAME
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.userName = iprot.readString();
+                struct.setUserNameIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
             default:
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
           }
@@ -5325,6 +5547,11 @@
           oprot.writeString(struct.projectId);
           oprot.writeFieldEnd();
         }
+        if (struct.userName != null) {
+          oprot.writeFieldBegin(USER_NAME_FIELD_DESC);
+          oprot.writeString(struct.userName);
+          oprot.writeFieldEnd();
+        }
         oprot.writeFieldStop();
         oprot.writeStructEnd();
       }
@@ -5343,6 +5570,7 @@
       public void write(org.apache.thrift.protocol.TProtocol prot, getAllocationRequest_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         oprot.writeString(struct.projectId);
+        oprot.writeString(struct.userName);
       }
 
       @Override
@@ -5350,6 +5578,8 @@
         org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         struct.projectId = iprot.readString();
         struct.setProjectIdIsSet(true);
+        struct.userName = iprot.readString();
+        struct.setUserNameIsSet(true);
       }
     }
 
@@ -6449,15 +6679,18 @@
     private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("getAllocationRequestStatus_args");
 
     private static final org.apache.thrift.protocol.TField PROJECT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("projectId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField USER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("userName", org.apache.thrift.protocol.TType.STRING, (short)2);
 
     private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getAllocationRequestStatus_argsStandardSchemeFactory();
     private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getAllocationRequestStatus_argsTupleSchemeFactory();
 
     public java.lang.String projectId; // required
+    public java.lang.String userName; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-      PROJECT_ID((short)1, "projectId");
+      PROJECT_ID((short)1, "projectId"),
+      USER_NAME((short)2, "userName");
 
       private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -6474,6 +6707,8 @@
         switch(fieldId) {
           case 1: // PROJECT_ID
             return PROJECT_ID;
+          case 2: // USER_NAME
+            return USER_NAME;
           default:
             return null;
         }
@@ -6519,6 +6754,8 @@
       java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
       tmpMap.put(_Fields.PROJECT_ID, new org.apache.thrift.meta_data.FieldMetaData("projectId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.USER_NAME, new org.apache.thrift.meta_data.FieldMetaData("userName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
       org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getAllocationRequestStatus_args.class, metaDataMap);
     }
@@ -6527,10 +6764,12 @@
     }
 
     public getAllocationRequestStatus_args(
-      java.lang.String projectId)
+      java.lang.String projectId,
+      java.lang.String userName)
     {
       this();
       this.projectId = projectId;
+      this.userName = userName;
     }
 
     /**
@@ -6540,6 +6779,9 @@
       if (other.isSetProjectId()) {
         this.projectId = other.projectId;
       }
+      if (other.isSetUserName()) {
+        this.userName = other.userName;
+      }
     }
 
     public getAllocationRequestStatus_args deepCopy() {
@@ -6549,6 +6791,7 @@
     @Override
     public void clear() {
       this.projectId = null;
+      this.userName = null;
     }
 
     public java.lang.String getProjectId() {
@@ -6575,6 +6818,30 @@
       }
     }
 
+    public java.lang.String getUserName() {
+      return this.userName;
+    }
+
+    public getAllocationRequestStatus_args setUserName(java.lang.String userName) {
+      this.userName = userName;
+      return this;
+    }
+
+    public void unsetUserName() {
+      this.userName = null;
+    }
+
+    /** Returns true if field userName is set (has been assigned a value) and false otherwise */
+    public boolean isSetUserName() {
+      return this.userName != null;
+    }
+
+    public void setUserNameIsSet(boolean value) {
+      if (!value) {
+        this.userName = null;
+      }
+    }
+
     public void setFieldValue(_Fields field, java.lang.Object value) {
       switch (field) {
       case PROJECT_ID:
@@ -6585,6 +6852,14 @@
         }
         break;
 
+      case USER_NAME:
+        if (value == null) {
+          unsetUserName();
+        } else {
+          setUserName((java.lang.String)value);
+        }
+        break;
+
       }
     }
 
@@ -6593,6 +6868,9 @@
       case PROJECT_ID:
         return getProjectId();
 
+      case USER_NAME:
+        return getUserName();
+
       }
       throw new java.lang.IllegalStateException();
     }
@@ -6606,6 +6884,8 @@
       switch (field) {
       case PROJECT_ID:
         return isSetProjectId();
+      case USER_NAME:
+        return isSetUserName();
       }
       throw new java.lang.IllegalStateException();
     }
@@ -6634,6 +6914,15 @@
           return false;
       }
 
+      boolean this_present_userName = true && this.isSetUserName();
+      boolean that_present_userName = true && that.isSetUserName();
+      if (this_present_userName || that_present_userName) {
+        if (!(this_present_userName && that_present_userName))
+          return false;
+        if (!this.userName.equals(that.userName))
+          return false;
+      }
+
       return true;
     }
 
@@ -6645,6 +6934,10 @@
       if (isSetProjectId())
         hashCode = hashCode * 8191 + projectId.hashCode();
 
+      hashCode = hashCode * 8191 + ((isSetUserName()) ? 131071 : 524287);
+      if (isSetUserName())
+        hashCode = hashCode * 8191 + userName.hashCode();
+
       return hashCode;
     }
 
@@ -6666,6 +6959,16 @@
           return lastComparison;
         }
       }
+      lastComparison = java.lang.Boolean.valueOf(isSetUserName()).compareTo(other.isSetUserName());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetUserName()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userName, other.userName);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
       return 0;
     }
 
@@ -6693,6 +6996,14 @@
         sb.append(this.projectId);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("userName:");
+      if (this.userName == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.userName);
+      }
+      first = false;
       sb.append(")");
       return sb.toString();
     }
@@ -6702,6 +7013,9 @@
       if (projectId == null) {
         throw new org.apache.thrift.protocol.TProtocolException("Required field 'projectId' was not present! Struct: " + toString());
       }
+      if (userName == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'userName' was not present! Struct: " + toString());
+      }
       // check for sub-struct validity
     }
 
@@ -6747,6 +7061,14 @@
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
               break;
+            case 2: // USER_NAME
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.userName = iprot.readString();
+                struct.setUserNameIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
             default:
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
           }
@@ -6767,6 +7089,11 @@
           oprot.writeString(struct.projectId);
           oprot.writeFieldEnd();
         }
+        if (struct.userName != null) {
+          oprot.writeFieldBegin(USER_NAME_FIELD_DESC);
+          oprot.writeString(struct.userName);
+          oprot.writeFieldEnd();
+        }
         oprot.writeFieldStop();
         oprot.writeStructEnd();
       }
@@ -6785,6 +7112,7 @@
       public void write(org.apache.thrift.protocol.TProtocol prot, getAllocationRequestStatus_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         oprot.writeString(struct.projectId);
+        oprot.writeString(struct.userName);
       }
 
       @Override
@@ -6792,6 +7120,8 @@
         org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         struct.projectId = iprot.readString();
         struct.setProjectIdIsSet(true);
+        struct.userName = iprot.readString();
+        struct.setUserNameIsSet(true);
       }
     }
 
diff --git a/allocation-manager/allocation-manager-docs/api-docs/allocation_manager_cpi.html b/allocation-manager/allocation-manager-docs/api-docs/allocation_manager_cpi.html
index 7ea3180..918c90c 100644
--- a/allocation-manager/allocation-manager-docs/api-docs/allocation_manager_cpi.html
+++ b/allocation-manager/allocation-manager-docs/api-docs/allocation_manager_cpi.html
@@ -38,59 +38,63 @@
 <h3 id="Svc_AllocationRegistryService">Service: AllocationRegistryService</h3>
 <div class="definition"><h4 id="Fn_AllocationRegistryService_createAllocationRequest">Function: AllocationRegistryService.createAllocationRequest</h4>
 <pre><code>string</code> createAllocationRequest(<code><a href="allocation_manager_models.html#Struct_UserAllocationDetail">allocation_manager_models.UserAllocationDetail</a></code> allocDetail)
-</pre><pre><p>API method to create new allocation requests</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_isAllocationRequestExists">Function: AllocationRegistryService.isAllocationRequestExists</h4>
-<pre><code>bool</code> isAllocationRequestExists(<code>string</code> projectId)
-</pre><pre><p>API method to check if the allocation request exists</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_deleteAllocationRequest">Function: AllocationRegistryService.deleteAllocationRequest</h4>
-<pre><code>bool</code> deleteAllocationRequest(<code>string</code> projectId)
-</pre><pre><p>API method to delete allocation request</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationRequest">Function: AllocationRegistryService.getAllocationRequest</h4>
-<pre><code><a href="allocation_manager_models.html#Struct_UserAllocationDetail">allocation_manager_models.UserAllocationDetail</a></code> getAllocationRequest(<code>string</code> projectId)
-</pre><pre><p>API method to get an allocation Request</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_updateAllocationRequest">Function: AllocationRegistryService.updateAllocationRequest</h4>
+</pre><p>API method to create new allocation requests</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_isAllocationRequestExists">Function: AllocationRegistryService.isAllocationRequestExists</h4>
+<pre><code>bool</code> isAllocationRequestExists(<code>string</code> projectId,
+                               <code>string</code> userName)
+</pre><p>API method to check if the allocation request exists</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_deleteAllocationRequest">Function: AllocationRegistryService.deleteAllocationRequest</h4>
+<pre><code>bool</code> deleteAllocationRequest(<code>string</code> projectId,
+                             <code>string</code> userName)
+</pre><p>API method to delete allocation request</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationRequest">Function: AllocationRegistryService.getAllocationRequest</h4>
+<pre><code><a href="allocation_manager_models.html#Struct_UserAllocationDetail">allocation_manager_models.UserAllocationDetail</a></code> getAllocationRequest(<code>string</code> projectId,
+                                                                    <code>string</code> userName)
+</pre><p>API method to get an allocation Request</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_updateAllocationRequest">Function: AllocationRegistryService.updateAllocationRequest</h4>
 <pre><code>bool</code> updateAllocationRequest(<code><a href="allocation_manager_models.html#Struct_UserAllocationDetail">allocation_manager_models.UserAllocationDetail</a></code> allocDetail)
-</pre><pre><p>API method to update an allocation Request</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationRequestStatus">Function: AllocationRegistryService.getAllocationRequestStatus</h4>
-<pre><code>string</code> getAllocationRequestStatus(<code>string</code> projectId)
-</pre><pre><p>API method to get an allocation Request status</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationRequestUserEmail">Function: AllocationRegistryService.getAllocationRequestUserEmail</h4>
+</pre><p>API method to update an allocation Request</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationRequestStatus">Function: AllocationRegistryService.getAllocationRequestStatus</h4>
+<pre><code>string</code> getAllocationRequestStatus(<code>string</code> projectId,
+                                  <code>string</code> userName)
+</pre><p>API method to get an allocation Request status</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationRequestUserEmail">Function: AllocationRegistryService.getAllocationRequestUserEmail</h4>
 <pre><code>string</code> getAllocationRequestUserEmail(<code>string</code> userName)
-</pre><pre><p>API method to get an allocation Request PI email</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationManagerAdminEmail">Function: AllocationRegistryService.getAllocationManagerAdminEmail</h4>
+</pre><p>API method to get an allocation Request PI email</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationManagerAdminEmail">Function: AllocationRegistryService.getAllocationManagerAdminEmail</h4>
 <pre><code>string</code> getAllocationManagerAdminEmail(<code>string</code> userType)
-</pre><pre><p>API method to get an allocation Request Admin email</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationRequestUserName">Function: AllocationRegistryService.getAllocationRequestUserName</h4>
+</pre><p>API method to get an allocation Request Admin email</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllocationRequestUserName">Function: AllocationRegistryService.getAllocationRequestUserName</h4>
 <pre><code>string</code> getAllocationRequestUserName(<code>string</code> projectId)
-</pre><pre><p>API method to get an allocation Request PI</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_updateAllocationRequestStatus">Function: AllocationRegistryService.updateAllocationRequestStatus</h4>
+</pre><p>API method to get an allocation Request PI</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_updateAllocationRequestStatus">Function: AllocationRegistryService.updateAllocationRequestStatus</h4>
 <pre><code>void</code> updateAllocationRequestStatus(<code>string</code> projectId,
                                    <code>string</code> status)
-</pre><pre><p>API method to update the status of a request</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllRequestsForAdmin">Function: AllocationRegistryService.getAllRequestsForAdmin</h4>
+</pre><p>API method to update the status of a request</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllRequestsForAdmin">Function: AllocationRegistryService.getAllRequestsForAdmin</h4>
 <pre><code>list&lt;<code><a href="allocation_manager_models.html#Struct_UserAllocationDetail">allocation_manager_models.UserAllocationDetail</a></code>&gt;</code> getAllRequestsForAdmin(<code>string</code> userName)
-</pre><pre><p>API method to get all requests for admin</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_assignReviewers">Function: AllocationRegistryService.assignReviewers</h4>
+</pre><p>API method to get all requests for admin</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_assignReviewers">Function: AllocationRegistryService.assignReviewers</h4>
 <pre><code>bool</code> assignReviewers(<code><a href="allocation_manager_models.html#Struct_UserAllocationDetailPK">allocation_manager_models.UserAllocationDetailPK</a></code> projectId,
                      <code>string</code> userName)
-</pre><pre><p>API method to assign reviewers</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_updateRequestByReviewer">Function: AllocationRegistryService.updateRequestByReviewer</h4>
+</pre><p>API method to assign reviewers</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_updateRequestByReviewer">Function: AllocationRegistryService.updateRequestByReviewer</h4>
 <pre><code>bool</code> updateRequestByReviewer(<code><a href="allocation_manager_models.html#Struct_UserAllocationDetailPK">allocation_manager_models.UserAllocationDetailPK</a></code> projectId,
                              <code><a href="allocation_manager_models.html#Struct_UserAllocationDetail">allocation_manager_models.UserAllocationDetail</a></code> userAllocationDetail)
-</pre><pre><p>API method to update request submitted by reviewer</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_isAdmin">Function: AllocationRegistryService.isAdmin</h4>
+</pre><p>API method to update request submitted by reviewer</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_isAdmin">Function: AllocationRegistryService.isAdmin</h4>
 <pre><code>bool</code> isAdmin(<code>string</code> userName)
-</pre><pre><p>API method to check if the logged in user is an Admin</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_isReviewer">Function: AllocationRegistryService.isReviewer</h4>
+</pre><p>API method to check if the logged in user is an Admin</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_isReviewer">Function: AllocationRegistryService.isReviewer</h4>
 <pre><code>bool</code> isReviewer(<code>string</code> userName)
-</pre><pre><p>API method to check if the logged in user is a Reviewer</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllRequestsForReviewers">Function: AllocationRegistryService.getAllRequestsForReviewers</h4>
+</pre><p>API method to check if the logged in user is a Reviewer</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getAllRequestsForReviewers">Function: AllocationRegistryService.getAllRequestsForReviewers</h4>
 <pre><code>list&lt;<code><a href="allocation_manager_models.html#Struct_UserAllocationDetail">allocation_manager_models.UserAllocationDetail</a></code>&gt;</code> getAllRequestsForReviewers(<code>string</code> userName)
-</pre><pre><p>API method to get all requests assigned to the reviewers</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getUserDetails">Function: AllocationRegistryService.getUserDetails</h4>
+</pre><p>API method to get all requests assigned to the reviewers</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getUserDetails">Function: AllocationRegistryService.getUserDetails</h4>
 <pre><code><a href="allocation_manager_models.html#Struct_UserDetail">allocation_manager_models.UserDetail</a></code> getUserDetails(<code>string</code> userName)
-</pre><pre><p>API method to get a user details</p>
-</pre><br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getReviewsForRequest">Function: AllocationRegistryService.getReviewsForRequest</h4>
+</pre><p>API method to get a user details</p>
+<br/></div><div class="definition"><h4 id="Fn_AllocationRegistryService_getReviewsForRequest">Function: AllocationRegistryService.getReviewsForRequest</h4>
 <pre><code>list&lt;<code><a href="allocation_manager_models.html#Struct_UserAllocationDetail">allocation_manager_models.UserAllocationDetail</a></code>&gt;</code> getReviewsForRequest(<code><a href="allocation_manager_models.html#Struct_UserAllocationDetailPK">allocation_manager_models.UserAllocationDetailPK</a></code> projectId)
-</pre><pre><p>API method to get all the reviews for a request</p>
-</pre><br/></div></div></body></html>
+</pre><p>API method to get all the reviews for a request</p>
+<br/></div></div></body></html>
diff --git a/allocation-manager/allocation-manager-docs/api-docs/allocation_manager_models.html b/allocation-manager/allocation-manager-docs/api-docs/allocation_manager_models.html
index a0f909d..e75cb8e 100644
--- a/allocation-manager/allocation-manager-docs/api-docs/allocation_manager_models.html
+++ b/allocation-manager/allocation-manager-docs/api-docs/allocation_manager_models.html
@@ -7,17 +7,17 @@
 <title>Thrift module: allocation_manager_models</title></head><body>
 <div class="container-fluid">
 <h1>Thrift module: allocation_manager_models</h1>
-<pre><p>Field to share sponsorship details</p>
+<p>Field to share sponsorship details</p>
 <li>projectId : Id of the project</li>
 <li>sponsorName : Name of supervisor, manager, group leader or self</li>
 
-</pre><br/><table class="table-bordered table-striped table-condensed"><thead><th>Module</th><th>Services</th><th>Data types</th><th>Constants</th></thead>
+<br/><table class="table-bordered table-striped table-condensed"><thead><th>Module</th><th>Services</th><th>Data types</th><th>Constants</th></thead>
 <tr>
 <td>allocation_manager_models</td><td></td>
 <td><a href="#Struct_AllocationManagerException">AllocationManagerException</a><br/>
 <a href="#Struct_Domain">Domain</a><br/>
 <a href="#Struct_ProjectReviewer">ProjectReviewer</a><br/>
-<a href="#Struct_ProjectReviewerEntityPK">ProjectReviewerEntityPK</a><br/>
+<a href="#Struct_ProjectReviewerPK">ProjectReviewerPK</a><br/>
 <a href="#Struct_UserAllocationDetail">UserAllocationDetail</a><br/>
 <a href="#Struct_UserAllocationDetailPK">UserAllocationDetailPK</a><br/>
 <a href="#Struct_UserDetail">UserDetail</a><br/>
@@ -29,11 +29,11 @@
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>projectId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>4</td><td>username</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><pre><p>Field to share sponsorship details</p>
+</table><br/><p>Field to share sponsorship details</p>
 <li>projectId : Id of the project</li>
 <li>sponsorName : Name of supervisor, manager, group leader or self</li>
 
-</pre><br/></div><div class="definition"><h3 id="Struct_ProjectReviewerEntityPK">Struct: ProjectReviewerEntityPK</h3>
+<br/></div><div class="definition"><h3 id="Struct_ProjectReviewerPK">Struct: ProjectReviewerPK</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>projectId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>4</td><td>reviewer</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
@@ -59,7 +59,8 @@
 <tr><td>18</td><td>startDate</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>19</td><td>endDate</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>20</td><td>status</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><pre><p>Required allocation request details</p>
+<tr><td>21</td><td>isPrimaryOwner</td><td><code>bool</code></td><td></td><td>optional</td><td></td></tr>
+</table><br/><p>Required allocation request details</p>
 <li>id : (primary key) Ask the user to assign project ID, but this project should unique, we will need an API endpoint to check whether this ID is not used by other projects and the username</li>
 <li>applicationsToBeUsed : Select the application that the user intends to use, according to application chosen here, resources that can be allocable will be fetch from resource discovery module. User will not be restricted to these application upon allocation grant, provided the resources allocated support the application.</li>
 <li>diskUsageRangePerJob : An optional field to help reviewer and PI for allocation approval</li>
@@ -77,10 +78,10 @@
 <li>typeOfAllocation : If the User has an exclusive allocation with third party organization and wants to use airavata middleware to manage jobs.</li>
 <li>typicalSuPerJob :  An optional field to help reviewer and PI for allocation approval</li>
 
-</pre><br/></div><div class="definition"><h3 id="Struct_ProjectReviewer">Struct: ProjectReviewer</h3>
+<br/></div><div class="definition"><h3 id="Struct_ProjectReviewer">Struct: ProjectReviewer</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
-<tr><td>1</td><td>id</td><td><code><a href="#Struct_ProjectReviewerEntityPK">ProjectReviewerEntityPK</a></code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><pre><p>Allocation Request status details</p>
+<tr><td>1</td><td>id</td><td><code><a href="#Struct_ProjectReviewerPK">ProjectReviewerPK</a></code></td><td></td><td>optional</td><td></td></tr>
+</table><br/><p>Allocation Request status details</p>
 <li>projectId: Unique id of the project</li>
 <li>awardAllocation: Allocation awarded</li>
 <li>endDate: End date of the request</li>
@@ -88,37 +89,37 @@
 <li>startDate: Start date of the allocation</li>
 <li>status: Status of the allocation request</li>
 
-</pre><br/></div><div class="definition"><h3 id="Struct_UserDetail">Struct: UserDetail</h3>
+<br/></div><div class="definition"><h3 id="Struct_UserDetail">Struct: UserDetail</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>username</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>email</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>3</td><td>fullName</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>4</td><td>password</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>5</td><td>userType</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><pre><p>A user should have an account with airavata to request an allocation</p>
+</table><br/><p>A user should have an account with airavata to request an allocation</p>
 <li>username : Login Username</li>
 <li>email :Login email</li>
 <li>fullName: Full name of the user</li>
 <li>Password: Password of the user</li>
 <li>userType: Type of the user</li>
 
-</pre><br/></div><div class="definition"><h3 id="Struct_Domain">Struct: Domain</h3>
+<br/></div><div class="definition"><h3 id="Struct_Domain">Struct: Domain</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>domainId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>name</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>3</td><td>description</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>4</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>5</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><pre><p>An entity for maintaining various domains</p>
+</table><br/><p>An entity for maintaining various domains</p>
 <li>domainId : Unique id of the domain</li>
 <li>name : Name of the domain</li>
 <li>description: Description of the domain</li>
 <li>createdTime: Time when the domain was created</li>
 <li>updatedTime: Time when domain was updated</li>
 
-</pre><br/></div><div class="definition"><h3 id="Struct_AllocationManagerException">Exception: AllocationManagerException</h3>
+<br/></div><div class="definition"><h3 id="Struct_AllocationManagerException">Exception: AllocationManagerException</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>message</td><td><code>string</code></td><td></td><td>required</td><td></td></tr>
-</table><br/><pre><p>Exception model used in the allocation manager service</p>
+</table><br/><p>Exception model used in the allocation manager service</p>
 
-</pre><br/></div></div></body></html>
+<br/></div></div></body></html>
diff --git a/allocation-manager/allocation-manager-docs/api-docs/index.html b/allocation-manager/allocation-manager-docs/api-docs/index.html
index 8fe5a18..ea01282 100644
--- a/allocation-manager/allocation-manager-docs/api-docs/index.html
+++ b/allocation-manager/allocation-manager-docs/api-docs/index.html
@@ -34,7 +34,7 @@
 <td><a href="allocation_manager_models.html#Struct_AllocationManagerException">AllocationManagerException</a><br/>
 <a href="allocation_manager_models.html#Struct_Domain">Domain</a><br/>
 <a href="allocation_manager_models.html#Struct_ProjectReviewer">ProjectReviewer</a><br/>
-<a href="allocation_manager_models.html#Struct_ProjectReviewerEntityPK">ProjectReviewerEntityPK</a><br/>
+<a href="allocation_manager_models.html#Struct_ProjectReviewerPK">ProjectReviewerPK</a><br/>
 <a href="allocation_manager_models.html#Struct_UserAllocationDetail">UserAllocationDetail</a><br/>
 <a href="allocation_manager_models.html#Struct_UserAllocationDetailPK">UserAllocationDetailPK</a><br/>
 <a href="allocation_manager_models.html#Struct_UserDetail">UserDetail</a><br/>
diff --git a/allocation-manager/thrift_models/allocation_manager_cpi.thrift b/allocation-manager/thrift_models/allocation_manager_cpi.thrift
index 4c97565..eb89f85 100755
--- a/allocation-manager/thrift_models/allocation_manager_cpi.thrift
+++ b/allocation-manager/thrift_models/allocation_manager_cpi.thrift
@@ -12,17 +12,17 @@
     /**
      <p>API method to check if the allocation request exists</p>
     */
-    bool isAllocationRequestExists(1: required string projectId)
+    bool isAllocationRequestExists(1: required string projectId, 2: required string userName)
     
     /**
      <p>API method to delete allocation request</p>
     */
-    bool deleteAllocationRequest(1: required string projectId)
+    bool deleteAllocationRequest(1: required string projectId, 2: required string userName)
     
     /**
      <p>API method to get an allocation Request</p>
     */
-    allocation_manager_models.UserAllocationDetail getAllocationRequest(1: required string projectId)
+    allocation_manager_models.UserAllocationDetail getAllocationRequest(1: required string projectId, 2: required string userName)
     
     /**
      <p>API method to update an allocation Request</p>
@@ -32,7 +32,7 @@
    /**
     <p>API method to get an allocation Request status</p>
     */
-    string getAllocationRequestStatus(1: required string projectId)
+    string getAllocationRequestStatus(1: required string projectId, 2: required string userName)
 
     /**
     <p>API method to get an allocation Request PI email</p>
diff --git a/allocation-manager/thrift_models/allocation_manager_models.thrift b/allocation-manager/thrift_models/allocation_manager_models.thrift
index 98bf5d0..3a6c98a 100644
--- a/allocation-manager/thrift_models/allocation_manager_models.thrift
+++ b/allocation-manager/thrift_models/allocation_manager_models.thrift
@@ -53,7 +53,8 @@
 17:optional i64 awardAllocation,
 18:optional i64 startDate,
 19:optional i64 endDate,
-20:optional string status
+20:optional string status,
+21:optional bool isPrimaryOwner
 }
 
 /**
