diff --git a/README.md b/README.md
index f4148fd3..50f0b671 100644
--- a/README.md
+++ b/README.md
@@ -62,6 +62,14 @@ For instance, uploading study metadata, resources, or GSVA data incrementally is
This method ensures efficient updates without the need for complete study reuploads, saving time and computational resources.
+### Patching Study Metadata
+
+It is possible to update study name, description, citation or pmid without reloading the whole study. Below is an example of such command:
+
+```bash
+java -cp core-*.jar org.mskcc.cbio.portal.scripts.PatchCancerStudyMetadata meta_study.txt
+```
+
## How to run integration tests
This section guides you through the process of running integration tests by setting up a cBioPortal MySQL database environment using Docker. Please follow these steps carefully to ensure your testing environment is configured correctly.
diff --git a/src/main/java/org/mskcc/cbio/portal/scripts/PatchCancerStudyMetadata.java b/src/main/java/org/mskcc/cbio/portal/scripts/PatchCancerStudyMetadata.java
new file mode 100644
index 00000000..fba6cc21
--- /dev/null
+++ b/src/main/java/org/mskcc/cbio/portal/scripts/PatchCancerStudyMetadata.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2016 The Hyve B.V.
+ * This code is licensed under the GNU Affero General Public License (AGPL),
+ * version 3, or (at your option) any later version.
+ */
+
+/*
+ * This file is part of cBioPortal.
+ *
+ * cBioPortal is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License.
+ *
+ * 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+*/
+
+package org.mskcc.cbio.portal.scripts;
+
+import org.mskcc.cbio.portal.dao.DaoCancerStudy;
+import org.mskcc.cbio.portal.dao.DaoException;
+import org.mskcc.cbio.portal.dao.JdbcUtil;
+import org.mskcc.cbio.portal.util.ProgressMonitor;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * Command Line Tool to update the metadata of a Single Cancer Study.
+ */
+public class PatchCancerStudyMetadata extends ConsoleRunnable {
+
+ public static final String CANCER_STUDY_IDENTIFIER_META_FIELD = "cancer_study_identifier";
+ public static final String NAME_META_FIELD = "name";
+ public static final String DESCRIPTION_META_FIELD = "description";
+ public static final String CITATION_META_FIELD = "citation";
+ public static final String PMID_META_FIELD = "pmid";
+ public static final Set PATCH_SUPPORTED_META_FIELDS = Set.of(NAME_META_FIELD, DESCRIPTION_META_FIELD, CITATION_META_FIELD, PMID_META_FIELD);
+
+ public void run() {
+ run(args);
+ }
+
+ public static void run(String[] args) {
+ if (args.length < 1) {
+ throw new UsageException(
+ PatchCancerStudyMetadata.class.getName(),
+ null,
+ "");
+ }
+ File file = new File(args[0]);
+ try {
+ run(file);
+ } catch (Exception e) {
+ throw new RuntimeException("File" + file, e);
+ }
+ }
+
+ public static void run(File file) throws IOException, SQLException, DaoException {
+ InputStream inputStream = new FileInputStream(file);
+ run(inputStream);
+ }
+
+ public static void run(InputStream inputStream) throws IOException, SQLException, DaoException {
+ TrimmedProperties properties = new TrimmedProperties();
+ properties.load(inputStream);
+ if (properties.isEmpty()) {
+ throw new IllegalStateException("No fields were found");
+ }
+ if (!properties.containsKey(CANCER_STUDY_IDENTIFIER_META_FIELD)) {
+ throw new IllegalStateException("No " + CANCER_STUDY_IDENTIFIER_META_FIELD + " field has been found");
+ }
+ if (properties.keySet().stream().noneMatch((PATCH_SUPPORTED_META_FIELDS::contains))) {
+ throw new IllegalStateException("No field to patch has been found. Supported fields: "
+ + CANCER_STUDY_IDENTIFIER_META_FIELD);
+ }
+
+ Iterator> iterator = properties.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry