diff --git a/README.md b/README.md
index df714ab1efd..ab7504dd2fc 100644
--- a/README.md
+++ b/README.md
@@ -1,97 +1,59 @@
 <p align="center">
-	<img src="http://content.arduino.cc/brand/arduino-color.svg" width="50%" />
+    <img src="http://content.arduino.cc/brand/arduino-color.svg" width="50%" />
 </p>
 
-Arduino is an open-source physical computing platform based on a simple I/O
-board and a development environment that implements the Processing/Wiring
-language. Arduino can be used to develop stand-alone interactive objects or
-can be connected to software on your computer (e.g. Flash, Processing and MaxMSP).
-The boards can be assembled by hand or purchased preassembled; the open-source
-IDE can be downloaded for free at [https://arduino.cc](https://www.arduino.cc/en/Main/Software)
+**Important Notice**: This repository contains the legacy Arduino IDE 1.x, which is no longer in active development. For the latest features and updates, please visit the [Arduino IDE 2.x](https://github.com/arduino/arduino-ide) repository. If you encounter issues related to the newer IDE, please report them there.
+
+Arduino is an open-source physical computing platform based on a simple I/O board and a development environment that implements the Processing/Wiring language. Arduino can be used to develop stand-alone interactive objects or can be connected to software on your computer (e.g. Flash, Processing and MaxMSP). The boards can be assembled by hand or purchased preassembled; the open-source IDE can be downloaded for free at [https://arduino.cc](https://www.arduino.cc/en/Main/Software).
 
 ![Github](https://img.shields.io/github/v/release/arduino/Arduino)
 
 ## More info at
 
--  [Our website](https://www.arduino.cc/)
-
--  [The forums](https://forum.arduino.cc/)
-
--  Follow us on [Twitter](https://twitter.com/arduino)
--  And like us at [Facebook](https://www.facebook.com/official.arduino)
+- [Our website](https://www.arduino.cc/)
+- [The forums](https://forum.arduino.cc/)
+- Follow us on [Twitter](https://twitter.com/arduino)
+- And like us at [Facebook](https://www.facebook.com/official.arduino)
 
 ## Bug reports and technical discussions
 
--  To report a *bug* in the software or to request *a simple enhancement* go to [Github Issues](https://github.com/arduino/Arduino/issues)
-
--  More complex requests and technical discussion should go on the [Arduino Developers
-mailing list](https://groups.google.com/a/arduino.cc/forum/#!forum/developers)
-
--  If you're interested in modifying or extending the Arduino software, we strongly
-suggest discussing your ideas on the
-[Developers mailing list](https://groups.google.com/a/arduino.cc/forum/#!forum/developers)
- *before* starting to work on them.
-That way you can coordinate with the Arduino Team and others,
-giving your work a higher chance of being integrated into the official release
+- To report a *bug* in the software or to request *a simple enhancement*, go to [Github Issues](https://github.com/arduino/Arduino/issues).
+- More complex requests and technical discussions should go on the [Arduino Developers mailing list](https://groups.google.com/a/arduino.cc/forum/#!forum/developers).
+- If you're interested in modifying or extending the Arduino software, we strongly suggest discussing your ideas on the [Developers mailing list](https://groups.google.com/a/arduino.cc/forum/#!forum/developers) *before* starting to work on them. That way you can coordinate with the Arduino Team and others, giving your work a higher chance of being integrated into the official release.
 
 ### Security
 
-If you think you found a vulnerability or other security-related bug in this project, please read our
-[security policy](https://github.com/arduino/Arduino/security/policy) and report the bug to our Security Team 🛡️
-Thank you!
+If you think you found a vulnerability or other security-related bug in this project, please read our [security policy](https://github.com/arduino/Arduino/security/policy) and report the bug to our Security Team 🛡️. Thank you!
 
 e-mail contact: security@arduino.cc
 
 ## Installation
 
-Detailed instructions for installation in popular operating systems can be found at:
+Detailed instructions for installation on popular operating systems can be found at:
 
--  [Linux](https://www.arduino.cc/en/Guide/Linux) (see also the [Arduino playground](https://playground.arduino.cc/Learning/Linux))
--  [macOS](https://www.arduino.cc/en/Guide/macOS)
--  [Windows](https://www.arduino.cc/en/Guide/Windows)
+- [Linux](https://www.arduino.cc/en/Guide/Linux) (see also the [Arduino playground](https://playground.arduino.cc/Learning/Linux))
+- [macOS](https://www.arduino.cc/en/Guide/macOS)
+- [Windows](https://www.arduino.cc/en/Guide/Windows)
 
 ## Contents of this repository
 
-This repository contains just the code for the Arduino IDE itself.
-Originally, it also contained the AVR and SAM Arduino core and libraries
-(i.e.  the code that is compiled as part of a sketch and runs on the
-actual Arduino device), but those have been moved into their own
-repositories.  They are still automatically downloaded as part of the
-build process and included in built releases, though.
+This repository contains just the code for the Arduino IDE itself. Originally, it also contained the AVR and SAM Arduino core and libraries (i.e. the code that is compiled as part of a sketch and runs on the actual Arduino device), but those have been moved into their own repositories. They are still automatically downloaded as part of the build process and included in built releases, though.
 
 The repositories for these extra parts can be found here:
--   Non-core specific Libraries are listed under: <https://github.com/arduino-libraries/>
-    (and also a few other places, see `build/build.xml`).
-
--   The AVR core can be found at: <https://github.com/arduino/ArduinoCore-avr>
-
--   Other cores are not included by default but installed through the
-    board manager. Their repositories can also be found under
-    <https://github.com/arduino/>.
+- Non-core specific Libraries are listed under: [Arduino Libraries](https://github.com/arduino-libraries/) (and also a few other places, see `build/build.xml`).
+- The AVR core can be found at: [ArduinoCore-avr](https://github.com/arduino/ArduinoCore-avr).
+- Other cores are not included by default but can be installed through the board manager. Their repositories can also be found under [Arduino GitHub organization](https://github.com/arduino/).
 
 ## Building and testing
 
-Instructions for building the IDE and running unit tests can be found on
-the wiki:
--   <https://github.com/arduino/Arduino/wiki/Building-Arduino>
--   <https://github.com/arduino/Arduino/wiki/Testing-Arduino>
+Instructions for building the IDE and running unit tests can be found on the wiki:
+- [Building Arduino](https://github.com/arduino/Arduino/wiki/Building-Arduino)
+- [Testing Arduino](https://github.com/arduino/Arduino/wiki/Testing-Arduino)
 
 ## Credits
 
-Arduino is an open source project, supported by many.
-
-The Arduino team is composed of Massimo Banzi, David Cuartielles, Tom Igoe
-and David A. Mellis.
-
-Arduino uses
-[GNU avr-gcc toolchain](https://gcc.gnu.org/wiki/avr-gcc),
-[GCC ARM Embedded toolchain](https://launchpad.net/gcc-arm-embedded),
-[avr-libc](https://www.nongnu.org/avr-libc/),
-[avrdude](https://www.nongnu.org/avrdude/),
-[bossac](http://www.shumatech.com/web/products/bossa),
-[openOCD](http://openocd.org/)
-and code from [Processing](https://www.processing.org)
-and [Wiring](http://wiring.org.co).
+Arduino is an open-source project, supported by many. The Arduino team is composed of Massimo Banzi, David Cuartielles, Tom Igoe, and David A. Mellis.
 
-Icon and about image designed by [ToDo](https://www.todo.to.it/)
+Arduino uses [GNU avr-gcc toolchain](https://gcc.gnu.org/wiki/avr-gcc), [GCC ARM Embedded toolchain](https://launchpad.net/gcc-arm-embedded), [avr-libc](https://www.nongnu.org/avr-libc/), [avrdude](https://www.nongnu.org/avrdude/), [bossac](http://www.shumatech.com/web/products/bossa), [openOCD](http://openocd.org/), and code from [Processing](https://www.processing.org) and [Wiring](http://wiring.org.co).
 
+Icon and about image designed by [ToDo](https://www.todo.to.it/).
diff --git a/app/.classpath b/app/.classpath
index 9b920b1bb39..ea9425b4990 100644
--- a/app/.classpath
+++ b/app/.classpath
@@ -38,8 +38,6 @@
 	<classpathentry kind="lib" path="lib/jmdns-3.5.5.jar"/>
 	<classpathentry kind="lib" path="lib/slf4j-api-1.7.22.jar"/>
 	<classpathentry kind="lib" path="lib/slf4j-simple-1.7.22.jar"/>
-	<classpathentry kind="lib" path="lib/log4j-api-2.16.0.jar"/>
-	<classpathentry kind="lib" path="lib/log4j-core-2.16.0.jar"/>
 	<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
 	<classpathentry kind="lib" path="lib/rsyntaxtextarea-3.0.3-SNAPSHOT.jar"/>
 	<classpathentry kind="lib" path="lib/xml-apis-1.3.04.jar"/>
diff --git a/app/build.xml b/app/build.xml
index fa3223642ff..d2e9ad0069d 100644
--- a/app/build.xml
+++ b/app/build.xml
@@ -80,10 +80,6 @@
 	   includeAntRuntime="false"
 	   debug="true"
 	   classpathref="class.path" />
-    <!-- If you want to add files in the jars -->
-    <copy todir="bin" overwrite="true" verbose="true">
-      <fileset dir="src" includes="log4j2.xml" />
-    </copy>
   </target>
 
   <target name="test" depends="compile" description="Runs the test">
diff --git a/app/lib/log4j-api-2.16.0.jar b/app/lib/log4j-api-2.16.0.jar
deleted file mode 100644
index 2cdcc4b07db..00000000000
Binary files a/app/lib/log4j-api-2.16.0.jar and /dev/null differ
diff --git a/app/lib/log4j-core-2.16.0.jar b/app/lib/log4j-core-2.16.0.jar
deleted file mode 100644
index bc913bc5312..00000000000
Binary files a/app/lib/log4j-core-2.16.0.jar and /dev/null differ
diff --git a/app/src/cc/arduino/contributions/ContributionsSelfCheck.java b/app/src/cc/arduino/contributions/ContributionsSelfCheck.java
index 96fd987b099..50e5e8617ea 100644
--- a/app/src/cc/arduino/contributions/ContributionsSelfCheck.java
+++ b/app/src/cc/arduino/contributions/ContributionsSelfCheck.java
@@ -35,7 +35,6 @@
 import cc.arduino.contributions.packages.ContributionInstaller;
 import cc.arduino.contributions.packages.filters.UpdatablePlatformPredicate;
 import cc.arduino.view.NotificationPopup;
-import org.apache.logging.log4j.LogManager;
 import processing.app.*;
 
 import javax.swing.*;
@@ -160,12 +159,14 @@ public void windowGainedFocus(WindowEvent evt) {
 
   private void goToManager(String link) {
     try {
-      ((UpdatableBoardsLibsFakeURLsHandler) hyperlinkListener).openBoardLibManager(new URL(link));
-    }
-      catch (Exception e){
-        LogManager.getLogger(ContributionsSelfCheck.class).warn("Exception while attempting to go to board manager", e);
+      ((UpdatableBoardsLibsFakeURLsHandler) hyperlinkListener)
+          .openBoardLibManager(new URL(link));
+    } catch (Exception e) {
+      System.err.println("Error while attempting to open board manager: "
+                         + e.getMessage());
     }
   }
+
   // callback for boards button
   public void onOptionalButton1Callback() {
     goToManager(boardsManagerURL);
diff --git a/app/src/log4j2.xml b/app/src/log4j2.xml
deleted file mode 100644
index 64f6b8f063f..00000000000
--- a/app/src/log4j2.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="warn" name="Arduino" packages="cc.arduino">
-  <Appenders>
-
-    <!-- Console Appender -->
-    <Console name="Console" target="SYSTEM_ERR">
-      <PatternLayout pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}{UTC} %p %c{1.}:%L [%t] %m%n"/>
-    </Console>
-
-    <!-- Rolling File Appender -->
-    <RollingFile name="RollingFile" fileName="${sys:log4j.dir}/logs/application.log"
-                 filePattern="${sys:log4j.dir}/logs/application-%d{MM-dd-yyyy}-%i.log.gz"
-                 ignoreExceptions="false">
-      <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}{UTC} %p %c{1.}:%L [%t] %m%n</Pattern>
-      </PatternLayout>
-      <Policies>
-        <SizeBasedTriggeringPolicy size="50 MB"/>
-      </Policies>
-      <DefaultRolloverStrategy max="20"/>
-    </RollingFile>
-  </Appenders>
-  <Loggers>
-    <Root level="debug">
-      <AppenderRef ref="Console" level="info" />
-      <AppenderRef ref="RollingFile"/>
-    </Root>
-  </Loggers>
-</Configuration>
diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java
index 9fa56030ed3..cdac3059f6d 100644
--- a/app/src/processing/app/Base.java
+++ b/app/src/processing/app/Base.java
@@ -220,12 +220,6 @@ public Base(String[] args) throws Exception {
     parser.parseArgumentsPhase1();
     commandLine = !parser.isGuiMode();
 
-    // This configure the logs root folder
-    if (parser.isGuiMode()) {
-        System.out.println("Set log4j store directory " + BaseNoGui.getSettingsFolder().getAbsolutePath());
-    }
-    System.setProperty("log4j.dir", BaseNoGui.getSettingsFolder().getAbsolutePath());
-
     BaseNoGui.checkInstallationFolder();
 
     // If no path is set, get the default sketchbook folder for this platform
diff --git a/app/testdata/libraries/Bridge_1.6.3/Bridge/examples/HttpClient/HttpClient.ino b/app/testdata/libraries/Bridge_1.6.3/Bridge/examples/HttpClient/HttpClient.ino
index 47a37c3f2eb..b0a6c21ffbe 100644
--- a/app/testdata/libraries/Bridge_1.6.3/Bridge/examples/HttpClient/HttpClient.ino
+++ b/app/testdata/libraries/Bridge_1.6.3/Bridge/examples/HttpClient/HttpClient.ino
@@ -37,7 +37,7 @@ void loop() {
   HttpClient client;
 
   // Make a HTTP request:
-  client.get("http://www.arduino.cc/asciilogo.txt");
+  client.get("http://arduino.tips/asciilogo.txt");
 
   // if there are incoming bytes available
   // from the server, read them and print them:
diff --git a/arduino-core/.classpath b/arduino-core/.classpath
index 42c399786af..3f0d53aaaf6 100644
--- a/arduino-core/.classpath
+++ b/arduino-core/.classpath
@@ -8,8 +8,6 @@
 	<classpathentry kind="lib" path="lib/jmdns-3.5.5.jar"/>
 	<classpathentry kind="lib" path="lib/slf4j-api-1.7.22.jar"/>
 	<classpathentry kind="lib" path="lib/slf4j-simple-1.7.22.jar"/>
-	<classpathentry kind="lib" path="lib/log4j-api-2.16.0.jar"/>
-	<classpathentry kind="lib" path="lib/log4j-core-2.16.0.jar"/>
 	<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
 	<classpathentry kind="lib" path="lib/commons-exec-1.1.jar"/>
 	<classpathentry kind="lib" path="../app/lib/commons-httpclient-3.1.jar"/>
diff --git a/arduino-core/lib/log4j-api-2.16.0.jar b/arduino-core/lib/log4j-api-2.16.0.jar
deleted file mode 100644
index 2cdcc4b07db..00000000000
Binary files a/arduino-core/lib/log4j-api-2.16.0.jar and /dev/null differ
diff --git a/arduino-core/lib/log4j-core-2.16.0.jar b/arduino-core/lib/log4j-core-2.16.0.jar
deleted file mode 100644
index bc913bc5312..00000000000
Binary files a/arduino-core/lib/log4j-core-2.16.0.jar and /dev/null differ
diff --git a/arduino-core/src/cc/arduino/contributions/DownloadableContributionsDownloader.java b/arduino-core/src/cc/arduino/contributions/DownloadableContributionsDownloader.java
index ee32dff5386..620152abf83 100644
--- a/arduino-core/src/cc/arduino/contributions/DownloadableContributionsDownloader.java
+++ b/arduino-core/src/cc/arduino/contributions/DownloadableContributionsDownloader.java
@@ -34,8 +34,6 @@
 import cc.arduino.utils.Progress;
 import cc.arduino.utils.network.FileDownloader;
 import org.apache.commons.io.FilenameUtils;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import processing.app.BaseNoGui;
 import processing.app.PreferencesData;
 
@@ -48,8 +46,6 @@
 import static processing.app.I18n.tr;
 
 public class DownloadableContributionsDownloader {
-  private static Logger log = LogManager.getLogger(DownloadableContributionsDownloader.class);
-
   private final File stagingFolder;
 
   public DownloadableContributionsDownloader(File _stagingFolder) {
@@ -151,7 +147,6 @@ public void download(URL url, File tmpFile, Progress progress, String statusText
   }
 
   public void downloadIndexAndSignature(MultiStepProgress progress, URL packageIndexUrl, ProgressListener progressListener, SignatureVerifier signatureVerifier) throws Exception {
-
     // Extract the file name from the url
     final String indexFileName = FilenameUtils.getName(packageIndexUrl.getPath());
     final File packageIndex = BaseNoGui.indexer.getIndexFile(indexFileName);
@@ -169,16 +164,13 @@ public void downloadIndexAndSignature(MultiStepProgress progress, URL packageInd
         if (checkSignature(progress, signatureUrl, progressListener, signatureVerifier, statusText, packageIndexTemp)) {
           Files.move(packageIndexTemp.toPath(), packageIndex.toPath(), StandardCopyOption.REPLACE_EXISTING);
         } else {
-          log.info("The cached files have been removed. {} {}", packageIndexUrl, signatureUrl);
           FileDownloader.invalidateFiles(packageIndexUrl, signatureUrl);
         }
       } else {
         // Move the package index to the destination when the signature is not necessary
         Files.move(packageIndexTemp.toPath(), packageIndex.toPath(), StandardCopyOption.REPLACE_EXISTING);
-        log.info("The domain is not selected to verify the signature. will be copied into this path {}, packageIndex url: {}", packageIndex, packageIndexUrl);
       }
     } catch (Exception e) {
-      log.error("Cannot download the package index from {} the package will be discard", packageIndexUrl, e);
       throw e;
     } finally {
       // Delete useless temp file
@@ -196,49 +188,39 @@ public boolean verifyDomain(URL url) {
     if (domain.contains(url.getHost())) {
       return true;
     } else {
-      log.info("The domain is not selected to verify the signature. domain list: {}, url: {}", domain, url);
       return false;
     }
   }
 
   public boolean checkSignature(MultiStepProgress progress, URL signatureUrl, ProgressListener progressListener, SignatureVerifier signatureVerifier, String statusText, File fileToVerify) throws Exception {
-
-
     // Signature file name
     final String signatureFileName = FilenameUtils.getName(signatureUrl.getPath());
     final File packageIndexSignature = BaseNoGui.indexer.getIndexFile(signatureFileName);
     final File packageIndexSignatureTemp = File.createTempFile(signatureFileName, ".tmp");
 
-
     try {
       // Download signature
       download(signatureUrl, packageIndexSignatureTemp, progress, statusText, progressListener, true);
 
       if (PreferencesData.areInsecurePackagesAllowed()) {
         Files.move(packageIndexSignatureTemp.toPath(), packageIndexSignature.toPath(), StandardCopyOption.REPLACE_EXISTING);
-        log.info("Allowing insecure packages because allow_insecure_packages is set to true in preferences.txt" +
-          " but the signature was download");
         return true;
       }
 
       // Verify the signature before move the files
       final boolean signatureVerified = signatureVerifier.isSigned(fileToVerify, packageIndexSignatureTemp);
       if (signatureVerified) {
-        log.info("Signature verified. url={}, signature url={}, file to verify={}, signature file={}", signatureUrl, signatureUrl, fileToVerify, packageIndexSignatureTemp);
         // Move if the signature is ok
         Files.move(packageIndexSignatureTemp.toPath(), packageIndexSignature.toPath(), StandardCopyOption.REPLACE_EXISTING);
       } else {
-        log.error("{} file signature verification failed. File ignored.", signatureUrl);
         System.err.println(format(tr("{0} file signature verification failed. File ignored."), signatureUrl.toString()));
       }
       return signatureVerified;
     } catch (Exception e) {
-      log.error("Cannot download the signature from {} the package will be discard", signatureUrl, e);
       throw e;
     } finally {
       Files.deleteIfExists(packageIndexSignatureTemp.toPath());
     }
-
   }
 
 }
diff --git a/arduino-core/src/cc/arduino/contributions/libraries/LibraryInstaller.java b/arduino-core/src/cc/arduino/contributions/libraries/LibraryInstaller.java
index 3f00f909b0d..64a15e7b2b3 100644
--- a/arduino-core/src/cc/arduino/contributions/libraries/LibraryInstaller.java
+++ b/arduino-core/src/cc/arduino/contributions/libraries/LibraryInstaller.java
@@ -38,8 +38,6 @@
 import cc.arduino.utils.MultiStepProgress;
 import cc.arduino.utils.network.FileDownloader;
 import org.apache.commons.io.FilenameUtils;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import processing.app.BaseNoGui;
 import processing.app.I18n;
 import processing.app.Platform;
@@ -57,8 +55,6 @@
 import static processing.app.I18n.tr;
 
 public class LibraryInstaller {
-  private static Logger log = LogManager.getLogger(LibraryInstaller.class);
-
   private final Platform platform;
   private final GPGDetachedSignatureVerifier signatureVerifier;
 
@@ -97,10 +93,7 @@ public synchronized void updateIndex(ProgressListener progressListener) throws E
         }
       } else {
         FileDownloader.invalidateFiles(libraryGzURL, libraryURL, signatureUrl);
-        log.error("Fail to verify the signature of {} the cached files have been removed", libraryURL);
       }
-    } else {
-      log.info("The domain is not selected to verify the signature. library index: {}", signatureUrl);
     }
 
     // Step 2: Parse index
diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java b/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java
index 287f18e496b..1540ce54c40 100644
--- a/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java
+++ b/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java
@@ -41,8 +41,6 @@
 import org.apache.commons.exec.DefaultExecutor;
 import org.apache.commons.exec.Executor;
 import org.apache.commons.exec.PumpStreamHandler;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import processing.app.BaseNoGui;
 import processing.app.I18n;
 import processing.app.Platform;
@@ -64,8 +62,6 @@
 import static processing.app.I18n.tr;
 
 public class ContributionInstaller {
-  private static Logger log = LogManager.getLogger(ContributionInstaller.class);
-
   private final Platform platform;
   private final SignatureVerifier signatureVerifier;
 
@@ -271,8 +267,6 @@ public synchronized List<String> remove(ContributedPlatform contributedPlatform)
         Files.delete(destFolder.getParentFile().toPath());
       } catch (Exception e) {
         // ignore
-        log.info("The directory is not empty there is another version installed. directory {}",
-          destFolder.getParentFile().toPath(),  e);
       }
     }
 
@@ -298,15 +292,12 @@ public synchronized void updateIndex(ProgressListener progressListener) {
         // Extract the file name from the URL
         final URL packageIndexURL = new URL(packageIndexURLString);
 
-        log.info("Start download and signature check of={}", packageIndexURLs);
         downloader.downloadIndexAndSignature(progress, packageIndexURL, progressListener, signatureVerifier);
       } catch (Exception e) {
-        log.error(e.getMessage(), e);
         System.err.println(e.getMessage());
       }
     }
 
     progress.stepDone();
-    log.info("Downloaded package index URL={}", packageIndexURLs);
   }
 }
diff --git a/arduino-core/src/cc/arduino/utils/network/FileDownloader.java b/arduino-core/src/cc/arduino/utils/network/FileDownloader.java
index b69a1fa1bc5..78c2cced8fa 100644
--- a/arduino-core/src/cc/arduino/utils/network/FileDownloader.java
+++ b/arduino-core/src/cc/arduino/utils/network/FileDownloader.java
@@ -30,8 +30,6 @@
 package cc.arduino.utils.network;
 
 import org.apache.commons.compress.utils.IOUtils;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import processing.app.helpers.FileUtils;
 
 import javax.script.ScriptException;
@@ -50,8 +48,6 @@
 import java.util.Optional;
 
 public class FileDownloader extends Observable {
-  private static Logger log = LogManager.getLogger(FileDownloader.class);
-
   public enum Status {
     CONNECTING, //
     CONNECTION_TIMEOUT_ERROR, //
@@ -146,17 +142,16 @@ public static void invalidateFiles(URL... filesUrl) {
       try {
         FileDownloaderCache.getFileCached(url).ifPresent(fileCached -> {
           try {
-            log.info("Invalidate this file {} that comes from {}", fileCached.getLocalPath(), fileCached.getRemoteURL());
             fileCached.invalidateCache();
           } catch (Exception e) {
-            log.warn("Fail to invalidate cache", e);
+            System.err.println("Error invalidating cached file " + fileCached.getLocalPath() + " that comes from "
+                + fileCached.getRemoteURL() + ": " + e.getMessage());
           }
         });
       } catch (URISyntaxException | NoSuchMethodException | ScriptException | IOException e) {
-        log.warn("Fail to get the file cached during the file invalidation", e);
+        System.err.println("Fail to get the file cached during the file invalidation" + e.getMessage());
       }
     });
-
   }
 
   private void downloadFile(boolean noResume) throws InterruptedException {
@@ -171,7 +166,6 @@ private void downloadFile(boolean noResume) throws InterruptedException {
         final Optional<File> fileFromCache = getFileCached(fileCached);
         if (fileCached.isNotChange() && fileFromCache.isPresent()) {
           // Copy the cached file in the destination file
-          log.info("The file will be taken from the cache {}", fileFromCache);
           FileUtils.copyFile(fileFromCache.get(), outputFile);
         } else {
           openConnectionAndFillTheFile(noResume);
@@ -191,34 +185,23 @@ private void downloadFile(boolean noResume) throws InterruptedException {
     } catch (SocketTimeoutException e) {
       setStatus(Status.CONNECTION_TIMEOUT_ERROR);
       setError(e);
-      log.error("The request went in socket timeout", e);
 
     } catch (Exception e) {
       setStatus(Status.ERROR);
       setError(e);
-      log.error("The request stop", e);
     }
 
   }
 
   private Optional<File> getFileCached(FileDownloaderCache.FileCached fileCached) {
-
     try {
-      final Optional<File> fileFromCache =
-        fileCached.getFileFromCache();
+      final Optional<File> fileFromCache = fileCached.getFileFromCache();
       if (fileFromCache.isPresent()) {
-        log.info("No need to download using cached file: {}", fileCached);
         return fileFromCache;
-      } else {
-        log.info(
-          "The file in the cache is not in the path or the md5 validation failed: path={}, file exist={}, md5 validation={}",
-          fileCached.getLocalPath(), fileCached.exists(), fileCached.md5Check());
       }
     } catch (Exception e) {
-      log.warn(
-        "Cannot get the file from the cache, will be downloaded a new one ", e);
+      // Cannot get the file from the cache, download a new one
     }
-    log.info("The file is change {}", fileCached);
     return Optional.empty();
   }
 
diff --git a/arduino-core/src/cc/arduino/utils/network/FileDownloaderCache.java b/arduino-core/src/cc/arduino/utils/network/FileDownloaderCache.java
index 766e70859e1..a529a241d0f 100644
--- a/arduino-core/src/cc/arduino/utils/network/FileDownloaderCache.java
+++ b/arduino-core/src/cc/arduino/utils/network/FileDownloaderCache.java
@@ -38,8 +38,6 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import processing.app.BaseNoGui;
 import processing.app.PreferencesData;
 import processing.app.helpers.FileUtils;
@@ -64,8 +62,6 @@
 
 public class FileDownloaderCache {
   private final static String CACHE_ENABLE_PREFERENCE_KEY = "cache.enable";
-  private final static Logger log = LogManager
-    .getLogger(FileDownloaderCache.class);
   private final static Map<String, FileCached> cachedFiles = Collections
     .synchronizedMap(new HashMap<>());
   private final static String cacheFolder;
@@ -73,9 +69,6 @@ public class FileDownloaderCache {
 
   static {
     enableCache = Boolean.valueOf(PreferencesData.get(CACHE_ENABLE_PREFERENCE_KEY, "true"));
-    if (!enableCache) {
-      log.info("The cache is disable cache.enable=false");
-    }
     PreferencesData.set(CACHE_ENABLE_PREFERENCE_KEY, Boolean.toString(enableCache));
 
     final File settingsFolder;
@@ -86,10 +79,8 @@ public class FileDownloaderCache {
     } else {
       enableCache = false;
       cacheFolder = null;
-      log.error("The cache will disable because the setting folder is null, cannot generate the cache path");
     }
     final Path pathCacheInfo = getCachedInfoPath();
-    log.info("Cache folder {}", cacheFolder);
     try {
       if (Files.exists(pathCacheInfo)) {
         ObjectMapper mapper = new ObjectMapper();
@@ -109,31 +100,26 @@ public class FileDownloaderCache {
             .collect(Collectors.toMap(FileCached::getRemoteURL, Function.identity()))
           )
         );
-        log.info("Number of file already in the cache {}", cachedFiles.size());
 
       }
     } catch (Exception e) {
-      log.error("Cannot initialized the cache", e);
+      System.err.println("Cannot initialized the cache: " + e.getMessage());
     }
   }
 
   public static Optional<FileCached> getFileCached(final URL remoteURL)
-    throws URISyntaxException, NoSuchMethodException, ScriptException,
-    IOException {
+      throws URISyntaxException, NoSuchMethodException, ScriptException, IOException {
     return getFileCached(remoteURL, true);
   }
 
   public static Optional<FileCached> getFileCached(final URL remoteURL, boolean enableCache)
-    throws URISyntaxException, NoSuchMethodException, ScriptException,
-    IOException {
+      throws URISyntaxException, NoSuchMethodException, ScriptException, IOException {
     // Return always and empty file if the cache is not enable
     if (!(enableCache && FileDownloaderCache.enableCache)) {
-      log.info("The cache is not enable.");
       return Optional.empty();
     }
     final String[] splitPath = remoteURL.getPath().split("/");
     if (splitPath.length == 0) {
-      log.warn("The remote path as no file name {}", remoteURL);
       return Optional.empty();
     }
     // Create the path where the cached file should exist
@@ -146,19 +132,14 @@ public static Optional<FileCached> getFileCached(final URL remoteURL, boolean en
       .orElseGet(() -> new FileCached(remoteURL.toString(), cacheFilePath.toString()));
 
     // If the file is change of the cache is disable run the HEAD request to check if the file is changed
-    log.info("Get file cached is expire {}, exist {}, info {} ", fileCached.isExpire(), fileCached.exists(), fileCached);
     if (fileCached.isExpire() || !fileCached.exists()) {
       // Update remote etag and cache control header
       final Optional<FileCached> fileCachedInfoUpdated =
         FileDownloaderCache.updateCacheInfo(remoteURL, (remoteETagClean, cacheControl) -> {
           // Check cache control data
           if (cacheControl.isNoCache() || cacheControl.isMustRevalidate() || cacheControl.isNoStore()) {
-            log.warn("The file {} must not be cache due to cache control header {}",
-              remoteURL, cacheControl);
             return Optional.empty();
           }
-          log.info("Update cached info of {}, createdAt {}, previous eTag {}, last eTag {}, cache control header {} ",
-            remoteURL, fileCached.createdAt, fileCached.eTag, remoteETagClean, cacheControl);
           final FileCached fileCachedUpdateETag = new FileCached(
             remoteURL.toString(),
             cacheFilePath.toString(),
@@ -180,20 +161,18 @@ private static Optional<FileCached> updateCacheInfo(URL remoteURL, BiFunction<St
     throws URISyntaxException, NoSuchMethodException, ScriptException,
     IOException {
     // Update the headers of the cached file
-    final HttpURLConnection headRequest = new HttpConnectionManager(
-      remoteURL).makeConnection((connection) -> {
+    final HttpURLConnection headRequest = new HttpConnectionManager(remoteURL).makeConnection((connection) -> {
       try {
         connection.setRequestMethod("HEAD");
       } catch (ProtocolException e) {
-        log.error("Invalid protocol", e);
+        System.err.println(e.getMessage());
       }
     });
     final int responseCode = headRequest.getResponseCode();
     headRequest.disconnect();
     // Something bad is happening return a conservative true to try to download the file
     if (responseCode < 200 || responseCode >= 300) {
-      log.warn("The head request return a bad response code " + responseCode);
-      // if something bad happend
+      // if something bad happened
       return Optional.empty();
     }
     // Get all the useful headers
@@ -204,7 +183,7 @@ private static Optional<FileCached> updateCacheInfo(URL remoteURL, BiFunction<St
       final CacheControl cacheControl = CacheControl.valueOf(cacheControlHeader);
       return getNewFile.apply(remoteETagClean, cacheControl);
     }
-    log.warn("The head request do not return the ETag {} or the Cache-Control {}", remoteETag, cacheControlHeader);
+    // the head request do not return the ETag or the Cache-Control
     return Optional.empty();
   }
 
@@ -223,7 +202,6 @@ private synchronized static void updateCacheFilesInfo() throws IOException {
     if (Files.notExists(cachedFileInfo)) {
       Files.createDirectories(cachedFileInfo.getParent());
     }
-    log.info("Update cache file info in {}, number of cached files is {}", cachedFileInfo.toFile(), cachedFiles.size());
     // Write to cache.json
     mapper.writeValue(cachedFileInfo.toFile(), objectNode);
   }
@@ -287,19 +265,16 @@ public boolean isNotChange() {
     @JsonIgnore
     public boolean isChange() {
       // Check if the file is expire
-      boolean isChange = false;
+      boolean isChanged = false;
       if (isExpire()) {
-        log.debug("The file \"{}\" is expire. Expire time: {}", localPath,
-          this.getExpiresTime().format(DateTimeFormatter.ISO_DATE_TIME));
-        isChange = true;
+        isChanged = true;
       }
 
       if (lastETag != null && !lastETag.equals(eTag)) {
-        // If are different means that the file is change
-        log.debug("The file \"{}\" is changed last ETag != now Etag ({}!={})", localPath, lastETag, eTag);
-        isChange = true;
+        // Different ETag means that the file is changed
+        isChanged = true;
       }
-      return isChange;
+      return isChanged;
     }
 
     @JsonIgnore
@@ -327,7 +302,6 @@ public synchronized void updateCacheFile(File fileToCache) throws Exception {
       final String md5 = this.calculateMD5();
       final String eTag;
       if (lastETag == null) {
-        log.warn("The eTag was not calculate this time, is not the right behaviour fileCached={}, md5={}", this, md5);
         eTag = this.eTag;
       } else {
         eTag = this.lastETag;
@@ -340,10 +314,8 @@ public synchronized void updateCacheFile(File fileToCache) throws Exception {
         md5,
         this.cacheControl
       );
-      log.info("Update cache file: {}", newFileCached);
       cachedFiles.put(remoteURL, newFileCached);
       updateCacheFilesInfo();
-
     }
 
     public synchronized void invalidateCache() throws IOException {
@@ -363,7 +335,6 @@ public boolean md5Check() {
       try {
         return !Objects.isNull(getMD5()) && Objects.equals(calculateMD5(), getMD5());
       } catch (Exception e) {
-        log.error("Fail to calculate the MD5. file={}", this, e);
         return false;
       }
     }
diff --git a/arduino-core/src/cc/arduino/utils/network/HttpConnectionManager.java b/arduino-core/src/cc/arduino/utils/network/HttpConnectionManager.java
index b067e8faaa9..acb754d5055 100644
--- a/arduino-core/src/cc/arduino/utils/network/HttpConnectionManager.java
+++ b/arduino-core/src/cc/arduino/utils/network/HttpConnectionManager.java
@@ -31,9 +31,6 @@
 
 import cc.arduino.net.CustomProxySelector;
 import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import processing.app.BaseNoGui;
 import processing.app.PreferencesData;
 
@@ -47,7 +44,6 @@
 import java.util.function.Consumer;
 
 public class HttpConnectionManager {
-  private static Logger log = LogManager.getLogger(HttpConnectionManager.class);
   private static final String userAgent;
   private static final int connectTimeout;
   private static final int maxRedirectNumber;
@@ -69,23 +65,17 @@ public class HttpConnectionManager {
     userAgent = PreferencesData.get("http.user_agent", defaultUserAgent);
     int connectTimeoutFromConfig = 5000;
     try {
-      connectTimeoutFromConfig =
-        Integer.parseInt(
-          PreferencesData.get("http.connection_timeout_ms", "5000"));
+      connectTimeoutFromConfig = PreferencesData.getInteger("http.connection_timeout_ms", 5000);
     } catch (NumberFormatException e) {
-      log.warn(
-        "Cannot parse the http.connection_timeout configuration switch to default {} milliseconds", connectTimeoutFromConfig, e.getCause());
+      System.err.println("Error parsing http.connection_timeout_ms config: " + e.getMessage());
     }
     connectTimeout = connectTimeoutFromConfig;
     // Set by default 20 max redirect to follow
     int maxRedirectNumberConfig = 20;
     try {
-      maxRedirectNumberConfig =
-        Integer.parseInt(
-          PreferencesData.get("http.max_redirect_number", "20"));
+      maxRedirectNumberConfig = PreferencesData.getInteger("http.max_redirect_number", 20);
     } catch (NumberFormatException e) {
-      log.warn(
-        "Cannot parse the http.max_redirect_number configuration switch to default {}", maxRedirectNumberConfig, e.getCause());
+      System.err.println("Error parsing http.max_redirect_number config: " + e.getMessage());
     }
     maxRedirectNumber = maxRedirectNumberConfig;
   }
@@ -116,18 +106,13 @@ public HttpURLConnection makeConnection()
   private HttpURLConnection makeConnection(URL requestURL, int movedTimes,
                                            Consumer<HttpURLConnection> beforeConnection) throws IOException, URISyntaxException, ScriptException, NoSuchMethodException {
     if (movedTimes > maxRedirectNumber) {
-      log.warn("Too many redirect " + requestURL);
       throw new IOException("Too many redirect " + requestURL);
     }
 
-    Proxy proxy = new CustomProxySelector(PreferencesData.getMap())
-      .getProxyFor(requestURL.toURI());
-    log.debug("Using proxy {}", proxy);
+    Proxy proxy = new CustomProxySelector(PreferencesData.getMap()).getProxyFor(requestURL.toURI());
 
-    final String requestId = UUID.randomUUID().toString()
-      .toUpperCase().replace("-", "").substring(0, 16);
-    HttpURLConnection connection = (HttpURLConnection) requestURL
-      .openConnection(proxy);
+    final String requestId = UUID.randomUUID().toString().toUpperCase().replace("-", "").substring(0, 16);
+    HttpURLConnection connection = (HttpURLConnection) requestURL.openConnection(proxy);
 
     // see https://github.com/arduino/Arduino/issues/10264
     // Workaround for https://bugs.openjdk.java.net/browse/JDK-8163921
@@ -150,19 +135,11 @@ private HttpURLConnection makeConnection(URL requestURL, int movedTimes,
     beforeConnection.accept(connection);
 
     // Connect
-    log.info("Connect to {}, method={}, request id={}", requestURL, connection.getRequestMethod(), requestId);
-
     connection.connect();
     int resp = connection.getResponseCode();
-    log.info("Request complete URL=\"{}\", method={}, response code={}, request id={}, headers={}",
-      requestURL, connection.getRequestMethod(), resp, requestId, StringUtils.join(connection.getHeaderFields()));
-
-    if (resp == HttpURLConnection.HTTP_MOVED_PERM
-      || resp == HttpURLConnection.HTTP_MOVED_TEMP) {
 
+    if (resp == HttpURLConnection.HTTP_MOVED_PERM || resp == HttpURLConnection.HTTP_MOVED_TEMP) {
       URL newUrl = new URL(connection.getHeaderField("Location"));
-      log.info("The response code was a 301,302 so try again with the new URL " + newUrl);
-
       return this.makeConnection(newUrl, movedTimes + 1, beforeConnection);
     }
 
diff --git a/arduino-core/src/processing/app/BaseNoGui.java b/arduino-core/src/processing/app/BaseNoGui.java
index e1fe0de98e5..ea51e376e73 100644
--- a/arduino-core/src/processing/app/BaseNoGui.java
+++ b/arduino-core/src/processing/app/BaseNoGui.java
@@ -41,9 +41,9 @@
 public class BaseNoGui {
 
   /** Version string to be used for build */
-  public static final int REVISION = 10818;
+  public static final int REVISION = 10820;
   /** Extended version string displayed on GUI */
-  public static final String VERSION_NAME = "1.8.18";
+  public static final String VERSION_NAME = "1.8.20";
   public static final String VERSION_NAME_LONG;
 
   // Current directory to use for relative paths specified on the
diff --git a/arduino-core/src/processing/app/Platform.java b/arduino-core/src/processing/app/Platform.java
index 913381316d3..c76148df18f 100644
--- a/arduino-core/src/processing/app/Platform.java
+++ b/arduino-core/src/processing/app/Platform.java
@@ -52,7 +52,6 @@
  * know if name is proper Java package syntax.)
  */
 public class Platform {
-  // DO NOT USE log4j here otherwise the root path of the logs will no be initialize correctly
   /**
    * Set the default L & F. While I enjoy the bounty of the sixteen possible
    * exception types that this UIManager method might throw, I feel that in
diff --git a/arduino-core/src/processing/app/helpers/BoardCloudResolver.java b/arduino-core/src/processing/app/helpers/BoardCloudResolver.java
index 8fa6f96da14..f1d4894caaa 100644
--- a/arduino-core/src/processing/app/helpers/BoardCloudResolver.java
+++ b/arduino-core/src/processing/app/helpers/BoardCloudResolver.java
@@ -32,8 +32,6 @@
 import cc.arduino.utils.network.HttpConnectionManager;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import processing.app.BaseNoGui;
 import processing.app.I18n;
 import processing.app.debug.TargetBoard;
@@ -48,7 +46,6 @@
 import static processing.app.I18n.tr;
 
 public class BoardCloudResolver {
-  private static Logger log = LogManager.getLogger(BoardCloudResolver.class);
 
   public synchronized void getBoardBy(String vid, String pid) {
     // this method is less useful in Windows < WIN10 since you need drivers to be already installed
@@ -61,12 +58,10 @@ public synchronized void getBoardBy(String vid, String pid) {
         .makeConnection();
       int code = httpConnection.getResponseCode();
       if (code == 404) {
-        log.warn("Fail to get the Vid Pid information from the builder response code={}", code);
         return;
       }
       InputStream is = httpConnection.getInputStream();
       BoardCloudAPIid board = mapper.readValue(is, BoardCloudAPIid.class);
-      log.info("Board info from the cloud {}", board);
       // Launch a popup with a link to boardmanager#board.getName()
       // replace spaces with &
       String realBoardName = board.getName().replaceAll("\\(.*?\\)", "").trim();
@@ -76,8 +71,6 @@ public synchronized void getBoardBy(String vid, String pid) {
     } catch (Exception e) {
       // No connection no problem, fail silently
       //e.printStackTrace();
-      log.warn("Error during get board information by vid, pid", e);
-
     }
   }
 
diff --git a/build/shared/ArduinoSerialPlotterProtocol.md b/build/shared/ArduinoSerialPlotterProtocol.md
index 162c66d2f66..6888bb815bf 100644
--- a/build/shared/ArduinoSerialPlotterProtocol.md
+++ b/build/shared/ArduinoSerialPlotterProtocol.md
@@ -1,6 +1,6 @@
 # SerialPlotter protocol
 
-One message can consist of multiply parts.
+One message can consist of multiple parts.
 One part can consist of one label, one label and a value or only a value.
 
 |  |  | 
@@ -31,11 +31,11 @@ There is a special case, the CSV header style.
 |-------|----|---------|-----|---------|----|
 |Label 1| \t | Label 2 | ... | Label n | \n |  
 
-But in this format, labels consisting of only numbers are not recognised as labels.  
+Note that in this format, labels consisting of only numbers are not recognised as labels.  
 It is safer to just use the normal label only message.
 
 ## Value only messages Value
-This is not recommended if you using a board with USB to UART converter.
+This is not recommended if you use a board with USB to UART converter.
 Because when the label is sent, before you had the SerialPlotter opened, then the label/labels get/gets never set.
 
 |         |    |         |     |         |    |
@@ -73,7 +73,7 @@ The output looks like this
 ```
 ## Single Trace with label
 
-This example sends the label once in the setup routine. Afterwards only the value is send.
+This example sends the label once in the setup routine. Afterwards only the value is sent.
 
 ```ino
 void setup() {
@@ -100,7 +100,7 @@ Label 1:\n
 14\n
 ```
 
-## Single Trace with label send every time
+## Single Trace with label sent every time
 
 This example sends the label every time together with the value.
 
@@ -126,7 +126,7 @@ Label 1:12\n
 Label 1:13\n
 Label 1:14\n
 ```
-## Two Traces with label send every time
+## Two Traces with label sent every time
 
 This example sends two values together with the labels.
 
diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt
index b41e1b44f57..72807d6a70a 100644
--- a/build/shared/revisions.txt
+++ b/build/shared/revisions.txt
@@ -1,3 +1,11 @@
+ARDUINO 1.8.20 not yet released
+
+
+ARDUINO 1.8.19 2021.12.20 SECURITY HOTFIX RELEASE
+
+[ide]
+* Removed log4j from IDE. Fix CVE-2021-45105, CVE-2021-45046
+
 ARDUINO 1.8.18 2021.12.14 SECURITY HOTFIX RELEASE
 
 [ide]
diff --git a/build/windows/launcher/config.xml b/build/windows/launcher/config.xml
index bb4585f4b93..6ff7ebc57d0 100644
--- a/build/windows/launcher/config.xml
+++ b/build/windows/launcher/config.xml
@@ -43,8 +43,6 @@
     <cp>%EXEDIR%/lib/java-semver-0.8.0.jar</cp>
     <cp>%EXEDIR%/lib/jmdns-3.5.5.jar</cp>
     <cp>%EXEDIR%/lib/jtouchbar-1.0.0.jar</cp>
-    <cp>%EXEDIR%/lib/log4j-api-2.16.0.jar</cp>
-    <cp>%EXEDIR%/lib/log4j-core-2.16.0.jar</cp>
     <cp>%EXEDIR%/lib/slf4j-simple-1.7.22.jar</cp>
     <cp>%EXEDIR%/lib/slf4j-api-1.7.22.jar</cp>
     <cp>%EXEDIR%/lib/jna-4.2.2.jar</cp>
diff --git a/build/windows/launcher/config_debug.xml b/build/windows/launcher/config_debug.xml
index e19976e1be2..238f7b72458 100644
--- a/build/windows/launcher/config_debug.xml
+++ b/build/windows/launcher/config_debug.xml
@@ -43,8 +43,6 @@
     <cp>%EXEDIR%/lib/java-semver-0.8.0.jar</cp>
     <cp>%EXEDIR%/lib/jmdns-3.5.5.jar</cp>
     <cp>%EXEDIR%/lib/jtouchbar-1.0.0.jar</cp>
-    <cp>%EXEDIR%/lib/log4j-api-2.16.0.jar</cp>
-    <cp>%EXEDIR%/lib/log4j-core-2.16.0.jar</cp>
     <cp>%EXEDIR%/lib/slf4j-simple-1.7.22.jar</cp>
     <cp>%EXEDIR%/lib/slf4j-api-1.7.22.jar</cp>
     <cp>%EXEDIR%/lib/jna-4.2.2.jar</cp>