diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java
index 95633fd..ce06e0e 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java
@@ -24,17 +24,11 @@
 import static org.eclipse.m2e.core.ui.internal.editing.PomEdits.VERSION;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -51,7 +45,6 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
@@ -64,19 +57,8 @@
 import org.eclipse.jface.text.source.IAnnotationModel;
 import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.ide.IDE;
 import org.eclipse.ui.texteditor.MarkerAnnotation;
 import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
 
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Dependency;
@@ -89,7 +71,7 @@
 
 import org.eclipse.m2e.core.internal.IMavenConstants;
 import org.eclipse.m2e.core.ui.internal.actions.OpenPomAction;
-import org.eclipse.m2e.core.ui.internal.actions.OpenPomAction.MavenPathStorageEditorInput;
+import org.eclipse.m2e.editor.xml.internal.XMLEditorUtility;
 import org.eclipse.m2e.editor.xml.internal.Messages;
 import org.eclipse.m2e.editor.xml.internal.XmlUtils;
 
@@ -99,8 +81,6 @@
  * @author Milos Kleint
  */
 public class PomHyperlinkDetector implements IHyperlinkDetector {
-  private static final Logger log = LoggerFactory.getLogger(PomHyperlinkDetector.class);
-
   public IHyperlink[] detectHyperlinks(final ITextViewer textViewer, final IRegion region,
       boolean canShowMultipleHyperlinks) {
     if(region == null || textViewer == null) {
@@ -256,7 +236,7 @@
             File file = XmlUtils.fileForInputLocation(openLocation, mavprj);
             if(file != null) {
               IFileStore fileStore = EFS.getLocalFileSystem().getStore(file.toURI());
-              openXmlEditor(fileStore, openLocation.getLineNumber(), openLocation.getColumnNumber(),
+              XMLEditorUtility.openXmlEditor(fileStore, openLocation.getLineNumber(), openLocation.getColumnNumber(),
                   openLocation.getSource().getModelId());
             }
           }
@@ -394,7 +374,7 @@
             File file = XmlUtils.fileForInputLocation(location, mavprj);
             if(file != null) {
               IFileStore fileStore = EFS.getLocalFileSystem().getStore(file.toURI());
-              openXmlEditor(fileStore, location.getLineNumber(), location.getColumnNumber(),
+              XMLEditorUtility.openXmlEditor(fileStore, location.getLineNumber(), location.getColumnNumber(),
                   location.getSource().getModelId());
             }
           }
@@ -472,7 +452,7 @@
 //          String hint = marker.getAttribute(IMavenConstants.MARKER_ATTR_EDITOR_HINT, null);
 //          if (IMavenConstants.EDITOR_HINT_NOT_COVERED_MOJO_EXECUTION.equals(hint)) {
 //          }
-          openXmlEditor(fileStore, row, column, name);
+          XMLEditorUtility.openXmlEditor(fileStore, row, column, name);
         }
       }
     };
@@ -541,7 +521,7 @@
       }
 
       public void open() {
-        openXmlEditor(fileStore);
+        XMLEditorUtility.openXmlEditor(fileStore);
       }
     };
   }
@@ -629,102 +609,6 @@
     return null;
   }
 
-  private void openXmlEditor(final IFileStore fileStore) {
-    openXmlEditor(fileStore, -1, -1, fileStore.getName());
-  }
-
-  private static void openXmlEditor(final IFileStore fileStore, int line, int column, String name) {
-    assert fileStore != null;
-    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-    if(window != null) {
-      IWorkbenchPage page = window.getActivePage();
-      if(page != null) {
-        try {
-          if(!fileStore.getName().endsWith(".pom")) { //.pom means stuff from local repository?
-            IEditorPart part = IDE.openEditorOnFileStore(page, fileStore);
-            reveal(selectEditorPage(part), line, column);
-          } else {
-            //we need special EditorInput for stuff from repository
-            name = name + ".pom"; //$NON-NLS-1$
-            File file = new File(fileStore.toURI());
-            try {
-              IEditorInput input = new MavenPathStorageEditorInput(name, name, file.getAbsolutePath(),
-                  readStream(new FileInputStream(file)));
-              IEditorPart part = OpenPomAction.openEditor(input, name);
-              reveal(selectEditorPage(part), line, column);
-            } catch(IOException e) {
-              log.error("failed opening editor", e);
-            }
-          }
-        } catch(PartInitException e) {
-          MessageDialog.openInformation(Display.getDefault().getActiveShell(), //
-              Messages.PomHyperlinkDetector_error_title,
-              NLS.bind(Messages.PomHyperlinkDetector_error_message, fileStore, e.toString()));
-
-        }
-      }
-    }
-  }
-
-  private static StructuredTextEditor selectEditorPage(IEditorPart part) {
-    if(part == null) {
-      return null;
-    }
-    if(part instanceof FormEditor) {
-      FormEditor ed = (FormEditor) part;
-      ed.setActivePage(null); //null means source, always or just in the case of MavenPomEditor?
-      if(ed.getActiveEditor() instanceof StructuredTextEditor) {
-        return (StructuredTextEditor) ed.getActiveEditor();
-      }
-    }
-    return null;
-  }
-
-  private static void reveal(StructuredTextEditor structured, int line, int column) {
-    if(structured == null || line < 0 || column < 0) {
-      return;
-    }
-    IDocument doc = structured.getTextViewer().getDocument();
-    if(doc instanceof IStructuredDocument) {
-      IStructuredDocument document = (IStructuredDocument) doc;
-      try {
-        int offset = document.getLineOffset(line - 1);
-        structured.selectAndReveal(offset + column - 1, 0);
-      } catch(BadLocationException e) {
-        log.error("failed selecting part of editor", e);
-      }
-    }
-  }
-
-  /**
-   * duplicate of OpenPomAction method
-   * 
-   * @param is
-   * @return
-   * @throws IOException
-   */
-  private static byte[] readStream(InputStream is) throws IOException {
-    byte[] b = new byte[is.available()];
-    int len = 0;
-    while(true) {
-      int n = is.read(b, len, b.length - len);
-      if(n == -1) {
-        if(len < b.length) {
-          byte[] c = new byte[len];
-          System.arraycopy(b, 0, c, 0, len);
-          b = c;
-        }
-        return b;
-      }
-      len += n;
-      if(len == b.length) {
-        byte[] c = new byte[b.length + 1000];
-        System.arraycopy(b, 0, c, 0, len);
-        b = c;
-      }
-    }
-  }
-
   public static class ExpressionRegion implements IRegion {
 
     final String property;
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 6d1ed6f..d90bb27 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
@@ -21,6 +21,7 @@
 import static org.eclipse.m2e.core.ui.internal.editing.PomEdits.getTextValue;
 import static org.eclipse.m2e.core.ui.internal.editing.PomEdits.textEquals;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -53,6 +54,7 @@
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.InputLocation;
+import org.apache.maven.model.InputLocationTracker;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.PluginManagement;
 import org.apache.maven.project.MavenProject;
@@ -345,7 +347,7 @@
       }
     }
     //collect the managed dep ids
-    Map<String, String> managed = new HashMap<String, String>();
+    Map<String, Dependency> managed = new HashMap<String, Dependency>();
     DependencyManagement dm = mavenproject.getDependencyManagement();
     if(dm != null) {
       List<Dependency> deps = dm.getDependencies();
@@ -354,7 +356,7 @@
           if(dep.getVersion() != null) { //#335366
             //355882 use dep.getManagementKey() to prevent false positives
             //when type or classifier doesn't match 
-            managed.put(dep.getManagementKey(), dep.getVersion());
+            managed.put(dep.getManagementKey(), dep);
           }
         }
       }
