diff --git a/Jenkinsfile b/Jenkinsfile
index 37c8800f9242c5f5fa722e3a3a90cb70471ac4e6..b2fc6b9eee5b5d2243e124664eaeffbd12a41402 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -30,8 +30,7 @@ def builds = [
       name: 'Main',
       profiles: 'legacy,integration-tests,snapshot',
       properties:
-        '-Dxwiki.checkstyle.skip=true -Dxwiki.surefire.captureconsole.skip=true -Dxwiki.revapi.skip=true -DskipITs',
-      daysToKeepStr: env.BRANCH_NAME == 'master' ? '30' : null
+        '-Dxwiki.checkstyle.skip=true -Dxwiki.surefire.captureconsole.skip=true -Dxwiki.revapi.skip=true -DskipITs'
     )
   },
   // Can be used to manually trigger the main build with integration tests on the CI.
@@ -40,8 +39,7 @@ def builds = [
       name: 'Main with Integration Tests',
       profiles: 'legacy,integration-tests,snapshot',
       properties:
-        '-Dxwiki.checkstyle.skip=true -Dxwiki.surefire.captureconsole.skip=true -Dxwiki.revapi.skip=true',
-      daysToKeepStr: env.BRANCH_NAME == 'master' ? '30' : null
+        '-Dxwiki.checkstyle.skip=true -Dxwiki.surefire.captureconsole.skip=true -Dxwiki.revapi.skip=true'
     )
   },
   'Distribution' : {
@@ -68,7 +66,6 @@ def builds = [
     buildFunctionalTest(
       name: 'Flavor Test - UI',
       pom: 'xwiki-platform-distribution-flavor-test-ui/pom.xml',
-      daysToKeepStr: env.BRANCH_NAME == 'master' ? '30' : null
     )
   },
   'Flavor Test - Misc' : {
@@ -124,7 +121,7 @@ def builds = [
       goals: 'clean install jacoco:report sonar:sonar',
       profiles: 'quality,legacy,coverage',
       properties: '-Dxwiki.jacoco.itDestFile=`pwd`/target/jacoco-it.exec',
-      sonar: true,
+      sonar: true
     )
   }
 ]
@@ -353,9 +350,9 @@ private void buildInsideNode(map)
       if (map.properties != null) {
         properties = map.properties
       }
-      if (map.daysToKeepStr != null) {
-        daysToKeepStr = map.daysToKeepStr
-      }
+      // Keep builds for 30 days since we want to be able to see all builds if there are a lot at a given time, to be
+      // able to identify flickers, etc.
+      daysToKeepStr = '30'
       if (map.pom != null) {
         pom = map.pom
       }
diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/pom.xml b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/pom.xml
index 8be6ef5a2066873fe10804e170617a92096446b5..e7abaa11b0e004eb3eecc2f43e7fddafc0054e8e 100644
--- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/pom.xml
+++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/pom.xml
@@ -90,7 +90,6 @@
   <build>
     <plugins>
       <plugin>
-        <!-- Apply the Checkstyle configurations defined in the top level pom.xml file -->
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-checkstyle-plugin</artifactId>
         <executions>
@@ -98,9 +97,7 @@
             <!-- Specify the "default" execution id so that the "blocker" one is always executed -->
             <id>default</id>
             <configuration>
-              <excludes>
-                org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java
-              </excludes>
+              <suppressionsLocation>${basedir}/src/main/checkstyle/checkstyle-suppressions.xml</suppressionsLocation>
             </configuration>
           </execution>
         </executions>
diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/checkstyle/checkstyle-suppressions.xml b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/checkstyle/checkstyle-suppressions.xml
new file mode 100644
index 0000000000000000000000000000000000000000..418a246423ac2c473d45823ea9c9c133a153e422
--- /dev/null
+++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/checkstyle/checkstyle-suppressions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+-->
+
+<!DOCTYPE suppressions PUBLIC
+    "-//Puppy Crawl//DTD Suppressions 1.0//EN"
+    "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
+
+<suppressions>
+  <suppress checks="ClassFanOutComplexity" files="DefaultOfficeResourceViewer.java"/>
+</suppressions>
diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java
index 2ac69c690d0c033940530a874c7ea5f401e1a7d7..f91a227cfd0f79aea2734831e010e95076ae4dc5 100644
--- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java
+++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java
@@ -191,17 +191,15 @@ public class DefaultOfficeResourceViewer implements OfficeResourceViewer, Initia
      * @param artifactFiles specify which of the image blocks should be processed; only the image blocks
      *          that were generated during the office import process should be processed
      * @param ownerDocumentReference specifies the document that owns the office file
