diff --git a/module/javascript/script_module.js b/module/javascript/script_module.js
index 9db879f2ff817b62c6e25b2fedeb6007a19f8eff..78cae4b027466856a4aacb0b9d84ae7f6d304cb6 100644
--- a/module/javascript/script_module.js
+++ b/module/javascript/script_module.js
@@ -2790,7 +2790,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
                         "className": "modal-danger",
                         "message": response["data"]["errorMessage"]
                     };
-                    scope["modalWindow"]("dialog", "ERROR_REEINTEGRATE_METADATA_PUBLICATION_WORKSPACE", oOptions);
+                    scope["modalWindow"]("dialog", "ERROR_REINTEGRATE_METADATA_PUBLICATION_WORKSPACE", oOptions);
                 } else {
                     // Affiche le message de succés.
                     $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) {
@@ -3861,4 +3861,59 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
+    
+    /**
+     * stopOrderProcess function.
+     * Arrête une demande en cours.
+     */
+    angular.element(vitisApp.appMainDrtv).scope()["stopOrderProcess"] = function () {
+        // Injection des services.
+        var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]);
+        var $translate = angular.element(vitisApp.appMainDrtv).injector().get(["$translate"]);
+        var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]);
+        var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]);
+        var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]);
+        //
+        $log.info("stopOrderProcess");
+        // Une seule demande peut être arrêté.
+        var aSelectedRows = $rootScope["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"]();
+        var oOptions = {
+            "className": "modal-danger"
+        };
+        if (aSelectedRows.length > 0) {
+            if (aSelectedRows.length == 1) {
+                if (aSelectedRows[0]["order_status_id"] == 5) {
+                    ajaxRequest({
+                        "method": "PUT",
+                        "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/orders/" + aSelectedRows[0]["order_id"] + "/stop",
+                        "params": {"order_id": aSelectedRows[0]["order_id"]},
+                        //"scope": scope,
+                        "success": function(response) {
+                            if (response["data"]["status"] === 0) {
+                                var oOptions = {
+                                    "className": "modal-danger",
+                                    "message": response["data"]["errorMessage"]
+                                };
+                                scope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions);
+                            } else {
+                                //
+                                $rootScope['refreshGrid']($rootScope["gridApi"][envSrvc["sSelectedGridOptionsName"]]['grid']['appScope'], envSrvc["oGridOptions"][envSrvc["sSelectedGridOptionsName"]]);
+                                $rootScope["refreshSupervisionRecap"]();
+                                // Affiche le message de succés.
+                                $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) {
+                                    $.notify(sTranslation, "success");
+                                });
+                            }
+                        }
+                    });
+                }
+                else
+                    $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER", oOptions);
+            }
+            else
+                $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER", oOptions);
+        }
+        else
+            $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER", oOptions);
+    };
 });
\ No newline at end of file
diff --git a/module/lang/lang-en.json b/module/lang/lang-en.json
index 8db960cb04e9401ce05af7062e7e349c12b79530..ca2d7d11b3d4cf0efe55dc6d11a4c27137086335 100644
--- a/module/lang/lang-en.json
+++ b/module/lang/lang-en.json
@@ -63,7 +63,10 @@
         "FORM_NOTIFICATION_SUPERVISION_ORDER" : "Notification",
         "FORM_URL_SUPERVISION_ORDER" : "Order URL",
         "FORM_MINEXECDATE_SUPERVISION_ORDER" : "Planning date",
-        "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER" : "One or more orders are being executed and their processes will be deleted.",
+        "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER" : "One or more orders are being executed and their processes will be deleted",
+        "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER" : "Please select a running order to stop it",
+        "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER" : "You can only stop one running order at a time",
+        "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER" : "The selected order is not running",
         "" : "",
         "STATUS_TITLE_SUPERVISION_SUBSCRIPTION" : "Subscriptions",
         "ENABLED_SUBSCRIPTION_BOX_TITLE_SUPERVISION_SUBSCRIPTION" : "Enabled",