@@ -371,7 +373,8 @@
         String classifier = getTextValue(findChild(dep, PomEdits.CLASSIFIER));
         String id = getDependencyKey(grpString, artString, typeString, classifier);
         if(managed.containsKey(id)) {
-          String managedVersion = managed.get(id);
+          Dependency managedDep = managed.get(id);
+          String managedVersion = managedDep == null ? null : managedDep.getVersion();
           if(version instanceof IndexedRegion) {
             IndexedRegion off = (IndexedRegion) version;
             if(lookForIgnoreMarker(document, version, off, IMavenConstants.MARKER_IGNORE_MANAGED)) {
@@ -390,6 +393,7 @@
             //add these attributes to easily and deterministically find the declaration in question
             mark.setAttribute("groupId", grpString); //$NON-NLS-1$
             mark.setAttribute("artifactId", artString); //$NON-NLS-1$
+            setManagedVersionAttributes(mark, mavenproject, managedDep);
             String profile = candidateProfile.get(dep);
             if(profile != null) {
               mark.setAttribute("profile", profile); //$NON-NLS-1$
@@ -400,6 +404,24 @@
     }
   }
 
+  private static void setManagedVersionAttributes(IMarker mark, MavenProject mavenproject,
+      InputLocationTracker dependencyOrPlugin) throws CoreException {
+    InputLocation loc = dependencyOrPlugin == null ? null : dependencyOrPlugin.getLocation("version");
+    File file = loc == null ? null : XmlUtils.fileForInputLocation(loc, mavenproject);
+
+    if(file != null) {
+      mark.setAttribute("managedVersionLocation", file.toURI().toString());
+      int lineNumber = loc != null ? loc.getLineNumber() : -1;
+      if(lineNumber > 0) {
+        mark.setAttribute("managedVersionLine", lineNumber);
+      }
+      int columnNumber = loc != null ? loc.getColumnNumber() : -1;
+      if(columnNumber > 0) {
+        mark.setAttribute("managedVersionColumn", columnNumber);
+      }
+    }
+  }
+
   private static String getDependencyKey(String groupId, String artifactId, String type, String classifier) {
     StringBuilder key = new StringBuilder(groupId).append(":").append(artifactId).append(":") //$NON-NLS-1$ //$NON-NLS-2$
         .append(type == null ? "jar" : type);//$NON-NLS-1$
@@ -460,7 +482,7 @@
       }
     }
     //collect the managed plugin ids
-    Map<String, String> managed = new HashMap<String, String>();
+    Map<String, Plugin> managed = new HashMap<String, Plugin>();
     PluginManagement pm = mavenproject.getPluginManagement();
     if(pm != null) {
       List<Plugin> plgs = pm.getPlugins();
@@ -471,7 +493,7 @@
           String modelID = loc == null ? null : (loc.getSource() == null ? null : loc.getSource().getModelId());
           if(loc != null && (modelID == null
               || !(modelID.startsWith("org.apache.maven:maven-model-builder:") && modelID.endsWith(":super-pom")))) {
-            managed.put(plg.getKey(), plg.getVersion());
+            managed.put(plg.getKey(), plg);
           }
         }
       }
