\r
 import java.util.HashMap;\r
 import java.util.Map;\r
+import java.util.Objects;\r
+import java.util.Optional;\r
 import java.util.UUID;\r
 \r
 import javax.ws.rs.Consumes;\r
 import javax.ws.rs.core.Response;\r
 \r
 import org.camunda.bpm.engine.ProcessEngineServices;\r
-import org.camunda.bpm.engine.ProcessEngines;\r
 import org.camunda.bpm.engine.RuntimeService;\r
 import org.camunda.bpm.engine.runtime.ProcessInstance;\r
 import org.camunda.bpm.engine.variable.impl.VariableMapImpl;\r
 @Path("/async")\r
 public abstract class WorkflowAsyncResource {
 \r
-       private WorkflowContextHolder contextHolder = WorkflowContextHolder.getInstance();\r
-       protected ProcessEngineServices pes4junit = null;\r
+       private static final WorkflowContextHolder contextHolder = WorkflowContextHolder.getInstance();\r
+       protected Optional<ProcessEngineServices> pes4junit = Optional.empty();\r
 \r
-       private MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL);\r
+       private final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL);\r
 \r
        private static final String logMarker = "[WRKFLOW-RESOURCE]";\r
-       private static final int DEFAULT_WAIT_TIME = 30000;     //default wait time\r
+       private static final long DEFAULT_WAIT_TIME = 30000;    //default wait time\r
        \r
        /**\r
         * Asynchronous JAX-RS method that starts a process instance.\r
        public void startProcessInstanceByKey(final @Suspend(180000) AsynchronousResponse asyncResponse,\r
                        @PathParam("processKey") String processKey, VariableMapImpl variableMap) {\r
        \r
-               WorkflowResponse response = new WorkflowResponse();\r
                long startTime = System.currentTimeMillis();\r
                Map<String, Object> inputVariables = null;\r
                WorkflowContext workflowContext = null;\r
                        }\r
 \r
                        msoLogger.debug(logMarker + "Exception in startProcessInstance by key");\r
+               WorkflowResponse response = new WorkflowResponse();\r
                        response.setMessage("Fail" );\r
                        response.setResponse("Error occurred while executing the process: " + e);\r
                        response.setMessageCode(500);\r
                return contextHolder.processCallback(processKey, processInstanceId, requestId, callbackResponse);\r
        }\r
        \r
+    private static String getOrCreate(Map<String, Object> inputVariables, String key) {\r
+        String value = Objects.toString(inputVariables.get(key), null);\r
+        if (value == null) {\r
+            value = UUID.randomUUID().toString();\r
+            inputVariables.put(key, value);\r
+        }\r
+        return value;\r
+    }\r
+       \r
        // Note: the business key is used to identify the process in unit tests\r
-       private String getBusinessKey(Map<String, Object> inputVariables) {\r
-               Object businessKey = inputVariables.get("mso-business-key");\r
-               if (businessKey == null ) {\r
-                       businessKey = UUID.randomUUID().toString();\r
-                       inputVariables.put("mso-business-key",  businessKey);\r
-               }\r
-               return businessKey.toString();\r
+       private static String getBusinessKey(Map<String, Object> inputVariables) {\r
+        return getOrCreate(inputVariables, "mso-business-key");\r
        }\r
 \r
-       private String getRequestId(Map<String, Object> inputVariables) {\r
-               Object requestId = inputVariables.get("mso-request-id");\r
-               if (requestId == null ) {\r
-                       requestId = UUID.randomUUID().toString();\r
-                       inputVariables.put("mso-request-id",  requestId);\r
-               } \r
-               return requestId.toString();\r
+       private static String getRequestId(Map<String, Object> inputVariables) {\r
+        return getOrCreate(inputVariables, "mso-request-id");\r
        }\r
 \r
        private long getWaitTime(Map<String, Object> inputVariables)\r
        {\r
-               String timeout = inputVariables.get("mso-service-request-timeout") == null\r
-                               ? null : inputVariables.get("mso-service-request-timeout").toString();          \r
+           \r
+               String timeout = Objects.toString(inputVariables.get("mso-service-request-timeout"), null);\r
 \r
                if (timeout != null) {\r
                        try {\r
                \r
        }\r
 \r
-       private void setLogContext(String processKey,\r
+       private static void setLogContext(String processKey,\r
                        Map<String, Object> inputVariables) {\r
                MsoLogger.setServiceName("MSO." + processKey);\r
                if (inputVariables != null) {\r
                }\r
        }\r
 \r
-       private String getKeyValueFromInputVariables(Map<String,Object> inputVariables, String key) {\r
+       private static String getKeyValueFromInputVariables(Map<String,Object> inputVariables, String key) {\r
                if (inputVariables == null) return "";\r
-               Object requestId = inputVariables.get(key);\r
-               if (requestId != null) return requestId.toString();\r
-               return "N/A";\r
+               return Objects.toString(inputVariables.get(key), "N/A");\r
        }\r
 \r
        private boolean isProcessEnded(String processInstanceId) {\r
                ProcessEngineServices pes = getProcessEngineServices();\r
-               return pes.getRuntimeService().createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult() == null ? true : false ;                \r
+               return pes.getRuntimeService().createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult() == null;\r
        }\r
        \r
        \r
        protected abstract ProcessEngineServices getProcessEngineServices();
        \r
        public void setProcessEngineServices4junit(ProcessEngineServices pes) {\r
-               pes4junit = pes;\r
+               pes4junit = Optional.ofNullable(pes);\r
        }\r
 \r
-       private Map<String, Object> getInputVariables(VariableMapImpl variableMap) {\r
+       private static Map<String, Object> getInputVariables(VariableMapImpl variableMap) {\r
                Map<String, Object> inputVariables = new HashMap<String,Object>();\r
                @SuppressWarnings("unchecked")\r
                Map<String, Object> vMap = (Map<String, Object>) variableMap.get("variables");\r