diff --git a/module/lang/lang-fr.json b/module/lang/lang-fr.json
index 09079f6d35ef38c455a7f5f8cd819c4434f9670f..608d664c6e8780c3847bf3fad57dad32399d6caf 100644
--- a/module/lang/lang-fr.json
+++ b/module/lang/lang-fr.json
@@ -64,6 +64,9 @@
         "FORM_URL_SUPERVISION_ORDER" : "URL de la demande",
         "FORM_MINEXECDATE_SUPERVISION_ORDER" : "Date de planification",
         "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER" : "Une ou plusieurs demandes sont en cours d'exécution et leurs processus seront supprimés.",
+        "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER" : "Veuillez sélectioner une demande en cours pour la stopper.",
+        "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER" : "Vous ne pouvez stopper qu'une seule demande en cours à la fois.",
+        "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER" : "La demande sélectionnée n'est pas en cours d'exécution.",
         "" : "",
         "STATUS_TITLE_SUPERVISION_SUBSCRIPTION" : "Abonnements",
         "ENABLED_SUBSCRIPTION_BOX_TITLE_SUPERVISION_SUBSCRIPTION" : "Actif",
diff --git a/web_service/class/gtf_lib/FmeServer.class.inc b/web_service/class/gtf_lib/FmeServer.class.inc
index f2cb3f205b4ccc9a451d92f953350bf3eea8222e..dd4833959835e24ca48b5d0030a4cd34d1643660 100644
--- a/web_service/class/gtf_lib/FmeServer.class.inc
+++ b/web_service/class/gtf_lib/FmeServer.class.inc
@@ -11,9 +11,9 @@ require_once("vmlib/logUtil.inc");
 Class FmeServer {
     const CURL_CONNECTION_TIMEOUT = 0;
     const CURL_TIMEOUT = 360;
-    const INFO_FME_SERVER_ASYNCHRONOUS_JOB_CANCELED = '|INFORM|PHP| Le traitement asynchrone a été annulé sur Fme Server';
-    const INFO_FME_SERVER_ASYNCHRONOUS_JOB_STOPPED = '|INFORM|PHP| Le traitement asynchrone a été arrêté sur Fme Server';
-    const INFO_FME_SERVER_ASYNCHRONOUS_JOB_REMOVED = '|INFORM|PHP| Le traitement asynchrone a été supprimé sur Fme Server';
+    const INFO_FME_SERVER_JOB_CANCELED = '|INFORM|PHP| Le traitement a été annulé sur Fme Server';
+    const INFO_FME_SERVER_JOB_STOPPED = '|INFORM|PHP| Le traitement a été arrêté sur Fme Server';
+    const INFO_FME_SERVER_JOB_REMOVED = '|INFORM|PHP| Le traitement a été supprimé sur Fme Server';
     
     public $sUrl;
     public $sTimeUnit;
@@ -637,7 +637,7 @@ Class FmeServer {
             if ($this->stopJob($iJobId) !== false) {
                 // Supprime définitivement la demande sur Fme Server.
                 if ($this->serviceRequest('transformations/jobs/completed/' . $iJobId, 'delete') !== false)
-                    writeToLog(self::INFO_FME_SERVER_ASYNCHRONOUS_JOB_REMOVED . " (job id $iJobId).", $this->sLogFilePath);
+                    writeToLog(self::INFO_FME_SERVER_JOB_REMOVED . " (job id $iJobId).", $this->sLogFilePath);
                 else
                     return false;
             }
@@ -657,7 +657,7 @@ Class FmeServer {
         if ($this->sToken !== false) {
             // Annule le traitement.
             if ($this->serviceRequest('transformations/jobs/queued/' . $iJobId, 'delete') !== false)
-                writeToLog(self::INFO_FME_SERVER_ASYNCHRONOUS_JOB_CANCELED . " (job id $iJobId).", $this->sLogFilePath);
+                writeToLog(self::INFO_FME_SERVER_JOB_CANCELED . " (job id $iJobId).", $this->sLogFilePath);
             else
                 return false;
         }
@@ -679,13 +679,13 @@ Class FmeServer {
                 // Annule une demande en attente ou arrête une demande en cours.
                 $aQueuedStatus = array('SUBMITTED', 'QUEUED', 'DELAYED', 'PAUSED');
                 $aRunningStatus = array('IN_PROCESS', 'PULLED');
-                error_log($oJobLog->status);
+                $aStoppedStatus = array('DELETED', 'ABORTED', 'FME_FAILURE', 'JOB_FAILURE', 'SUCCESS');
                 if (in_array($oJobLog->status, $aQueuedStatus))
                     $this->cancelJob($iJobId);
-                else {
+                else if (!in_array($oJobLog->status, $aStoppedStatus)){
                     // Annule le traitement.
                     if ($this->serviceRequest('transformations/jobs/running/' . $iJobId, 'delete') !== false)
-                        writeToLog(self::INFO_FME_SERVER_ASYNCHRONOUS_JOB_STOPPED . " (job id $iJobId).", $this->sLogFilePath);
+                        writeToLog(self::INFO_FME_SERVER_JOB_STOPPED . " (job id $iJobId).", $this->sLogFilePath);
                     else
                         return false;
                 }
diff --git a/web_service/ws/Gtf.class.sql.inc b/web_service/ws/Gtf.class.sql.inc
index e2e4aa5b1263209ac63c3a4a5934ee7c449711b0..724684fd24dc3c6678a3d13df317140b5edf6c46 100644
--- a/web_service/ws/Gtf.class.sql.inc
+++ b/web_service/ws/Gtf.class.sql.inc
@@ -25,12 +25,12 @@ $aSql['getOrderWorkspace'] = 'SELECT workspace_id FROM [sSchemaGtf].v_order WHER
 $aSql['getOrderEngineStatus'] = 'SELECT gtf_engine.enabled FROM [sSchemaGtf]."order" LEFT JOIN [sSchemaGtf].gtf_engine ON "order".gtf_engine_id = gtf_engine.gtf_engine_id WHERE order_id = [order_id]';
 $aSql['getRunningOrders'] = 'SELECT order_id, gtf_engine_id FROM [sSchemaGtf]."order" WHERE order_status_id IN (1, 5)';
 $aSql['updateOrderStatus'] = 'UPDATE [sSchemaGtf].order SET order_status_id = [order_status_id] WHERE order_id = [order_id]';
+//$aSql['getOrdersToDelete'] = 'SELECT order_id, gtf_engine_id, order_status_id FROM [sSchemaGtf]."order" WHERE order_id IN([idList])';
+$aSql['getOrdersToDelete'] = 'SELECT fme_engine.fme_engine_type_id, "order".order_id, "order".gtf_engine_id, "order".order_status_id FROM [sSchemaGtf].order, [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND order_id IN([idList])';
 //$aSql['getOrderFmeEngine'] = 'SELECT fme_engine.fme_engine_type_id, fme_engine.server_url, fme_engine.login, fme_engine.password, fme_engine.fme_cloud_api_token, fme_engine.fme_server_instance_name, server.engines_home, v_order.gtf_engine_id FROM [sSchemaGtf].v_order, [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = v_order.gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [iOrderId] LIMIT 1';
-//$aSql['getOrderPid'] = 'SELECT fme_engine.fme_engine_type_id, "order".gtf_engine_id, "order".pid FROM [sSchemaGtf]."order", [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [iOrderId] AND fme_engine_type_id = \'desktop\' AND pid IS NOT NULL LIMIT 1';
-//$aSql['getGtfEngineHome'] = 'SELECT engines_home, gtf_engine_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine WHERE gtf_engine.server_id = "server".server_id AND gtf_engine_id IN([gtf_engine_id])';
-//$aSql['getGtfEngineHome'] = 'SELECT engines_home, gtf_engine_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine WHERE gtf_engine.server_id = "server".server_id AND gtf_engine_id = [gtf_engine_id]';
-$aSql['getGtfEngineHome'] = 'SELECT engines_home, "order".gtf_engine_id, "order".order_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine, [sSchemaGtf]."order" WHERE gtf_engine.server_id = "server".server_id AND gtf_engine.gtf_engine_id = "order".gtf_engine_id AND order_id = [order_id]';
-//$aSql['getOrderPid'] = 'SELECT fme_engine.fme_engine_type_id, "order".gtf_engine_id, "order".pid FROM [sSchemaGtf]."order", [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [iOrderId] AND fme_engine_type_id = \'desktop\' AND pid IS NOT NULL LIMIT 1';
+$aSql['getGtfEngineHomeFromOrderId'] = 'SELECT engines_home, "order".gtf_engine_id, "order".order_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine, [sSchemaGtf]."order" WHERE gtf_engine.server_id = "server".server_id AND gtf_engine.gtf_engine_id = "order".gtf_engine_id AND order_id = [order_id]';
+$aSql['getGtfEngineHomeFromEngineId'] = 'SELECT engines_home, "order".gtf_engine_id, "order".order_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine, [sSchemaGtf]."order" WHERE gtf_engine.server_id = "server".server_id AND gtf_engine.gtf_engine_id = "order".gtf_engine_id AND gtf_engine.gtf_engine_id = [iGtfEngineId]';
+$aSql['getFmeServerOrder'] = 'SELECT fme_engine.fme_engine_type_id, fme_engine.server_url, fme_engine.login, fme_engine.password, fme_engine.fme_cloud_api_token, fme_engine.fme_server_instance_name, "order".gtf_engine_id, "order".pid, server.engines_home, "order".log_url FROM [sSchemaGtf].order, [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [order_id] LIMIT 1';
 $aSql['getOrderPid'] = 'SELECT fme_engine.fme_engine_type_id, "order".gtf_engine_id, "order".pid FROM [sSchemaGtf]."order", [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [order_id] LIMIT 1';
 $aSql['getOrderFmeEngineType'] = 'SELECT fme_engine.fme_engine_type_id FROM [sSchemaGtf]."order", [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND order_id = [order_id] LIMIT 1';
 // UserSubscriptions
diff --git a/web_service/ws/Order.class.inc b/web_service/ws/Order.class.inc
old mode 100755
new mode 100644
index 784b59f65fb02cf037474d2073116fdd800555ff..4888332c83f02362aec2b3fcc487c7484c259546
--- a/web_service/ws/Order.class.inc
+++ b/web_service/ws/Order.class.inc
@@ -15,7 +15,6 @@ require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
  * 
  */
 class Order extends GTF {
-
     public $oError;
 
     /**
diff --git a/web_service/ws/Orders.class.inc b/web_service/ws/Orders.class.inc
index 90240b7f6469bb20ff97e6f6b8419c7a07cf2973..352904e19eb1e11929a5dab922ea59e0a081b7ed 100644
--- a/web_service/ws/Orders.class.inc
+++ b/web_service/ws/Orders.class.inc
@@ -16,7 +16,7 @@ require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
 require_once 'Order.class.inc';
 require_once __DIR__ . '/../../class/vmlib/BdDataAccess.inc';
 require_once 'gtf_lib/FmeServer.class.inc';
-
+require_once 'gtf_lib/FmeCloud.class.inc';
 
 class Orders extends GTF {
     /**
@@ -318,6 +318,7 @@ class Orders extends GTF {
     function PUT() {
         if (!empty($this->aPath[2])) {
             if (!empty($this->aPath[3])) {
+                // Arrêt d'une demande en cours.
                 if ($this->aPath[3] == 'stop')
                     $aReturn = $this->stopFmeOrder($this->aValues["my_vitis_id"]);
             }
@@ -483,8 +484,8 @@ class Orders extends GTF {
                 $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
             }
         } else {
-            // Stoppe le processus des demandes (uniquement pour Fme Desktop).
-            $this->stopFmeDesktopOrdersProcess();
+            // Stoppe les demandes en cours (Fme Server -> supprime le traitement et le répertoire des données).
+            $this->deleteFmeOrders();
             //
             $aReturn = $this->genericDelete($this->aProperties['schema_gtf'], 'order', 'order_id');
             $sMessage = $aReturn['sMessage'];
@@ -618,7 +619,6 @@ class Orders extends GTF {
      * \param $sTable Name of the table.
      * \param $iWorkspaceId Identifier of the treatment.
      */
-
     function getIdEngine($iUserOrderId, $sTable, $iWorkspaceId) {
         require $this->sRessourcesFile;
         // Récupération de l'algorithme
@@ -704,20 +704,142 @@ class Orders extends GTF {
     }
     
     /**
-     * function stopFmeDesktopOrdersProcess
+     * function deleteFmeOrders
+     */
+    function deleteFmeOrders() {
+        require $this->sRessourcesFile;
+        // Infos des demandes à supprimer.
+        $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
+        $aParams['idList'] = array('value' => $this->aValues['idList'], 'type' => 'group');
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOrdersToDelete'], $aParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            while ($aDemande = $this->oConnection->oBd->ligneSuivante($oPDOresult)) {
+                $aRunningJob = array();
+                if ($aDemande['order_status_id'] == 5) {
+                    // Paramètres de la demande si c'est un traitement asynchrone sur Fme server.
+                    if ($aDemande['fme_engine_type_id'] != "desktop") {
+                        $aRunningJobs = $this->getFmeServerRunningJobs($aDemande['gtf_engine_id']);
+                        $aRunningJob = $this->getFmeServerRunningJob($aDemande['order_id'], $aRunningJobs);
+                    }
+                    // Stoppe la demande en cours.
+                    $this->stopFmeOrder($aDemande['order_id']);
+                }
+                // Supprime le traitement sur Fme Server.
+                if ($aDemande['fme_engine_type_id'] != "desktop")
+                    $this->deleteFmeServerOrder($aDemande['order_id'], $aDemande['gtf_engine_id'], $aRunningJob);
+            }
+        }
+    }
+    
+    /**
+     * function deleteFmeServerOrder
+     * \param $iOrderId Id of the Gtf order.
+     * \param $iGtfEngineId Id of the Gtf engine.
+     * \param $aRunningJob A running job on Fme Server.
+     */
+    function deleteFmeServerOrder($iOrderId, $iGtfEngineId, $aRunningJob = array()) {
+        $sEngineLogFilePath = $this->aProperties['vas_home'] . '/log/engines/' . date($this->aProperties['log_period']) . '/engine_' . $iGtfEngineId . '/engine.log';
+        if (!empty($aRunningJob)) {
+            // Demande en cours -> informations de connexion sur Fme Server dans la liste des traitements asynchrones.
+            $sFmeServerUrl = $aRunningJob['fme_server_url'];
+            $sLogin = $aRunningJob['login'];
+            $sPassword = $aRunningJob['password'];
+            $sResource = $aRunningJob['resource'];
+            $sPath = $aRunningJob['path'];
+            $iJobId = $aRunningJob['job_id'];
+        }
+        else {
+            // Demande en attente ou terminée -> informations de connexion sur Fme Server dans la base.
+            require $this->sRessourcesFile;
+            $aParams = array();
+            $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
+            $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number');
+            $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getFmeServerOrder'], $aParams);
+            if (!$this->oConnection->oBd->enErreur()) {
+                $aOrder = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+                require $aOrder['engines_home'] . '/' . 'string.inc';
+                // Si Fme Cloud -> l'instance de Fme Server doit être démarrée.
+                if ($aOrder['fme_engine_type_id'] == 'fme_cloud') {
+                    // Ip de l'instance Fme Server.
+                    $oFmeCloud = new FmeCloud($aOrder['server_url'], $aOrder['fme_cloud_api_token']);
+                    $oFmeCloud->sLogFilePath = $sEngineLogFilePath;
+                    // Adresse Ip publique de l'instance de FME Server.
+                    $aFmeServerInstances = $oFmeCloud->serviceRequest('instances');
+                    if (!empty($aFmeServerInstances)) {
+                        foreach($aFmeServerInstances as $oInstance) {
+                            if ($oInstance->name == $aOrder['fme_server_instance_name'])
+                                $oFmeServerInstance = $oInstance;
+                        }
+                        if (empty($oFmeServerInstance)) {
+                            // Aucune instace active.
+                            writeToLog(INFO_FME_CLOUD_INSTANCE_NOT_FOUND, $sEngineLogFilePath);
+                        }
+                        else {
+                            // Statut de l'instance.
+                            writeToLog(INFO_FME_CLOUD_INSTANCE_STATUS . $oFmeServerInstance->state, $sEngineLogFilePath);
+                            $sFmeServerUrl = 'https://' . $oFmeServerInstance->public_ip;
+                            // Pas de suppression possible si l'instance n'est pas démarrée.
+                            if ($oFmeServerInstance->state != "RUNNING")
+                                return false;
+                        }
+                    }
+                }
+                $sLogin = $aOrder['login'];
+                $sPassword = $aOrder['password'];
+                $sResource = 'FME_SHAREDRESOURCE_TEMP';
+                if (!empty($aOrder['log_url']))
+                    $sPath = dirname($this->aProperties["gtf_instance_id"] . '/' . pathinfo($aOrder['log_url'], PATHINFO_DIRNAME));
+                $iJobId = $aOrder['pid'];
+            }
+        }
+        // Suppression du traitement et du répertoire sur Fme Server.
+        if (!empty($sFmeServerUrl) && !empty($sLogin) && !empty($sPassword)) {
+            $oFmeServer = new FmeServer($sFmeServerUrl, $sLogin, $sPassword);
+            $oFmeServer->sLogFilePath = $sEngineLogFilePath;
+            if (!empty($iJobId))
+                if ($oFmeServer->deleteJob($iJobId) === false)
+                    return false;
+            // Supprime le répertoire des ressources de la demande sur Fme Server.
+            if (!empty($sResource) && !empty($sPath))
+                if ($oFmeServer->serviceRequest('resources/connections/' . $sResource . '/filesys/' . $sPath, 'delete') === false)
+                    return false;
+        }
+    }
+    
+    /**
+     * function stopFmeOrder
+     * \param $iOrderId Id of the Gtf order.
      */
-    function stopFmeDesktopOrdersProcess() {
+    function stopFmeOrder($iOrderId) {
         require $this->sRessourcesFile;
-        // Id des moteurs GTF dont au moins une demande est en cours.
+        // Informations de la demande à stopper.
         $aParams = array();
         $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
-        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getRunningOrders'], $aParams);
+        $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number');
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOrderFmeEngineType'], $aParams);
         if (!$this->oConnection->oBd->enErreur()) {
-            $aGtfEngineId = array();
-            while ($aGtfEngine = $this->oConnection->oBd->ligneSuivante($oPDOresult)) {
-                // Arrête le processus de la demande.
-                $this->stopFmeDesktopOrderProcess($aGtfEngine['order_id']);
+            $aOrder = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+            if ($aOrder['fme_engine_type_id'] == 'desktop') {
+                if ($this->stopFmeDesktopOrderProcess($iOrderId) === false)
+                    $sErrorMessage = ERROR_0037;
+            }
+            else {
+                if ($this->stopFmeServerOrder($iOrderId) === false)
+                    $sErrorMessage = ERROR_0038;
+            }
+            // Message de retour pour l'API Rest.
+            if (empty($sErrorMessage)) {
+                $aReturn = array('status' => 1, 'message' => '');
+                // Mise à jour du statut de la demande (stoppé).
+                $aParams = array();
+                $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
+                $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number');
+                $aParams['order_status_id'] = array('value' => 7, 'type' => 'number');
+                $this->oConnection->oBd->executeWithParams($aSql['updateOrderStatus'], $aParams);
             }
+            else
+                $aReturn = array('status' => 0, 'message' => $sErrorMessage, 'error_code' => 17);
+            return $aReturn;
         }
     }
     
@@ -730,21 +852,30 @@ class Orders extends GTF {
         $aParams = array();
         $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
         $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number');
-        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHome'], $aParams);
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHomeFromOrderId'], $aParams);
         if (!$this->oConnection->oBd->enErreur()) {
             $aGtfEngineHome = $this->oConnection->oBd->ligneSuivante($oPDOresult);
             $sPidFilePath = $aGtfEngineHome['engines_home'] . '/' . 'pid_' . $aGtfEngineHome['gtf_engine_id'] . '.txt';
             if (file_exists($sPidFilePath)) {
                 $iPid = file_get_contents($sPidFilePath);
                 if (is_numeric($iPid)) {
-                    // Supprime le processus "engine.exe".
-                    $this->killProcess($iPid);
-                    // Tue tous les processus liés à une demande et un traitement sur Fme Desktop.
-                    $aProcessName = array('cmd.exe', 'php.exe', 'cmd.exe', 'fme.exe');
-                    foreach ($aProcessName as $sProcessName) {
-                        $iPid = $this->getChildProcess($iPid, $sProcessName);
-                        if ($iPid !== false)
-                            $this->killProcess($iPid);
+                    if (strtolower(substr(PHP_OS, 0, 3)) == 'win') {
+                        // Supprime le processus "engine.exe".
+                        $this->killProcess($iPid);
+                        // Tue tous les processus liés à une demande et un traitement sur Fme Desktop.
+                        $aProcessName = array('cmd.exe', 'php.exe', 'cmd.exe', 'fme.exe');
+                        foreach ($aProcessName as $sProcessName) {
+                            $iPid = $this->getChildProcess($iPid, $sProcessName);
+                            if ($iPid !== false)
+                                $this->killProcess($iPid);
+                        }
+                    }
+                    else {
+                        // Supprime tous les processus enfants.
+                        $aResult = array();
+                        $sResultCommande = exec('pkill -9 -P ' . $iPid, $aResult, $iResult);
+                        // Supprime le processus du moteur.
+                        $this->killProcess($iPid);
                     }
                 }
                 // Suppression du fichier contenant le pid du processus "engine.exe".
@@ -789,43 +920,6 @@ class Orders extends GTF {
             return false;
     }
     
-    /**
-     * function stopFmeOrder
-     * \param $iOrderId Id of the Gtf order.
-     */
-    function stopFmeOrder($iOrderId) {
-        require $this->sRessourcesFile;
-        // Informations de la demande à stopper.
-        $aParams = array();
-        $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
-        $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number');
-        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOrderFmeEngineType'], $aParams);
-        if (!$this->oConnection->oBd->enErreur()) {
-            $aOrder = $this->oConnection->oBd->ligneSuivante($oPDOresult);
-            if ($aOrder['fme_engine_type_id'] == 'desktop') {
-                if ($this->stopFmeDesktopOrderProcess($iOrderId) === false)
-                    $sErrorMessage = ERROR_0037;
-            }
-            else {
-                if ($this->stopFmeServerOrder($iOrderId) === false)
-                    $sErrorMessage = ERROR_0038;
-            }
-            // Message de retour pour l'API Rest.
-            if (empty($sErrorMessage)) {
-                $aReturn = array('status' => 1, 'message' => '');
-                // Mise à jour du statut de la demande (stoppé).
-                $aParams = array();
-                $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
-                $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number');
-                $aParams['order_status_id'] = array('value' => 7, 'type' => 'number');
-                $this->oConnection->oBd->executeWithParams($aSql['updateOrderStatus'], $aParams);
-            }
-            else
-                $aReturn = array('status' => 0, 'message' => $sErrorMessage, 'error_code' => 17);
-            return $aReturn;
-        }
-    }
-    
     /**
      * function stopFmeServerOrder
      * \param $iOrderId Id of the Gtf order.
@@ -836,7 +930,7 @@ class Orders extends GTF {
         $aParams = array();
         $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
         $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number');
-        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHome'], $aParams);
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHomeFromOrderId'], $aParams);
         if (!$this->oConnection->oBd->enErreur()) {
             $aGtfEngineHome = $this->oConnection->oBd->ligneSuivante($oPDOresult);
             // Stoppe le traitement sur Fme Server.
@@ -845,7 +939,9 @@ class Orders extends GTF {
                 $aRunningJobs = unserialize(file_get_contents($sAsyncOrdersFilePath));
                 $aRunningJob = $this->getFmeServerRunningJob($iOrderId, $aRunningJobs);
                 if ($aRunningJob !== false && !empty($aRunningJob['job_id'])) {
+                    $sEngineLogFilePath = $this->aProperties['vas_home'] . '/log/engines/' . date($this->aProperties['log_period']) . '/engine_' . $aGtfEngineHome['gtf_engine_id'] . '/engine.log';
                     $oFmeServer = new FmeServer($aRunningJob['fme_server_url'], $aRunningJob['login'], $aRunningJob['password'], 'day', 1);
+                    $oFmeServer->sLogFilePath = $sEngineLogFilePath;
                     $oFmeServer->stopJob($aRunningJob['job_id']);
                     // Supprime le traitement dans la liste des demandes asynchrones.
                     $iJobIndex = null;
@@ -862,13 +958,15 @@ class Orders extends GTF {
                             unlink($sAsyncOrdersFilePath);
                         else
                             file_put_contents($sAsyncOrdersFilePath, serialize($aRunningJobs));
+                        // Log.
+                        require $aGtfEngineHome['engines_home'] . '/' . 'string.inc';
+                        writeToLog(INFO_FME_SERVER_ASYNCHRONOUS_JOB_REMOVED_FROM_LIST . " (demande $iOrderId).", $sEngineLogFilePath);
                     }
                 }
             }
         }
     }
     
-    
     /**
      * Retourne les infos d'un traitement asynchrones en cours d'exécution.
      * @param {number} $iOrderId I de la demande en cours.
@@ -882,5 +980,27 @@ class Orders extends GTF {
         }
         return false;
     }
+    
+    /**
+     * Retourne la liste des traitements asynchrones en cours d'exécution d'un moteur GTF.
+     * @param {number} $iGtfEngineId Id du moteur GTF.
+     * return array
+     */
+    function getFmeServerRunningJobs($iGtfEngineId) {
+        require $this->sRessourcesFile;
+        // Récupère le répertoire des moteurs de GTF.
+        $aRunningJobs = array();
+        $aParams = array();
+        $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name');
+        $aParams['iGtfEngineId'] = array('value' => $iGtfEngineId, 'type' => 'number');
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHomeFromEngineId'], $aParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            $aGtfEngineHome = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+            $sAsyncOrdersFilePath = $aGtfEngineHome['engines_home'] . '/' . 'gtf_engine' . $aGtfEngineHome['gtf_engine_id'] . '_jobid.txt';
+            if (file_exists($sAsyncOrdersFilePath))
+                $aRunningJobs = unserialize(file_get_contents($sAsyncOrdersFilePath));
+        }
+        return $aRunningJobs;
+    }
 }
 ?>
\ No newline at end of file