diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullAnnotationsCleanUp.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullAnnotationsCleanUp.java
index c24e171..056b0bc 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullAnnotationsCleanUp.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullAnnotationsCleanUp.java
@@ -83,6 +83,9 @@
 		// TODO(SH): might set depending on this.handledProblemID, not sure about the benefit
 		result.put(JavaCore.COMPILER_PB_NULL_SPECIFICATION_VIOLATION, JavaCore.WARNING);
 		result.put(JavaCore.COMPILER_PB_REDUNDANT_NULL_CHECK, JavaCore.WARNING);
+		result.put(JavaCore.COMPILER_PB_NULL_ANNOTATION_INFERENCE_CONFLICT, JavaCore.WARNING);
+		result.put(JavaCore.COMPILER_PB_NULL_UNCHECKED_CONVERSION, JavaCore.WARNING);
+		result.put(JavaCore.COMPILER_PB_MISSING_NONNULL_BY_DEFAULT_ANNOTATION, JavaCore.WARNING);
 		return result;
 	}
 
@@ -124,14 +127,12 @@
 	 */
 	public boolean canFix(ICompilationUnit compilationUnit, IProblemLocation problem) {
 		int id= problem.getProblemId();
-
 		if (id == this.handledProblemID) {
 			// FIXME search specifically: return param (which??)
 //			if (QuickFixes.hasExplicitNullnessAnnotation(compilationUnit, problem.getOffset()))
 //				return false;
 			return true;
 		}
-
 		return false;
 	}
 
