diff --git a/solidify-index-search-remote/src/main/java/ch/unige/solidify/service/rest/abstractservice/IndexMetadataRemoteResourceService.java b/solidify-index-search-remote/src/main/java/ch/unige/solidify/service/rest/abstractservice/IndexMetadataRemoteResourceService.java
index 5a048760ac2f4888054cf60617ecc474ca5d4afc..7ff1a8c875cdec5e5c94f4757205e69313a4786b 100644
--- a/solidify-index-search-remote/src/main/java/ch/unige/solidify/service/rest/abstractservice/IndexMetadataRemoteResourceService.java
+++ b/solidify-index-search-remote/src/main/java/ch/unige/solidify/service/rest/abstractservice/IndexMetadataRemoteResourceService.java
@@ -9,12 +9,12 @@
  * it under the terms of the GNU General Public License as
  * published by the Free Software Foundation, either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public
  * License along with this program.  If not, see
  * <http://www.gnu.org/licenses/gpl-2.0.html>.
@@ -31,6 +31,7 @@ import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.domain.Pageable;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatusCode;
 import org.springframework.web.client.HttpClientErrorException;
 import org.springframework.web.util.UriComponentsBuilder;
@@ -72,19 +73,6 @@ public abstract class IndexMetadataRemoteResourceService<T extends IndexMetadata
     return this.restClientService.headResource(url);
   }
 
-  public boolean updateIndexMetadata(String id, T t) {
-    try {
-      this.restClientService.patchResource(
-              this.getIndexUrl() + "/" + id,
-              t,
-              this.indexResourceClass);
-    } catch (SolidifyResourceNotFoundException | SolidifyRestException e) {
-      log.error("Error in updating index (" + id + ")", e);
-      return false;
-    }
-    return true;
-  }
-
   public T getIndexMetadata(String resId) {
     this.restClientService.checkResId(resId);
     String url = this.getIndexUrl() + "/" + resId;
@@ -115,28 +103,54 @@ public abstract class IndexMetadataRemoteResourceService<T extends IndexMetadata
     return this.restClientService.postResourcesList(url, searchConditions, this.indexResourceClass, pageable);
   }
 
-  public boolean deleteIndexMetadata(String id) {
+  public boolean indexMetadata(List<T> metadataList) {
+    boolean result = true;
+    long count = 0;
+    for (T metadata : metadataList) {
+      log.debug("Creating index metadata document: {}) {} {}", ++count, metadata.getIndex(), metadata.getResId());
+      result = result && this.indexMetadata(metadata);
+    }
+    return result;
+  }
+
+  public boolean indexMetadata(T metadata) {
+    HttpStatusCode statusCode = this.headIndexMetadata(metadata.getResId());
+    if (statusCode == HttpStatus.OK) {
+      return this.updateIndexMetadata(metadata);
+    } else {
+      return this.createIndexMetadata(metadata);
+    }
+  }
+
+  public boolean createIndexMetadata(T metadata) {
     try {
-      this.restClientService.deleteResource(this.getIndexUrl() + "/" + id);
+      IndexMetadata res = this.restClientService.postResource(this.getIndexUrl(), metadata, this.indexResourceClass);
+      if (res == null) {
+        return false;
+      }
+
     } catch (SolidifyResourceNotFoundException | SolidifyRestException e) {
-      log.error("Error in deleting metadata index (" + id + ")", e);
+      log.error("Error in indexing (" + metadata.getResId() + ")", e);
       return false;
     }
     return true;
   }
 
-  public boolean createIndexMetadata(IndexMetadata md) {
+  public boolean updateIndexMetadata(T metadata) {
     try {
-      IndexMetadata res = this.restClientService.postResource(
-              this.getIndexUrl(),
-              md,
-              IndexMetadata.class);
-      if (res == null) {
-        return false;
-      }
+      this.restClientService.patchResource(this.getIndexUrl() + "/" + metadata.getResId(), metadata, this.indexResourceClass);
+    } catch (SolidifyResourceNotFoundException | SolidifyRestException e) {
+      log.error("Error in updating index (" + metadata.getResId() + ")", e);
+      return false;
+    }
+    return true;
+  }
 
+  public boolean deleteIndexMetadata(String id) {
+    try {
+      this.restClientService.deleteResource(this.getIndexUrl() + "/" + id);
     } catch (SolidifyResourceNotFoundException | SolidifyRestException e) {
-      log.error("Error in indexing (" + md.getResId() + ")", e);
+      log.error("Error in deleting metadata index (" + id + ")", e);
       return false;
     }
     return true;
diff --git a/solidify-index-service/src/main/java/ch/unige/solidify/index/indexing/elasticsearch/ElasticsearchService.java b/solidify-index-service/src/main/java/ch/unige/solidify/index/indexing/elasticsearch/ElasticsearchService.java
index 833d862cfba9f339228f6bbb9fc0ddacb1a5364e..9c4d6ca1885e89ade1421c98072c37ab884d0896 100644
--- a/solidify-index-service/src/main/java/ch/unige/solidify/index/indexing/elasticsearch/ElasticsearchService.java
+++ b/solidify-index-service/src/main/java/ch/unige/solidify/index/indexing/elasticsearch/ElasticsearchService.java
@@ -355,7 +355,7 @@ public abstract class ElasticsearchService<T extends IndexMetadata> extends Inde
             .document(indexEntry.getMetadata());
     try {
       final IndexResponse response = this.esClient.index(builder.build());
-      if (response.result() == Result.Created) {
+      if (response.result() == Result.Created || response.result() == Result.Updated) {
         return indexEntry;
       } else {
         throw new SolidifyRuntimeException(
@@ -377,8 +377,8 @@ public abstract class ElasticsearchService<T extends IndexMetadata> extends Inde
             .doc(indexEntry.getMetadata());
     try {
       UpdateResponse<T> updateResponse = this.esClient.update(updateBuilder.build(), this.getIndexEntryClass());
-      if (updateResponse.result() == Result.Updated) {
-        return updateResponse.get().source();
+      if (updateResponse.result() == Result.Updated || updateResponse.result() == Result.NoOp) {
+        return indexEntry;
       } else {
         throw new SolidifyRuntimeException(
                 "The following metadata could not be updated in index '" + this.getIndexName() + "': \n\n" + indexEntry.getMetadata()