@@ -489,7 +511,8 @@
       if(artString != null && versionString != null) {
         String id = Plugin.constructKey(grpString, artString);
         if(managed.containsKey(id)) {
-          String managedVersion = managed.get(id);
+          Plugin managedPlugin = managed.get(id);
+          String managedVersion = managedPlugin == null ? null : managedPlugin.getVersion();
           if(version instanceof IndexedRegion) {
             IndexedRegion off = (IndexedRegion) version;
             if(lookForIgnoreMarker(document, version, off, IMavenConstants.MARKER_IGNORE_MANAGED)) {
@@ -509,6 +532,7 @@
             //add these attributes to easily and deterministicaly find the declaration in question
             mark.setAttribute("groupId", grpString); //$NON-NLS-1$
             mark.setAttribute("artifactId", artString); //$NON-NLS-1$
+            setManagedVersionAttributes(mark, mavenproject, managedPlugin);
             String profile = candidateProfile.get(dep);
             if(profile != null) {
               mark.setAttribute("profile", profile); //$NON-NLS-1$
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/Messages.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/Messages.java
index 584bdb9..3a3403b 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/Messages.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/Messages.java
@@ -70,6 +70,10 @@
 
   public static String MavenMarkerResolution_schema_label;
 
+  public static String MavenMarkerResolution_openManaged_label;
+
+  public static String MavenMarkerResolution_openManaged_description;
+
   public static String PomContentAssistProcessor_insert_relPath_title;
 
   public static String PomContentAssistProcessor_set_relPath_title;
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/XMLEditorUtility.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/XMLEditorUtility.java
new file mode 100644
index 0000000..fe2e92b
--- /dev/null
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/XMLEditorUtility.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2020 Sonatype, Inc. and others.
+ * All rights reserved. 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:
+ *      Sonatype, Inc. - initial API and implementation (code moved here from PomHyperlinkDetector).
+ * 
+ *******************************************************************************/
+
+package org.eclipse.m2e.editor.xml.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+
+import org.eclipse.m2e.core.ui.internal.actions.OpenPomAction;
+import org.eclipse.m2e.core.ui.internal.actions.OpenPomAction.MavenPathStorageEditorInput;
+
+
+public class XMLEditorUtility {
+  private static final Logger log = LoggerFactory.getLogger(XMLEditorUtility.class);
+
+  public static void openXmlEditor(final IFileStore fileStore) {
+    openXmlEditor(fileStore, -1, -1, fileStore.getName());
+  }
+
+  public static void openXmlEditor(final IFileStore fileStore, int line, int column, String name) {
+    assert fileStore != null;
+    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+    if(window != null) {
+      IWorkbenchPage page = window.getActivePage();
+      if(page != null) {
+        try {
+          if(!fileStore.getName().endsWith(".pom")) { //.pom means stuff from local repository?
+            IEditorPart part = IDE.openEditorOnFileStore(page, fileStore);
+            reveal(selectEditorPage(part), line, column);
+          } else {
+            //we need special EditorInput for stuff from repository
+            name = name + ".pom"; //$NON-NLS-1$
+            File file = new File(fileStore.toURI());
+            try {
+              IEditorInput input = new MavenPathStorageEditorInput(name, name, file.getAbsolutePath(),
+                  readStream(new FileInputStream(file)));
+              IEditorPart part = OpenPomAction.openEditor(input, name);
+              reveal(selectEditorPage(part), line, column);
+            } catch(IOException e) {
+              log.error("failed opening editor", e);
+            }
+          }
+        } catch(PartInitException e) {
+          MessageDialog.openInformation(Display.getDefault().getActiveShell(), //
+              Messages.PomHyperlinkDetector_error_title,
+              NLS.bind(Messages.PomHyperlinkDetector_error_message, fileStore, e.toString()));
+
+        }
+      }
+    }
+  }
+
+  private static StructuredTextEditor selectEditorPage(IEditorPart part) {
+    if(part == null) {
+      return null;
+    }
+    if(part instanceof FormEditor) {
+      FormEditor ed = (FormEditor) part;
+      ed.setActivePage(null); //null means source, always or just in the case of MavenPomEditor?
+      if(ed.getActiveEditor() instanceof StructuredTextEditor) {
+        return (StructuredTextEditor) ed.getActiveEditor();
+      }
+    }
+    return null;
+  }
+
+  private static void reveal(StructuredTextEditor structured, int line, int column) {
+    if(structured == null || line < 0 || column < 0) {
+      return;
+    }
+    IDocument doc = structured.getTextViewer().getDocument();
+    if(doc instanceof IStructuredDocument) {
+      IStructuredDocument document = (IStructuredDocument) doc;
+      try {
+        int offset = document.getLineOffset(line - 1);
+        structured.selectAndReveal(offset + column - 1, 0);
+      } catch(BadLocationException e) {
+        log.error("failed selecting part of editor", e);
+      }
+    }
+  }
+
+  /**
+   * duplicate of OpenPomAction method
+   * 
+   * @param is
+   * @return
+   * @throws IOException
+   */
+  private static byte[] readStream(InputStream is) throws IOException {
+    byte[] b = new byte[is.available()];
+    int len = 0;
+    while(true) {
+      int n = is.read(b, len, b.length - len);
+      if(n == -1) {
+        if(len < b.length) {
+          byte[] c = new byte[len];
+          System.arraycopy(b, 0, c, 0, len);
+          b = c;
+        }
+        return b;
+      }
+      len += n;
+      if(len == b.length) {
+        byte[] c = new byte[b.length + 1000];
+        System.arraycopy(b, 0, c, 0, len);
+        b = c;
+      }
+    }
+  }
+
+}
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/markers/MavenMarkerResolutionGenerator.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/markers/MavenMarkerResolutionGenerator.java
index 8c743f0..d8ae650 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/markers/MavenMarkerResolutionGenerator.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/markers/MavenMarkerResolutionGenerator.java
@@ -50,11 +50,13 @@
       }
       if(isDependencyVersionOverride(hint)) {
         return new IMarkerResolution[] {new ManagedVersionRemovalResolution(marker, true),
-            new IgnoreWarningResolution(marker, IMavenConstants.MARKER_IGNORE_MANAGED)};
+            new IgnoreWarningResolution(marker, IMavenConstants.MARKER_IGNORE_MANAGED),
+            new OpenManagedVersionDefinitionResolution(marker)};
       }
       if(isPluginVersionOverride(hint)) {
         return new IMarkerResolution[] {new ManagedVersionRemovalResolution(marker, false),
-            new IgnoreWarningResolution(marker, IMavenConstants.MARKER_IGNORE_MANAGED)};
+            new IgnoreWarningResolution(marker, IMavenConstants.MARKER_IGNORE_MANAGED),
+            new OpenManagedVersionDefinitionResolution(marker)};
       }
       if(hint.equals(IMavenConstants.EDITOR_HINT_NOT_COVERED_MOJO_EXECUTION)) {
         return new IMarkerResolution[] {new LifecycleMappingResolution(marker, PluginExecutionAction.ignore),
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/markers/OpenManagedVersionDefinitionResolution.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/markers/OpenManagedVersionDefinitionResolution.java
new file mode 100644
index 0000000..8dea3e5
--- /dev/null
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/markers/OpenManagedVersionDefinitionResolution.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Till Brychcy and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *      Till Brychcy - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.m2e.editor.xml.internal.markers;
+
+import java.net.URI;
+import java.util.List;
+
+import org.w3c.dom.Element;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE.SharedImages;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+import org.eclipse.m2e.editor.xml.internal.XMLEditorUtility;
+import org.eclipse.m2e.editor.xml.internal.Messages;
+
+
+@SuppressWarnings("restriction")
+public class OpenManagedVersionDefinitionResolution extends AbstractPomProblemResolution {
+
+  public OpenManagedVersionDefinitionResolution(IMarker marker) {
+    super(marker);
+  }
+
+  @Override
+  public int getOrder() {
+    return 90;
+  }
+
+  @Override
+  public boolean canFix(String editorHint) {
+    try {
+      return getMarker().getAttribute("managedVersionLocation") != null;
+    } catch(CoreException ex) {
+      return false;
+    }
+  }
+
+  @Override
+  public String getLabel() {
+    return Messages.MavenMarkerResolution_openManaged_label;
+  }
+
+  @Override
+  public Image getImage() {
+    return PlatformUI.getWorkbench().getSharedImages().getImage(SharedImages.IMG_OPEN_MARKER);
+  }
+
+  @Override
+  public String getDescription() {
+    try {
+      String locationURIString = (String) getMarker().getAttribute("managedVersionLocation");
+      return NLS.bind(Messages.MavenMarkerResolution_openManaged_description, locationURIString);
+    } catch(CoreException ex) {
+      // ignore
+    }
+    return null;
+  }
+
+  @Override
+  protected void processFix(IStructuredDocument doc, Element root, List<IMarker> markers) {
+    try {
+      String locationURIString = (String) getMarker().getAttribute("managedVersionLocation");
+      if(locationURIString != null) {
+        IFileStore fileStore = EFS.getLocalFileSystem().getStore(new URI(locationURIString));
+        int lineNumber = getMarker().getAttribute("managedVersionLine", -1);
+        int columnNumber = Math.max(1, getMarker().getAttribute("managedVersionColumn", -1));
+        XMLEditorUtility.openXmlEditor(fileStore, lineNumber, columnNumber, fileStore.getName());
+      }
+    } catch(Exception ex) {
+      // ignore
+    }
+  }
+}
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/messages.properties b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/messages.properties
index 989081e..effc6e2 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/messages.properties
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/messages.properties
@@ -23,6 +23,8 @@
 MavenMarkerResolution_error=Unable to apply the quick fix. The file may have unsaved changes that invalidate the current quick fix.
 MavenMarkerResolution_error_title=Error
 MavenMarkerResolution_schema_label=Add Schema information to the specified pom.xml
+MavenMarkerResolution_openManaged_label=Open declaration of managed version
+MavenMarkerResolution_openManaged_description=Open {0}
 PomContentAssistProcessor_insert_relPath_title=Insert relativePath pointing to {0}
 PomContentAssistProcessor_set_relPath_title=Set relativePath to {0}
 PomHyperlinkDetector_error_message=Can't open editor for {0}\n{1}
