diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java
index 687fefd..21def18 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java
@@ -68,9 +68,6 @@
 	public static String CodeStyleMultiFix_ConvertSingleStatementInControlBodyToBlock_description;
 	public static String CodeStyleCleanUp_addDefaultSerialVersionId_description;
 
-	public static String CodeStyleCleanUp_AtomicObject_description;
-	public static String CodeStyleCleanUp_AtomicObject_declaration;
-	public static String CodeStyleCleanUp_AtomicObject_usage;
 	public static String CodeStyleCleanUp_PullUpAssignment_description;
 	public static String CodeStyleCleanUp_ElseIf_description;
 	public static String CodeStyleCleanUp_numberSuffix_description;
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties
index ffa52c2..e937936 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties
@@ -32,9 +32,6 @@
 
 CodeStyleMultiFix_ChangeIndirectAccessToStaticToDirect=Change indirect accesses to static members to direct accesses (accesses through subtypes)
 CodeStyleCleanUp_addDefaultSerialVersionId_description=Add missing serial version ID (default 1L)
-CodeStyleCleanUp_AtomicObject_description=Use atomic objects as reference
-CodeStyleCleanUp_AtomicObject_declaration=Use atomic objects declaration
-CodeStyleCleanUp_AtomicObject_usage=Use atomic objects usage
 CodeStyleCleanUp_PullUpAssignment_description=Pull up assignment
 CodeStyleCleanUp_ElseIf_description=Combine nested 'if' statement in 'else' block to 'else if'
 CodeStyleCleanUp_numberSuffix_description=Use uppercase for long literal suffix
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java
index d4f221a..466868a 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java
@@ -1617,18 +1617,6 @@
 	public static final String ADD_MISSING_SERIAL_VERSION_ID_DEFAULT= "cleanup.add_default_serial_version_id"; //$NON-NLS-1$
 
 	/**
-	 * Replace an array with one index by an atomic object.
-	 * <p>
-	 * Possible values: {TRUE, FALSE}
-	 * <p>
-	 *
-	 * @see CleanUpOptionsCore#TRUE
-	 * @see CleanUpOptionsCore#FALSE
-	 * @since 4.18
-	 */
-	public static final String ATOMIC_OBJECT= "cleanup.atomic_object"; //$NON-NLS-1$
-
-	/**
 	 * Moves assignments inside an if condition above the if node.
 	 * <p>
 	 * Possible values: {TRUE, FALSE}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d8.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d8.java
index 2f88e96..07dff2a 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d8.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d8.java
@@ -59,385 +59,6 @@
 	}
 
 	@Test
-	public void testUseAtomicObject() throws Exception {
-		IPackageFragment pack= fSourceFolder.createPackageFragment("test1", false, null);
-		String input= "" //
-				+ "package test1;\n" //
-				+ "\n" //
-				+ "import java.util.Date;\n" //
-				+ "import java.util.function.Supplier;\n" //
-				+ "\n" //
-				+ "public class E {\n" //
-				+ "    public static boolean useAtomicBoolean() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        boolean[] booleanRef= new boolean[1];\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> booleanRef[0] = true;\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return booleanRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static int useAtomicInteger() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        int[] intRef= new int[1];\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> intRef[0] = 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return intRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static long useAtomicLong() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        long[] longRef= new long[1];\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> longRef[0] = 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return longRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date useAtomicReference() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        Date[] dateRef= new Date[1];\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> dateRef[0] = new Date();\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return dateRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Long useAtomicLongObject() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        Long[] longRef = new Long[1];\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> longRef[0] = Long.valueOf(0);\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return longRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static boolean useInitializedAtomicBoolean() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        boolean[] booleanRef= new boolean[] {true};\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> booleanRef[0] = true;\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return booleanRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static String useNonInitializedAtomicString() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        String[] stringRef= new String[] {null};\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> stringRef[0] = \"foo\";\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return stringRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date useAtomicReferenceInAnonymousClass() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        Date[] dateRef= new Date[1];\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = new Runnable() {\n" //
-				+ "            @Override\n" //
-				+ "            public void run() {\n" //
-				+ "                dateRef[0] = new Date();\n" //
-				+ "            }\n" //
-				+ "        };\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return dateRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date useAtomicReferenceOnExtraDimension() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        Date dateRef[]= new Date[1];\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> dateRef[0] = new Date();\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return dateRef[0];\n" //
-				+ "    }\n" //
-				+ "}\n";
-		ICompilationUnit cu= pack.createCompilationUnit("E.java", input, false, null);
-
-		enable(CleanUpConstants.ATOMIC_OBJECT);
-
-		String output= "" //
-				+ "package test1;\n" //
-				+ "\n" //
-				+ "import java.util.Date;\n" //
-				+ "import java.util.concurrent.atomic.AtomicBoolean;\n" //
-				+ "import java.util.concurrent.atomic.AtomicInteger;\n" //
-				+ "import java.util.concurrent.atomic.AtomicLong;\n" //
-				+ "import java.util.concurrent.atomic.AtomicReference;\n" //
-				+ "import java.util.function.Supplier;\n" //
-				+ "\n" //
-				+ "public class E {\n" //
-				+ "    public static boolean useAtomicBoolean() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicBoolean booleanRef= new AtomicBoolean();\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> booleanRef.set(true);\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return booleanRef.get();\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static int useAtomicInteger() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicInteger intRef= new AtomicInteger();\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> intRef.set(42);\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return intRef.get();\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static long useAtomicLong() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicLong longRef= new AtomicLong();\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> longRef.set(42);\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return longRef.get();\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date useAtomicReference() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicReference<Date> dateRef= new AtomicReference<>();\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> dateRef.set(new Date());\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return dateRef.get();\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Long useAtomicLongObject() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicReference<Long> longRef = new AtomicReference<>();\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> longRef.set(Long.valueOf(0));\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return longRef.get();\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static boolean useInitializedAtomicBoolean() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicBoolean booleanRef= new AtomicBoolean(true);\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> booleanRef.set(true);\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return booleanRef.get();\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static String useNonInitializedAtomicString() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicReference<String> stringRef= new AtomicReference<>();\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> stringRef.set(\"foo\");\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return stringRef.get();\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date useAtomicReferenceInAnonymousClass() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicReference<Date> dateRef= new AtomicReference<>();\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = new Runnable() {\n" //
-				+ "            @Override\n" //
-				+ "            public void run() {\n" //
-				+ "                dateRef.set(new Date());\n" //
-				+ "            }\n" //
-				+ "        };\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return dateRef.get();\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date useAtomicReferenceOnExtraDimension() {\n" //
-				+ "        // Keep this comment\n" //
-				+ "        AtomicReference<Date> dateRef= new AtomicReference<>();\n" //
-				+ "        // Keep this comment also\n" //
-				+ "        Runnable runnable = () -> dateRef.set(new Date());\n" //
-				+ "        runnable.run();\n" //
-				+ "        // Keep this comment too\n" //
-				+ "        return dateRef.get();\n" //
-				+ "    }\n" //
-				+ "}\n";
-
-		assertGroupCategoryUsed(new ICompilationUnit[] { cu }, new HashSet<>(Arrays.asList(
-				MultiFixMessages.CodeStyleCleanUp_AtomicObject_usage+" "+2,
-				MultiFixMessages.CodeStyleCleanUp_AtomicObject_usage+" "+1,
-				MultiFixMessages.CodeStyleCleanUp_AtomicObject_declaration)));
-		assertRefactoringResultAsExpected(new ICompilationUnit[] { cu }, new String[] { output });
-	}
-
-	@Test
-	public void testDoNotUseAtomicObject() throws Exception {
-		IPackageFragment pack= fSourceFolder.createPackageFragment("test1", false, null);
-		String sample= "" //
-				+ "package test1;\n" //
-				+ "\n" //
-				+ "import java.util.Date;\n" //
-				+ "import java.util.function.Supplier;\n" //
-				+ "\n" //
-				+ "public class E {\n" //
-				+ "    public static int doNotRefactorIncrementalAssignment() {\n" //
-				+ "        int[] intRef= new int[1];\n" //
-				+ "        Runnable runnable = () -> intRef[0] += 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        return intRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static int doNotRefactorDecrementalAssignment() {\n" //
-				+ "        int[] numberRef= new int[1];\n" //
-				+ "        Runnable runnable = () -> numberRef[0] -= 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        return numberRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static short doNotRefactorShortArray() {\n" //
-				+ "        short[] shortRef= new short[1];\n" //
-				+ "        Runnable runnable = () -> shortRef[0] = 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        return shortRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static void doNotRefactorVoidArray() {\n" //
-				+ "        Date[] dateRef= new Date[] {};\n" //
-				+ "        Runnable runnable = () -> {\n" //
-				+ "            dateRef[0] = new Date();\n" //
-				+ "        };\n" //
-				+ "        System.out.println(dateRef[0]);\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static void doNotRefactorBadlyInitializedArray() {\n" //
-				+ "        Date[] dateReference= new Date[] {new Date(), new Date()};\n" //
-				+ "        Runnable runnable = () -> {\n" //
-				+ "            dateReference[0] = new Date();\n" //
-				+ "        };\n" //
-				+ "        System.out.println(dateReference[0]);\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date doNotTouchUnknownPurpose() {\n" //
-				+ "        Date[] dateRef= new Date[1];\n" //
-				+ "        dateRef[0] = new Date();\n" //
-				+ "        return dateRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static void doNotTouchUnknownPurposeInLambda() {\n" //
-				+ "        Runnable runnable = () -> {\n" //
-				+ "            Date[] dateRef= new Date[1];\n" //
-				+ "            dateRef[0] = new Date();\n" //
-				+ "            System.out.println(dateRef[0]);\n" //
-				+ "        };\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date doNotRefactorGreatArray() {\n" //
-				+ "        Date[] dateRef= new Date[2];\n" //
-				+ "        Runnable runnable = () -> dateRef[0] = new Date();\n" //
-				+ "        runnable.run();\n" //
-				+ "        return dateRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date doNotRefactorEmptyArray() {\n" //
-				+ "        Date[] dateRef= new Date[0];\n" //
-				+ "        Runnable runnable = () -> dateRef[0] = new Date();\n" //
-				+ "        runnable.run();\n" //
-				+ "        return dateRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date doNotRefactorWrongIndex() {\n" //
-				+ "        Date[] dateRef= new Date[1];\n" //
-				+ "        Runnable runnable = () -> dateRef[1] = new Date();\n" //
-				+ "        runnable.run();\n" //
-				+ "        return dateRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date doNotRefactorAnotherWrongIndex() {\n" //
-				+ "        Date[] dateRef= new Date[1];\n" //
-				+ "        Runnable runnable = () -> dateRef[0] = new Date();\n" //
-				+ "        runnable.run();\n" //
-				+ "        return dateRef[1];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date doNotRefactorSeveralDimensionArray() {\n" //
-				+ "        Date[][] dateRef= new Date[1][1];\n" //
-				+ "        Runnable runnable = () -> dateRef[0][0] = new Date();\n" //
-				+ "        runnable.run();\n" //
-				+ "        return dateRef[0][0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static Date[][] doNotRefactorSeveralDeclarations() {\n" //
-				+ "        Date[][] dateRef= new Date[1][1], iAmHereToo= null;\n" //
-				+ "        Runnable runnable = () -> dateRef[0][0] = new Date();\n" //
-				+ "        runnable.run();\n" //
-				+ "        System.out.println(dateRef[0]);\n" //
-				+ "        return iAmHereToo;\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static void doNotRefactorReturnedAssignment() {\n" //
-				+ "        Date[][] dateRef= new Date[1][1];\n" //
-				+ "        Supplier<Date> supplier = () -> dateRef[0][0] = new Date();\n" //
-				+ "        supplier.get();\n" //
-				+ "        System.out.println(dateRef[0]);\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static void doNotRefactorReadAssignment() {\n" //
-				+ "        Date[][] dateRef= new Date[1][1];\n" //
-				+ "        Runnable runnable = () -> {\n" //
-				+ "            if ((dateRef[0][0] = new Date()) != null)\n" //
-				+ "                System.out.println(\"Filled\");\n" //
-				+ "        };\n" //
-				+ "        runnable.run();\n" //
-				+ "        System.out.println(dateRef[0]);\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static int doNotRefactorIncrementalRead() {\n" //
-				+ "        int[] intRef= new int[1];\n" //
-				+ "        Runnable runnable = () -> intRef[0] = 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        return intRef[0]++;\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static int doNotRefactorDecrementalRead() {\n" //
-				+ "        int[] intRef= new int[1];\n" //
-				+ "        Runnable runnable = () -> intRef[0] = 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        return intRef[0]--;\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static int doNotRefactorPreincrementalRead() {\n" //
-				+ "        int[] intRef= new int[1];\n" //
-				+ "        Runnable runnable = () -> intRef[0] = 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        return ++intRef[0];\n" //
-				+ "    }\n" //
-				+ "\n" //
-				+ "    public static int doNotRefactorPredecrementalRead() {\n" //
-				+ "        int[] intRef= new int[1];\n" //
-				+ "        Runnable runnable = () -> intRef[0] = 42;\n" //
-				+ "        runnable.run();\n" //
-				+ "        return --intRef[0];\n" //
-				+ "    }\n" //
-				+ "}\n";
-		ICompilationUnit cu= pack.createCompilationUnit("E.java", sample, false, null);
-
-		enable(CleanUpConstants.ATOMIC_OBJECT);
-
-		assertRefactoringHasNoChange(new ICompilationUnit[] { cu });
-	}
-
-	@Test
 	public void testConvertToLambda01() throws Exception {
 		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
 		String sample= "" //
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstantsOptions.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstantsOptions.java
index 63b3900..35f5914 100644
--- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstantsOptions.java
+++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstantsOptions.java
@@ -61,7 +61,6 @@
 		options.setOption(EXPRESSIONS_USE_PARENTHESES_NEVER, CleanUpOptions.TRUE);
 		options.setOption(EXPRESSIONS_USE_PARENTHESES_ALWAYS, CleanUpOptions.FALSE);
 		options.setOption(CHECK_SIGN_OF_BITWISE_OPERATION, CleanUpOptions.FALSE);
-		options.setOption(ATOMIC_OBJECT, CleanUpOptions.FALSE);
 		options.setOption(PULL_UP_ASSIGNMENT, CleanUpOptions.FALSE);
 
 		options.setOption(ELSE_IF, CleanUpOptions.FALSE);
@@ -202,7 +201,6 @@
 		options.setOption(EXPRESSIONS_USE_PARENTHESES_NEVER, CleanUpOptions.TRUE);
 		options.setOption(EXPRESSIONS_USE_PARENTHESES_ALWAYS, CleanUpOptions.FALSE);
 		options.setOption(CHECK_SIGN_OF_BITWISE_OPERATION, CleanUpOptions.FALSE);
-		options.setOption(ATOMIC_OBJECT, CleanUpOptions.FALSE);
 		options.setOption(PULL_UP_ASSIGNMENT, CleanUpOptions.FALSE);
 
 		options.setOption(ELSE_IF, CleanUpOptions.FALSE);
diff --git a/org.eclipse.jdt.ui/plugin.xml b/org.eclipse.jdt.ui/plugin.xml
index a778c7d..24c0632 100644
--- a/org.eclipse.jdt.ui/plugin.xml
+++ b/org.eclipse.jdt.ui/plugin.xml
@@ -7097,14 +7097,9 @@
             runAfter="org.eclipse.jdt.ui.cleanup.lambda_and_method_ref">
       </cleanUp>
       <cleanUp
-            class="org.eclipse.jdt.internal.ui.fix.AtomicObjectCleanUp"
-            id="org.eclipse.jdt.ui.cleanup.atomic_object"
-            runAfter="org.eclipse.jdt.ui.cleanup.bitwise_conditional_expression">
-      </cleanUp>
-      <cleanUp
             class="org.eclipse.jdt.internal.ui.fix.PullUpAssignmentCleanUp"
             id="org.eclipse.jdt.ui.cleanup.pull_up_assignment"
-            runAfter="org.eclipse.jdt.ui.cleanup.atomic_object">
+            runAfter="org.eclipse.jdt.ui.cleanup.bitwise_conditional_expression">
       </cleanUp>
       <cleanUp
             class="org.eclipse.jdt.internal.ui.fix.NumberSuffixCleanUp"
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/AtomicObjectCleanUp.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/AtomicObjectCleanUp.java
deleted file mode 100644
index abd8190..0000000
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/AtomicObjectCleanUp.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2020 Fabrice TIERCELIN and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *     Fabrice TIERCELIN - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.internal.ui.fix;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.text.edits.TextEditGroup;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.ASTVisitor;
-import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
-import org.eclipse.jdt.core.dom.ArrayAccess;
-import org.eclipse.jdt.core.dom.ArrayCreation;
-import org.eclipse.jdt.core.dom.Assignment;
-import org.eclipse.jdt.core.dom.Block;
-import org.eclipse.jdt.core.dom.ClassInstanceCreation;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.ExpressionStatement;
-import org.eclipse.jdt.core.dom.ITypeBinding;
-import org.eclipse.jdt.core.dom.IVariableBinding;
-import org.eclipse.jdt.core.dom.LambdaExpression;
-import org.eclipse.jdt.core.dom.MethodInvocation;
-import org.eclipse.jdt.core.dom.NullLiteral;
-import org.eclipse.jdt.core.dom.ParameterizedType;
-import org.eclipse.jdt.core.dom.PostfixExpression;
-import org.eclipse.jdt.core.dom.PrefixExpression;
-import org.eclipse.jdt.core.dom.SimpleName;
-import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
-import org.eclipse.jdt.core.dom.Type;
-import org.eclipse.jdt.core.dom.VariableDeclarationExpression;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
-import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
-import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory;
-import org.eclipse.jdt.internal.corext.dom.ASTNodes;
-import org.eclipse.jdt.internal.corext.fix.CleanUpConstants;
-import org.eclipse.jdt.internal.corext.fix.CompilationUnitRewriteOperationsFix;
-import org.eclipse.jdt.internal.corext.fix.CompilationUnitRewriteOperationsFix.CompilationUnitRewriteOperation;
-import org.eclipse.jdt.internal.corext.fix.LinkedProposalModel;
-import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-
-import org.eclipse.jdt.ui.cleanup.CleanUpRequirements;
-import org.eclipse.jdt.ui.cleanup.ICleanUpFix;
-import org.eclipse.jdt.ui.text.java.IProblemLocation;
-
-/**
- * A fix that replaces an array with one index by an atomic object.
- */
-public class AtomicObjectCleanUp extends AbstractMultiFix {
-	public AtomicObjectCleanUp() {
-		this(Collections.emptyMap());
-	}
-
-	public AtomicObjectCleanUp(Map<String, String> options) {
-		super(options);
-	}
-
-	@Override
-	public CleanUpRequirements getRequirements() {
-		boolean requireAST= isEnabled(CleanUpConstants.ATOMIC_OBJECT);
-		return new CleanUpRequirements(requireAST, false, false, null);
-	}
-
-	@Override
-	public String[] getStepDescriptions() {
-		if (isEnabled(CleanUpConstants.ATOMIC_OBJECT)) {
-			return new String[] { MultiFixMessages.CodeStyleCleanUp_AtomicObject_description };
-		}
-
-		return new String[0];
-	}
-
-	@Override
-	public String getPreview() {
-		if (isEnabled(CleanUpConstants.ATOMIC_OBJECT)) {
-			return "AtomicBoolean booleanRef= new AtomicBoolean();\n" //$NON-NLS-1$
-					+ "Runnable runnable = () -> booleanRef.set(true);\n" //$NON-NLS-1$
-					+ "runnable.run();\n" //$NON-NLS-1$
-					+ "boolean b = booleanRef.get();\n"; //$NON-NLS-1$
-		}
-
-		return "boolean[] booleanRef= new boolean[1];\n" //$NON-NLS-1$
-				+ "Runnable runnable = () -> booleanRef[0] = true;\n" //$NON-NLS-1$
-				+ "runnable.run();\n" //$NON-NLS-1$
-				+ "boolean b = booleanRef[0];\n"; //$NON-NLS-1$
-	}
-
-	@Override
-	protected ICleanUpFix createFix(CompilationUnit unit) throws CoreException {
-		if (!isEnabled(CleanUpConstants.ATOMIC_OBJECT) || !JavaModelUtil.is50OrHigher(unit.getJavaElement().getJavaProject())) {
-			return null;
-		}
-
-		final List<CompilationUnitRewriteOperation> rewriteOperations= new ArrayList<>();
-
-		unit.accept(new ASTVisitor() {
-			@Override
-			public boolean visit(final Block node) {
-				ArrayOccurrencesVisitor arrayOccurrencesVisitor= new ArrayOccurrencesVisitor(node);
-				node.accept(arrayOccurrencesVisitor);
-				return arrayOccurrencesVisitor.result;
-			}
-
-			final class ArrayOccurrencesVisitor extends ASTVisitor {
-				private final Block startNode;
-				private boolean result= true;
-
-				public ArrayOccurrencesVisitor(final Block startNode) {
-					this.startNode= startNode;
-				}
-
-				@Override
-				public boolean visit(final Block node) {
-					return startNode == node;
-				}
-
-				@Override
-				public boolean visit(final VariableDeclarationStatement node) {
-					if (node.fragments().size() != 1) {
-						return true;
-					}
-
-					VariableDeclarationFragment fragment= (VariableDeclarationFragment) node.fragments().get(0);
-					return visitVariable(node.getType(), fragment.resolveBinding(), fragment.extraDimensions(), fragment.getName(), fragment.getInitializer());
-				}
-
-				@Override
-				public boolean visit(final VariableDeclarationExpression node) {
-					if (node.fragments().size() != 1) {
-						return true;
-					}
-
-					VariableDeclarationFragment fragment= (VariableDeclarationFragment) node.fragments().get(0);
-					return visitVariable(node.getType(), fragment.resolveBinding(), fragment.extraDimensions(), fragment.getName(), fragment.getInitializer());
-				}
-
-				@Override
-				public boolean visit(final SingleVariableDeclaration node) {
-					return visitVariable(node.getType(), node.resolveBinding(), node.extraDimensions(), node.getName(), node.getInitializer());
-				}
-
-				private boolean visitVariable(final Type type, final IVariableBinding variableBinding, final List<?> variableDimensions, final SimpleName declaration, final Expression initializer) {
-					ArrayCreation arrayCreation= ASTNodes.as(initializer, ArrayCreation.class);
-
-					if (result
-							&& arrayCreation != null
-							&& (arrayCreation.getInitializer() != null
-									? arrayCreation.getInitializer().expressions().size() == 1
-									: arrayCreation.dimensions().size() == 1 && Long.valueOf(1L).equals(ASTNodes.getIntegerLiteral((Expression) arrayCreation.dimensions().get(0))))
-							&& type != null
-							&& type.resolveBinding() != null
-							&& (type.resolveBinding().isArray()
-									? variableDimensions.isEmpty() && type.resolveBinding().getDimensions() == 1 && equalNotNull(type.resolveBinding().getElementType(), arrayCreation.getType().getElementType().resolveBinding())
-											: variableDimensions.size() == 1 && equalNotNull(type.resolveBinding(), arrayCreation.getType().getElementType().resolveBinding()))
-							&& !ASTNodes.hasType(arrayCreation.getType().getElementType().resolveBinding(),
-									double.class.getCanonicalName(),
-									float.class.getCanonicalName(),
-									short.class.getCanonicalName(),
-									char.class.getCanonicalName(),
-									byte.class.getCanonicalName())) {
-						VarDefinitionsUsesVisitor varOccurrencesVisitor= new VarDefinitionsUsesVisitor(variableBinding,
-						startNode, true);
-
-						List<SimpleName> reads= varOccurrencesVisitor.getReads();
-						List<SimpleName> writes= varOccurrencesVisitor.getWrites();
-						writes.remove(declaration);
-
-						if (writes.isEmpty()) {
-							Set<Assignment> assignmentReads= new HashSet<>();
-							Set<ArrayAccess> accessReads= new HashSet<>();
-
-							for (SimpleName simpleName : reads) {
-								if (!isReadValid(simpleName, assignmentReads, accessReads)) {
-									return true;
-								}
-							}
-
-							boolean hasOneWriteInDynamicCode= false;
-
-							for (Assignment assignmentRead : assignmentReads) {
-								ASTNode dynamicCode= ASTNodes.getFirstAncestorOrNull(assignmentRead, LambdaExpression.class, AnonymousClassDeclaration.class);
-
-								if (dynamicCode != null && ASTNodes.isParent(dynamicCode, startNode)) {
-									hasOneWriteInDynamicCode= true;
-									break;
-								}
-							}
-
-							if (hasOneWriteInDynamicCode) {
-								rewriteOperations.add(new AtomicObjectOperation(type, variableDimensions, arrayCreation, assignmentReads, accessReads));
-
-								result= false;
-								return false;
-							}
-						}
-					}
-
-					return true;
-				}
-
-				private boolean equalNotNull(ITypeBinding elementType, ITypeBinding resolveBinding) {
-					return elementType != null && Objects.equals(elementType, resolveBinding);
-				}
-
-				private boolean isReadValid(final SimpleName simpleName, final Set<Assignment> assignmentReads, final Set<ArrayAccess> accessReads) {
-					if (simpleName.getParent() instanceof ArrayAccess
-							&& simpleName.getLocationInParent() == ArrayAccess.ARRAY_PROPERTY) {
-						ArrayAccess arrayAccess= (ArrayAccess) simpleName.getParent();
-
-						if (Long.valueOf(0L).equals(ASTNodes.getIntegerLiteral(arrayAccess.getIndex()))) {
-							if (arrayAccess.getParent() instanceof Assignment
-									&& arrayAccess.getLocationInParent() == Assignment.LEFT_HAND_SIDE_PROPERTY) {
-								Assignment assignment= (Assignment) arrayAccess.getParent();
-
-								if (ASTNodes.hasOperator(assignment, Assignment.Operator.ASSIGN)
-										&& (assignment.getParent() instanceof ExpressionStatement
-										|| assignment.getParent() instanceof LambdaExpression && assignment.getLocationInParent() == LambdaExpression.BODY_PROPERTY)) {
-									assignmentReads.add(assignment);
-									return true;
-								}
-							} else if ((!(arrayAccess.getParent() instanceof PrefixExpression)
-									|| !ASTNodes.hasOperator((PrefixExpression) arrayAccess.getParent(), PrefixExpression.Operator.INCREMENT, PrefixExpression.Operator.DECREMENT))
-									&& (!(arrayAccess.getParent() instanceof PostfixExpression)
-											|| !ASTNodes.hasOperator((PostfixExpression) arrayAccess.getParent(), PostfixExpression.Operator.INCREMENT, PostfixExpression.Operator.DECREMENT))) {
-								accessReads.add(arrayAccess);
-								return true;
-							}
-						}
-					}
-
-					return false;
-				}
-			}
-		});
-
-		if (rewriteOperations.isEmpty()) {
-			return null;
-		}
-
-		return new CompilationUnitRewriteOperationsFix(MultiFixMessages.CodeStyleCleanUp_AtomicObject_description, unit,
-				rewriteOperations.toArray(new CompilationUnitRewriteOperation[0]));
-	}
-
-	@Override
-	public boolean canFix(final ICompilationUnit compilationUnit, final IProblemLocation problem) {
-		return false;
-	}
-
-	@Override
-	protected ICleanUpFix createFix(final CompilationUnit unit, final IProblemLocation[] problems) throws CoreException {
-		return null;
-	}
-
-	private static class AtomicObjectOperation extends CompilationUnitRewriteOperation {
-		private final Type type;
-		private final List<?> variableDimensions;
-		private final ArrayCreation arrayCreation;
-		private final Set<Assignment> assignmentReads;
-		private final Set<ArrayAccess> accessReads;
-
-		public AtomicObjectOperation(final Type type, final List<?> variableDimensions, final ArrayCreation arrayCreation, final Set<Assignment> assignmentReads, final Set<ArrayAccess> accessReads) {
-			this.type= type;
-			this.variableDimensions= variableDimensions;
-			this.arrayCreation= arrayCreation;
-			this.assignmentReads= assignmentReads;
-			this.accessReads= accessReads;
-		}
-
-		@Override
-		public void rewriteAST(final CompilationUnitRewrite cuRewrite, final LinkedProposalModel linkedModel) throws CoreException {
-			ASTRewrite rewrite= cuRewrite.getASTRewrite();
-			AST ast= cuRewrite.getRoot().getAST();
-			ImportRewrite importRewrite= cuRewrite.getImportRewrite();
-			TextEditGroup groupdeclaration= createTextEditGroup(MultiFixMessages.CodeStyleCleanUp_AtomicObject_declaration, cuRewrite);
-
-			Class<?> atomicClass;
-			Type objectClass= null;
-			if (ASTNodes.hasType(arrayCreation.getType().getElementType().resolveBinding(), boolean.class.getCanonicalName())) {
-				atomicClass= AtomicBoolean.class;
-			} else if (ASTNodes.hasType(arrayCreation.getType().getElementType().resolveBinding(), int.class.getCanonicalName())) {
-				atomicClass= AtomicInteger.class;
-			} else if (ASTNodes.hasType(arrayCreation.getType().getElementType().resolveBinding(), long.class.getCanonicalName())) {
-				atomicClass= AtomicLong.class;
-			} else {
-				atomicClass= AtomicReference.class;
-				objectClass= arrayCreation.getType().getElementType();
-			}
-
-			String atomicClassNameText= importRewrite.addImport(atomicClass.getCanonicalName());
-			Type atomicInstance= ast.newSimpleType(ASTNodeFactory.newName(ast, atomicClassNameText));
-
-			if (objectClass != null) {
-				ParameterizedType newParameterizedType= ast.newParameterizedType(atomicInstance);
-
-				if (!JavaModelUtil.is1d7OrHigher(((CompilationUnit) type.getRoot()).getJavaElement().getJavaProject())) {
-					newParameterizedType.typeArguments().add(rewrite.createCopyTarget(objectClass));
-				}
-
-				atomicInstance= newParameterizedType;
-			}
-
-			ClassInstanceCreation newAtomicObject= ast.newClassInstanceCreation();
-			newAtomicObject.setType(atomicInstance);
-
-			if (arrayCreation.getInitializer() != null
-					&& !ASTNodes.is((Expression) arrayCreation.getInitializer().expressions().get(0), NullLiteral.class)) {
-				List<Expression> arguments= newAtomicObject.arguments();
-				arguments.add(ASTNodes.createMoveTarget(rewrite, (Expression) arrayCreation.getInitializer().expressions().get(0)));
-			}
-
-			ASTNodes.replaceButKeepComment(rewrite, arrayCreation, newAtomicObject, groupdeclaration);
-
-			for (Object variableDimension : variableDimensions) {
-				rewrite.remove((ASTNode) variableDimension, groupdeclaration);
-			}
-
-			Type atomicType= ast.newSimpleType(ASTNodeFactory.newName(ast, atomicClassNameText));
-
-			if (objectClass != null) {
-				ParameterizedType newParameterizedType= ast.newParameterizedType(atomicType);
-				newParameterizedType.typeArguments().add(rewrite.createCopyTarget(objectClass));
-				atomicInstance= newParameterizedType;
-			}
-
-			ASTNodes.replaceButKeepComment(rewrite, type, atomicInstance, groupdeclaration);
-
-			int i=1;
-			for (ArrayAccess accessRead : accessReads) {
-				MethodInvocation newMethodInvocation= ast.newMethodInvocation();
-				newMethodInvocation.setExpression(ASTNodes.createMoveTarget(rewrite, accessRead.getArray()));
-				newMethodInvocation.setName(ast.newSimpleName("get")); //$NON-NLS-1$
-				TextEditGroup groupusage= createTextEditGroup(MultiFixMessages.CodeStyleCleanUp_AtomicObject_usage+" "+Integer.toString(i++), cuRewrite); //$NON-NLS-1$
-				ASTNodes.replaceButKeepComment(rewrite, accessRead, newMethodInvocation, groupusage);
-			}
-
-			for (Assignment assignmentRead : assignmentReads) {
-				MethodInvocation newMethodInvocation= ast.newMethodInvocation();
-				newMethodInvocation.setExpression(ASTNodes.createMoveTarget(rewrite, ((ArrayAccess) assignmentRead.getLeftHandSide()).getArray()));
-				newMethodInvocation.setName(ast.newSimpleName("set")); //$NON-NLS-1$
-				newMethodInvocation.arguments().add(ASTNodes.createMoveTarget(rewrite, assignmentRead.getRightHandSide()));
-				TextEditGroup groupusage= createTextEditGroup(MultiFixMessages.CodeStyleCleanUp_AtomicObject_usage+" "+Integer.toString(i++), cuRewrite); //$NON-NLS-1$
-				ASTNodes.replaceButKeepComment(rewrite, assignmentRead, newMethodInvocation, groupusage);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.java
index 4fe82cc..1c19cfb 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.java
@@ -67,7 +67,6 @@
 
 	public static String CodeStyleTabPage_GroupName_Expressions;
 	public static String CodeStyleTabPage_CheckboxName_CheckSignOfBitwiseOperation;
-	public static String CodeStyleTabPage_CheckboxName_AtomicObject;
 	public static String CodeStyleTabPage_CheckboxName_PullUpAssignment;
 	public static String CodeStyleTabPage_CheckboxName_ElseIf;
 
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.properties
index bc4e9a6..5fee04e 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.properties
@@ -41,7 +41,6 @@
 CodeStyleTabPage_CheckboxName_ElseIf=C&ombine nested 'if' statement in 'else' block to 'else if'
 CodeStyleTabPage_GroupName_Expressions=Expressions
 CodeStyleTabPage_CheckboxName_CheckSignOfBitwiseOperation=&Compare with != 0 for bitwise expressions (use it carefully, it may alter the behavior)
-CodeStyleTabPage_CheckboxName_AtomicObject=Use atomic objects as reference (1.5 or higher)
 CodeStyleTabPage_CheckboxName_PullUpAssignment=Pull up assignment
 CodeStyleTabPage_GroupName_NumberLiteral=Number literals
 CodeStyleTabPage_CheckboxName_NumberSuffix=Use &uppercase for long literal suffix
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CodeStyleTabPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CodeStyleTabPage.java
index 577df74..7b4ed2e 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CodeStyleTabPage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CodeStyleTabPage.java
@@ -22,7 +22,6 @@
 
 import org.eclipse.jdt.internal.ui.fix.AbstractCleanUp;
 import org.eclipse.jdt.internal.ui.fix.AddAllCleanUp;
-import org.eclipse.jdt.internal.ui.fix.AtomicObjectCleanUp;
 import org.eclipse.jdt.internal.ui.fix.BitwiseConditionalExpressionCleanup;
 import org.eclipse.jdt.internal.ui.fix.ControlStatementsCleanUp;
 import org.eclipse.jdt.internal.ui.fix.ConvertLoopCleanUp;
@@ -51,7 +50,6 @@
 				new ElseIfCleanUp(values),
 				new ExpressionsCleanUp(values),
 				new BitwiseConditionalExpressionCleanup(values),
-				new AtomicObjectCleanUp(values),
 				new PullUpAssignmentCleanUp(values),
 				new NumberSuffixCleanUp(values),
 				new VariableDeclarationCleanUp(values),
@@ -104,9 +102,6 @@
 		final CheckboxPreference bitwiseComparison= createCheckboxPref(expressionsGroup, numColumns, CleanUpMessages.CodeStyleTabPage_CheckboxName_CheckSignOfBitwiseOperation, CleanUpConstants.CHECK_SIGN_OF_BITWISE_OPERATION, CleanUpModifyDialog.FALSE_TRUE);
 		registerPreference(bitwiseComparison);
 
-		final CheckboxPreference atomicObject= createCheckboxPref(expressionsGroup, numColumns, CleanUpMessages.CodeStyleTabPage_CheckboxName_AtomicObject, CleanUpConstants.ATOMIC_OBJECT, CleanUpModifyDialog.FALSE_TRUE);
-		registerPreference(atomicObject);
-
 		final CheckboxPreference pullUpAssignmentPref= createCheckboxPref(expressionsGroup, numColumns, CleanUpMessages.CodeStyleTabPage_CheckboxName_PullUpAssignment, CleanUpConstants.PULL_UP_ASSIGNMENT, CleanUpModifyDialog.FALSE_TRUE);
 		registerPreference(pullUpAssignmentPref);
 