-     * @param resourceReference a reference to the office file that is being viewed; this reference is used to compute
-     *            the path to the temporary directory holding the image artifacts
      * @param parameters the build parameters. Note that currently only {@code filterStyles} is supported and if "true"
      *            it means that styles will be filtered to the maximum and the focus will be put on importing only the
      * @return the set of temporary files corresponding to image artifacts
      */
     private Set<File> processImages(XDOM xdom, Set<File> artifactFiles, DocumentReference ownerDocumentReference,
-        String resourceReference, Map<String, ?> parameters)
+        Map<String, ?> parameters)
     {
         // Process all image blocks.
-        Set<File> temporaryFiles = new HashSet<File>();
+        Set<File> temporaryFiles = new HashSet<>();
         List<ImageBlock> imgBlocks = xdom.getBlocks(new ClassBlockMatcher(ImageBlock.class), Block.Axes.DESCENDANT);
         if (!imgBlocks.isEmpty()) {
             Map<String, File> fileMap = new HashMap<>();
@@ -238,8 +236,9 @@ private Set<File> processImages(XDOM xdom, Set<File> artifactFiles, DocumentRefe
                         Block newImgBlock = new ImageBlock(urlImageReference, false, imgBlock.getParameters());
                         imgBlock.getParent().replaceChild(Arrays.asList(newImgBlock), imgBlock);
 
-                        // Make sure the new image block is not inside an ExpandedMacroBlock whose's content syntax doesn't
-                        // support relative path resource references (we use relative paths to refer the temporary files).
+                        // Make sure the new image block is not inside an ExpandedMacroBlock whose's content syntax
+                        // doesn't support relative path resource references (we use relative paths to refer the
+                        // temporary files).
                         maybeFixExpandedMacroAncestor(newImgBlock);
 
                         // Collect the temporary file so that it can be cleaned up when the view is disposed from cache.
@@ -261,7 +260,7 @@ private void maybeFixExpandedMacroAncestor(Block block)
         if (expandedMacro != null) {
             Block parent = expandedMacro.getParent();
             if (!(parent instanceof MetaDataBlock) || !((MetaDataBlock) parent).getMetaData().contains(MODULE_NAME)) {
-                MetaDataBlock metaData = new MetaDataBlock(Collections.<Block>emptyList());
+                MetaDataBlock metaData = new MetaDataBlock(Collections.emptyList());
                 // Use a syntax that supports relative path resource references (we use relative paths to include the
                 // temporary files).
                 metaData.getMetaData().addMetaData(MetaData.SYNTAX, Syntax.XWIKI_2_1);
@@ -378,8 +377,9 @@ private OfficeDocumentView getView(ResourceReference reference, AttachmentRefere
 
         // It's possible that the attachment has been deleted. We need to catch such events and cleanup the cache.
         DocumentReference documentReference = attachmentReference.getDocumentReference();
-        if (!this.documentAccessBridge.getAttachmentReferences(documentReference).contains(attachmentReference) &&
-            !uploadedAttachment.isPresent()) {
+        if (!this.documentAccessBridge.getAttachmentReferences(documentReference).contains(attachmentReference)
+            && !uploadedAttachment.isPresent())
+        {
             // If a cached view exists, flush it.
             if (view != null) {
                 this.attachmentCache.remove(cacheKey);
@@ -403,12 +403,12 @@ private OfficeDocumentView getView(ResourceReference reference, AttachmentRefere
                     attachmentVersion = "temp";
                 }
                 XDOM xdom = xdomOfficeDocument.getContentDocument();
-                // We use only the file name from the resource reference because the rest of the information is specified by
-                // the owner document reference. This way we ensure the path to the temporary files doesn't contain
-                // redundant information and so it remains as small as possible (considering that the path length is limited
-                // on some environments).
+                // We use only the file name from the resource reference because the rest of the information is
+                // specified by the owner document reference. This way we ensure the path to the temporary files
+                // doesn't contain redundant information and so it remains as small as possible (considering that the
+                // path length is limited on some environments).
                 Set<File> temporaryFiles = processImages(xdom, xdomOfficeDocument.getArtifactsFiles(),
-                    attachmentReference.getDocumentReference(), attachmentReference.getName(), parameters);
+                    attachmentReference.getDocumentReference(), parameters);
                 view = new AttachmentOfficeDocumentView(reference, attachmentReference, attachmentVersion, xdom,
                     temporaryFiles);
 
@@ -436,7 +436,7 @@ private OfficeDocumentView getView(ResourceReference resourceReference, Map<Stri
             {
                 XDOM xdom = xdomOfficeDocument.getContentDocument();
                 Set<File> temporaryFiles = processImages(xdom, xdomOfficeDocument.getArtifactsFiles(), ownerDocument,
-                    serializedResourceReference, parameters);
+                    parameters);
                 view = new OfficeDocumentView(resourceReference, xdom, temporaryFiles);
 
                 this.externalCache.set(cacheKey, view);