diff --git a/org.eclipse.virgo.ide.ui/plugin.xml b/org.eclipse.virgo.ide.ui/plugin.xml
index ab6a447..36526ba 100644
--- a/org.eclipse.virgo.ide.ui/plugin.xml
+++ b/org.eclipse.virgo.ide.ui/plugin.xml
@@ -186,6 +186,21 @@
             </separator>
          </menu>
       </objectContribution>
+ 	  <objectContribution
+            objectClass="org.eclipse.core.resources.IProject"
+            adaptable="true"
+            id="org.eclipse.virgo.ide.ui.migrate.pde2virgo">
+         <action
+               label="Migrate PDE2Virgo project"
+               class="org.eclipse.virgo.ide.ui.internal.actions.ConvertPDE2VirgoProject"
+               enablesFor="+"
+               menubarPath="org.eclipse.virgo.ide.menu/group1"
+               id="org.eclipse.virgo.ide.ui.migrate.pde2virgo.action">
+	        <enablement>
+					<objectState name="nature" value="org.github.pde2virgo.PDE2VirgoNature"/>
+	         </enablement>   
+         </action>       
+       </objectContribution>
    </extension>
    
    	<extension point="org.eclipse.wst.xml.core.catalogContributions">
diff --git a/org.eclipse.virgo.ide.ui/src/org/eclipse/virgo/ide/ui/internal/actions/ConvertPDE2VirgoProject.java b/org.eclipse.virgo.ide.ui/src/org/eclipse/virgo/ide/ui/internal/actions/ConvertPDE2VirgoProject.java
new file mode 100644
index 0000000..3c83cb6
--- /dev/null
+++ b/org.eclipse.virgo.ide.ui/src/org/eclipse/virgo/ide/ui/internal/actions/ConvertPDE2VirgoProject.java
@@ -0,0 +1,115 @@
+
+package org.eclipse.virgo.ide.ui.internal.actions;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.eclipse.virgo.ide.pde.core.internal.Constants;
+import org.eclipse.virgo.ide.ui.ServerIdeUiPlugin;
+
+/**
+ * ConvertPDE2VirgoProject is a contextual menu action in the Virgo submenu for migrating projects created with the
+ * unofficial PDE2Virgo plug-in to the official Virgo tools support for PDE.
+ *
+ * The migration consists in simply changing the project nature.
+ */
+public class ConvertPDE2VirgoProject implements IObjectActionDelegate {
+
+    private static final String PDE2_VIRGO_NATURE = "org.github.pde2virgo.PDE2VirgoNature"; //$NON-NLS-1$
+
+    private List<?> projects;
+
+    private IWorkbenchPart part;
+
+    public void run(IAction arg0) {
+        ProgressMonitorDialog dlg = new ProgressMonitorDialog(part.getSite().getShell());
+        try {
+            dlg.run(true, true, new IRunnableWithProgress() {
+
+                public void run(IProgressMonitor arg0) throws InvocationTargetException, InterruptedException {
+                    ConvertPDE2VirgoProject.this.run(arg0);
+                }
+            });
+        } catch (Exception e) {
+            Status s = new Status(IStatus.ERROR, ServerIdeUiPlugin.PLUGIN_ID, e.getMessage());
+            StatusManager.getManager().handle(s, StatusManager.SHOW);
+        }
+
+    }
+
+    protected void run(IProgressMonitor monitor) {
+        monitor.beginTask("", projects.size()); //$NON-NLS-1$
+        SubMonitor subMonitor = SubMonitor.convert(monitor);
+        for (Object o : projects) {
+            IProject project = (IProject) o;
+            try {
+                IProjectDescription description = project.getDescription();
+                String[] natures = description.getNatureIds();
+                for (int i = 0; i < natures.length; i++) {
+                    if (PDE2_VIRGO_NATURE.equals(natures[i])) {
+                        natures[i] = Constants.NATURE_ID;
+                        break;
+                    }
+                }
+                description.setNatureIds(natures);
+
+                IProgressMonitor projectMonitor = subMonitor.newChild(1);
+                projectMonitor.setTaskName(project.getName());
+                project.setDescription(description, projectMonitor);
+            } catch (CoreException e) {
+                Status s = new Status(IStatus.ERROR, ServerIdeUiPlugin.PLUGIN_ID, e.getMessage());
+                StatusManager.getManager().handle(s, StatusManager.SHOW);
+            }
+        }
+        monitor.done();
+    }
+
+    public void selectionChanged(IAction action, ISelection selection) {
+        IStructuredSelection ss = (IStructuredSelection) selection;
+        projects = ss.toList();
+        boolean validSelection = true;
+        for (Iterator<?> iterator = projects.iterator(); iterator.hasNext() && validSelection;) {
+            Object object = iterator.next();
+            if (object instanceof IProject) {
+                IProject prj = (IProject) object;
+                if (prj.isOpen()) {
+                    try {
+                        if (prj.hasNature(PDE2_VIRGO_NATURE)) {
+                            continue;
+                        }
+                    } catch (CoreException e) {
+                        validSelection = false;
+                    }
+                } else {
+                    validSelection = false;
+                }
+            }
+        }
+
+        action.setEnabled(validSelection);
+        if (!validSelection) {
+            this.projects = null;
+        }
+    }
+
+    public void setActivePart(IAction action, IWorkbenchPart part) {
+        this.part = part;
+    }
+
+}