@@ -142,7 +143,6 @@
 	@Override
 	public int computeNumberOfFixes(CompilationUnit compilationUnit) {
 		int result= 0;
-
 		IProblem[] problems= compilationUnit.getProblems();
 		for (int i= 0; i < problems.length; i++) {
 			int id= problems[i].getID();
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.java
index 3fd05d4..75d4c0b 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.java
@@ -21,10 +21,10 @@
 	public static String NullAnnotationsCleanUp_add_nonnull_annotation;
 	
 	public static String QuickFixes_add_annotation_change_name;
-	public static String QuickFixes_declare_method_parameter_nullness;
-	public static String QuickFixes_declare_method_return_nullness;
-	public static String QuickFixes_declare_overridden_parameter_as_nonnull;
-	public static String QuickFixes_declare_overridden_return_as_nullable;
+	public static String QuickFixes_change_method_parameter_nullness;
+	public static String QuickFixes_change_method_return_nullness;
+	public static String QuickFixes_change_overridden_parameter_nullness;
+	public static String QuickFixes_change_overridden_return_nullness;
 
 	static {
 		// initialize resource bundle
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.properties
index 172c9cb..1e48568 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.properties
@@ -12,7 +12,7 @@
 NullAnnotationsCleanUp_add_nullable_annotation=Add missing @Nullable annotation
 NullAnnotationsCleanUp_add_nonnull_annotation=Add missing @NonNull annotation
 QuickFixes_add_annotation_change_name=Add Annotations
-QuickFixes_declare_method_parameter_nullness=Declare method parameter as @{0}
-QuickFixes_declare_method_return_nullness=Declare method return as @{0}
-QuickFixes_declare_overridden_parameter_as_nonnull=Adjust overridden method from {1}, mark parameter as @{0}
-QuickFixes_declare_overridden_return_as_nullable=Adjust overridden method from {1}, mark as returning @{0}
+QuickFixes_change_method_parameter_nullness=Change parameter type to ''@{0}''
+QuickFixes_change_method_return_nullness=Change return type of ''{0}(..)'' to ''@{1}''
+QuickFixes_change_overridden_parameter_nullness=Change parameter type in overridden ''{0}(..)'' to ''@{1}''
+QuickFixes_change_overridden_return_nullness=Change return type of overridden ''{0}(..)'' to ''@{1}''
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java
index 63dd01c..5770850 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java
@@ -112,9 +112,8 @@
 	}
 
 	public static boolean isComplainingAboutArgument(ASTNode selectedNode) {
-		if (!(selectedNode instanceof SimpleName)) {
+		if (!(selectedNode instanceof SimpleName))
 			return false;
-		}
 		SimpleName nameNode= (SimpleName) selectedNode;
 		IBinding binding= nameNode.resolveBinding();
 		if (binding.getKind() == IBinding.VARIABLE && ((IVariableBinding) binding).isParameter())
@@ -173,13 +172,11 @@
 
 	// Entry for NullAnnotationsCleanup:
 	public static ICleanUpFix createCleanUp(CompilationUnit compilationUnit, IProblemLocation[] locations, int problemID) {
-
 		ICompilationUnit cu= (ICompilationUnit) compilationUnit.getJavaElement();
 		if (!JavaModelUtil.is50OrHigher(cu.getJavaProject()))
 			return null;
 
 		List<CompilationUnitRewriteOperation> operations= new ArrayList<CompilationUnitRewriteOperation>();
-
 		if (locations == null) {
 			org.eclipse.jdt.core.compiler.IProblem[] problems= compilationUnit.getProblems();
 			locations= new IProblemLocation[problems.length];
@@ -190,10 +187,8 @@
 		}
 
 		createAddNullAnnotationOperations(compilationUnit, locations, operations);
-
 		if (operations.size() == 0)
 			return null;
-
 		CompilationUnitRewriteOperation[] operationsArray= operations.toArray(new CompilationUnitRewriteOperation[operations.size()]);
 		return new MyCURewriteOperationsFix(NullFixMessages.QuickFixes_add_annotation_change_name, compilationUnit, operationsArray);
 	}
@@ -215,7 +210,13 @@
 				case IProblem.IllegalReturnNullityRedefinition:
 					annotationToAdd= nonNullAnnotationName;
 					annotationToRemove= nullableAnnotationName;
-					// all others propose to add @Nullable
+					break;
+				case IProblem.RequiredNonNullButProvidedNull:
+				case IProblem.RequiredNonNullButProvidedPotentialNull:
+				case IProblem.RequiredNonNullButProvidedUnknown:
+					annotationToAdd= nonNullAnnotationName;
+					break;
+			// all others propose to add @Nullable
 			}
 			// when performing multiple changes we can only modify the one CU that the CleanUp infrastructure provides to the operation.
 			CompilationUnitRewriteOperation fix= NullRewriteOperations.createAddAnnotationOperation(compilationUnit, problem, annotationToAdd, annotationToRemove, handledPositions,
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java
index 7e6e473..99ac1d0 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java
@@ -58,15 +58,10 @@
 
 	static abstract class SignatureAnnotationRewriteOperation extends CompilationUnitRewriteOperation {
 		String fAnnotationToAdd;
-
 		String fAnnotationToRemove;
-
 		boolean fAllowRemove;
-
 		CompilationUnit fUnit;
-
 		protected String fKey;
-
 		protected String fMessage;
 
 		/* A globally unique key that identifies the position being annotated (for avoiding double annotations). */
@@ -78,7 +73,6 @@
 			return fUnit;
 		}
 
-
 		boolean checkExisting(List<IExtendedModifier> existingModifiers, ListRewrite listRewrite, TextEditGroup editGroup) {
 			for (Object mod : existingModifiers) {
 				if (mod instanceof MarkerAnnotation) {
@@ -211,12 +205,11 @@
 		ASTNode selectedNode= problem.getCoveringNode(compilationUnit);
 		if (selectedNode == null)
 			return null;
-
 		ASTNode declaringNode= getDeclaringNode(selectedNode);
 
 		switch (problem.getProblemId()) {
 			case IProblem.IllegalDefinitionToNonNullParameter:
-//		case IllegalRedefinitionToNonNullParameter:
+//			case IllegalRedefinitionToNonNullParameter:
 				// these affect another method
 				break;
 			case IProblem.IllegalReturnNullityRedefinition:
@@ -229,8 +222,6 @@
 					return null;
 		}
 
-		SignatureAnnotationRewriteOperation result= null;
-		String message= null;
 		String annotationNameLabel= annotationToAdd;
 		int lastDot= annotationToAdd.lastIndexOf('.');
 		if (lastDot != -1)
@@ -250,14 +241,11 @@
 			ASTNode methodDecl= compilationUnit.findDeclaringNode(methodBinding.getKey());
 			if (methodDecl == null)
 				return null;
-			message= Messages.format(NullFixMessages.QuickFixes_declare_method_parameter_nullness, annotationNameLabel);
-			result= new ParameterAnnotationRewriteOperation(compilationUnit, (MethodDeclaration) methodDecl, annotationToAdd, annotationToRemove, paramIdx, allowRemove, message);
+			String message= Messages.format(NullFixMessages.QuickFixes_change_method_parameter_nullness, annotationNameLabel);
+			return new ParameterAnnotationRewriteOperation(compilationUnit, (MethodDeclaration) methodDecl, annotationToAdd, annotationToRemove, paramIdx, allowRemove, message);
 		} else if (declaringNode instanceof MethodDeclaration) {
-
 			// complaint is in signature of this method
-
 			MethodDeclaration declaration= (MethodDeclaration) declaringNode;
-
 			switch (problem.getProblemId()) {
 				case IProblem.ParameterLackingNonNullAnnotation:
 				case IProblem.ParameterLackingNullableAnnotation:
@@ -269,8 +257,8 @@
 					if (declaration.getNodeType() == ASTNode.METHOD_DECLARATION) {
 						String paramName= findAffectedParameterName(selectedNode);
 						if (paramName != null) {
-							message= Messages.format(NullFixMessages.QuickFixes_declare_method_parameter_nullness, annotationNameLabel);
-							result= new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
+							String message= Messages.format(NullFixMessages.QuickFixes_change_method_parameter_nullness, annotationNameLabel);
+							return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
 						}
 					}
 					break;
@@ -283,26 +271,23 @@
 						if (declaration.getNodeType() == ASTNode.METHOD_DECLARATION) {
 							String paramName= findAffectedParameterName(selectedNode);
 							if (paramName != null) {
-								message= Messages.format(NullFixMessages.QuickFixes_declare_method_parameter_nullness, annotationNameLabel);
-								result= new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
+								String message= Messages.format(NullFixMessages.QuickFixes_change_method_parameter_nullness, annotationNameLabel);
+								return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
 							}
 						}
 						break;
 					}
 					//$FALL-THROUGH$
 				case IProblem.IllegalReturnNullityRedefinition:
-					message= Messages.format(NullFixMessages.QuickFixes_declare_method_return_nullness, annotationNameLabel);
-					result= new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message);
-					break;
+					String message= Messages.format(NullFixMessages.QuickFixes_change_method_return_nullness, new String[] { declaration.getName().getIdentifier(), annotationNameLabel });
+					return new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message);
 			}
-
 		}
-		return result;
+		return null;
 	}
 
 	private static SignatureAnnotationRewriteOperation createAddAnnotationToOverriddenOperation(CompilationUnit compilationUnit, IProblemLocation problem, String annotationToAdd,
-			String annotationToRemove,
-			Set<String> handledPositions, boolean thisUnitOnly, boolean allowRemove) {
+			String annotationToRemove, Set<String> handledPositions, boolean thisUnitOnly, boolean allowRemove) {
 		ICompilationUnit cu= (ICompilationUnit) compilationUnit.getJavaElement();
 		if (!JavaModelUtil.is50OrHigher(cu.getJavaProject()))
 			return null;
@@ -312,7 +297,6 @@
 			return null;
 
 		ASTNode declaringNode= getDeclaringNode(selectedNode);
-
 		switch (problem.getProblemId()) {
 			case IProblem.IllegalDefinitionToNonNullParameter:
 			case IProblem.IllegalRedefinitionToNonNullParameter:
@@ -332,11 +316,8 @@
 		annotationNameLabel= BasicElementLabels.getJavaElementName(annotationNameLabel);
 
 		if (declaringNode instanceof MethodDeclaration) {
-
 			// complaint is in signature of this method
-
 			MethodDeclaration declaration= (MethodDeclaration) declaringNode;
-
 			switch (problem.getProblemId()) {
 				case IProblem.IllegalDefinitionToNonNullParameter:
 				case IProblem.IllegalRedefinitionToNonNullParameter:
@@ -346,15 +327,12 @@
 						return createChangeOverriddenReturnOperation(compilationUnit, cu, declaration, allowRemove, annotationToAdd, annotationToRemove, annotationNameLabel);
 					}
 			}
-
 		}
 		return null;
 	}
 
 	private static SignatureAnnotationRewriteOperation createChangeOverriddenParameterOperation(CompilationUnit compilationUnit, ICompilationUnit cu, MethodDeclaration declaration,
 			ASTNode selectedNode, boolean allowRemove, String annotationToAdd, String annotationToRemove, String annotationNameLabel) {
-		SignatureAnnotationRewriteOperation result;
-		String message;
 		IMethodBinding methodDeclBinding= declaration.resolveBinding();
 		if (methodDeclBinding == null)
 			return null;
@@ -369,15 +347,13 @@
 		if (methodDecl == null)
 			return null;
 		declaration= (MethodDeclaration) methodDecl;
-		message= Messages.format(NullFixMessages.QuickFixes_declare_overridden_parameter_as_nonnull,
-				new String[] { annotationNameLabel, BasicElementLabels.getJavaElementName(overridden.getDeclaringClass().getName()) });
+		String message= Messages.format(NullFixMessages.QuickFixes_change_overridden_parameter_nullness, new String[] { overridden.getName(), annotationNameLabel });
 		String paramName= findAffectedParameterName(selectedNode);
-		result= new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
-		return result;
+		return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
 	}
 
 	private static String findAffectedParameterName(ASTNode selectedNode) {
-		VariableDeclaration argDecl= selectedNode instanceof VariableDeclaration ? (VariableDeclaration) selectedNode : (VariableDeclaration) ASTNodes.getParent(selectedNode,
+		VariableDeclaration argDecl= (selectedNode instanceof VariableDeclaration) ? (VariableDeclaration) selectedNode : (VariableDeclaration) ASTNodes.getParent(selectedNode,
 				VariableDeclaration.class);
 		if (argDecl != null)
 			return argDecl.getName().getIdentifier();
@@ -408,8 +384,6 @@
 
 	private static SignatureAnnotationRewriteOperation createChangeOverriddenReturnOperation(CompilationUnit compilationUnit, ICompilationUnit cu, MethodDeclaration declaration, boolean allowRemove,
 			String annotationToAdd, String annotationToRemove, String annotationNameLabel) {
-		SignatureAnnotationRewriteOperation result;
-		String message;
 		IMethodBinding methodDeclBinding= declaration.resolveBinding();
 		if (methodDeclBinding == null)
 			return null;
@@ -427,10 +401,8 @@
 // TODO(SH): decide whether we want to propose overwriting existing annotations in super
 //		if (hasNullAnnotation(declaration)) // if overridden has explicit declaration don't propose to change it
 //			return null;
-		message= Messages.format(NullFixMessages.QuickFixes_declare_overridden_return_as_nullable,
-				new String[] { annotationNameLabel, BasicElementLabels.getJavaElementName(overridden.getDeclaringClass().getName()) });
-		result= new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message);
-		return result;
+		String message= Messages.format(NullFixMessages.QuickFixes_change_overridden_return_nullness, new String[] { overridden.getName(), annotationNameLabel });
+		return new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message);
 	}
 
 	private static CompilationUnit findCUForMethod(CompilationUnit compilationUnit, ICompilationUnit cu, IMethodBinding methodBinding) {
