diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/FormHoverProvider.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/FormHoverProvider.java
index 367a295..44b359e 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/FormHoverProvider.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/FormHoverProvider.java
@@ -116,9 +116,8 @@
         });
         mhc.setVisible(true);
       };
-    } else {
-      return null;
     }
+    return null;
   }
 
   public static interface Execute {
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/MarkerLocationService.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/MarkerLocationService.java
index 654b3eb..6d1ed6f 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/MarkerLocationService.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/MarkerLocationService.java
@@ -175,13 +175,12 @@
                 if(goalEl != null) {
                   ourMarkerPlacement = goalEl;
                   break;
-                } else {
-                  //only remember the first execution match
-                  if(ourMarkerPlacement == null) {
-                    ourMarkerPlacement = findChild(execution, PomEdits.ID);
-                    if(ourMarkerPlacement == null) { //just old plain paranoia
-                      ourMarkerPlacement = execution;
-                    }
+                }
+                //only remember the first execution match
+                if(ourMarkerPlacement == null) {
+                  ourMarkerPlacement = findChild(execution, PomEdits.ID);
+                  if(ourMarkerPlacement == null) { //just old plain paranoia
+                    ourMarkerPlacement = execution;
                   }
                 }
               }
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/FormUtils.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/FormUtils.java
index 6462f38..543bc33 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/FormUtils.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/FormUtils.java
@@ -101,10 +101,9 @@
       }
       setMessageAndTTip(form, NLS.bind(Messages.FormUtils_click_for_details, truncMsg), message, severity);
       return true;
-    } else {
-      setMessageAndTTip(form, message, message, severity);
-      return false;
     }
+    setMessageAndTTip(form, message, message, severity);
+    return false;
   }
 
   public static void setMessageAndTTip(final ScrolledForm form, final String message, final String ttip,
@@ -168,8 +167,8 @@
       url = url.trim();
       try {
         IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
-        IWebBrowser browser = browserSupport.createBrowser(IWorkbenchBrowserSupport.NAVIGATION_BAR
-            | IWorkbenchBrowserSupport.LOCATION_BAR, url, url, url);
+        IWebBrowser browser = browserSupport.createBrowser(
+            IWorkbenchBrowserSupport.NAVIGATION_BAR | IWorkbenchBrowserSupport.LOCATION_BAR, url, url, url);
         browser.openURL(new URL(url));
       } catch(PartInitException ex) {
         log.error(ex.getMessage(), ex);
@@ -327,8 +326,8 @@
       if(props != null) {
         inter.addValueSource(new PropertiesBasedValueSource(props));
       }
-      inter.addValueSource(new PrefixedObjectValueSource(
-          Arrays.asList(new String[] {"pom.", "project."}), project.getModel(), false)); //$NON-NLS-1$ //$NON-NLS-2$
+      inter.addValueSource(
+          new PrefixedObjectValueSource(Arrays.asList(new String[] {"pom.", "project."}), project.getModel(), false)); //$NON-NLS-1$ //$NON-NLS-2$
       try {
         text = inter.interpolate(text);
       } catch(InterpolationException e) {
diff --git a/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/ListAdapter.java b/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/ListAdapter.java
index b857bda..9091e90 100644
--- a/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/ListAdapter.java
+++ b/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/ListAdapter.java
@@ -175,24 +175,21 @@
         ((IDOMNode) childElement).addAdapter(this);
       }
       return getElementText(childElement);
-    } else {
-      ModelObjectAdapter existing = (ModelObjectAdapter) ((IDOMNode) childElement)
-          .getExistingAdapter(ModelObjectAdapter.class);
-      if(existing == null) {
-        if(createIfNeeded) {
-          EObject eo = PomFactory.eINSTANCE.create(elementType);
-          existing = new ModelObjectAdapter(resource, eo, childElement);
-          eo.eAdapters().add(existing);
-          ((IDOMNode) childElement).addAdapter(existing);
-          existing.load();
-          return eo;
-        } else {
-          return null;
-        }
-      } else {
-        return existing.getTarget();
-      }
     }
+    ModelObjectAdapter existing = (ModelObjectAdapter) ((IDOMNode) childElement)
+        .getExistingAdapter(ModelObjectAdapter.class);
+    if(existing == null) {
+      if(createIfNeeded) {
+        EObject eo = PomFactory.eINSTANCE.create(elementType);
+        existing = new ModelObjectAdapter(resource, eo, childElement);
+        eo.eAdapters().add(existing);
+        ((IDOMNode) childElement).addAdapter(existing);
+        existing.load();
+        return eo;
+      }
+      return null;
+    }
+    return existing.getTarget();
   }
 
   public boolean isAdapterForType(Object type) {
diff --git a/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/SSESyncResource.java b/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/SSESyncResource.java
index f996eae..14aeb0b 100644
--- a/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/SSESyncResource.java
+++ b/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/SSESyncResource.java
@@ -147,9 +147,8 @@
       // IOException can't wrap another exception before Java 6
       if(e.getCause() != null && e.getCause() instanceof IOException) {
         throw (IOException) e.getCause();
-      } else {
-        throw new IOException(e.getMessage());
       }
+      throw new IOException(e.getMessage());
     }
   }
 
diff --git a/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/TranslatorAdapter.java b/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/TranslatorAdapter.java
index a7fbfca..9aa1c54 100644
--- a/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/TranslatorAdapter.java
+++ b/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/TranslatorAdapter.java
@@ -93,9 +93,8 @@
         if(e.getLocalName().equals(element.getLocalName())) {
           if(e == element) {
             return ret;
-          } else {
-            ret++ ;
           }
+          ret++ ;
         }
       }
     }
@@ -119,9 +118,8 @@
         if(e.getLocalName().equals(element.getLocalName())) {
           if(e == element) {
             return ret;
-          } else {
-            ret++ ;
           }
+          ret++ ;
         }
       }
     }
@@ -156,9 +154,8 @@
         if(e.getTagName().equals(name) || "*".equals(name)) { //$NON-NLS-1$
           if(matchCount == n) {
             return e;
-          } else {
-            matchCount++ ;
           }
+          matchCount++ ;
         }
       }
     }
