diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
index 3325ee9..7f1af3c 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
@@ -461,6 +461,7 @@
 	public static String ModuleDialog_removeFromIncluded_tooltip;
 	public static String ModuleDialog_addToExplicitlyIncluded_tooltip;
 	public static String ModuleDialog_cannotLimitSingle_error;
+	public static String ModuleDialog_unknownModules_info;
 
 	public static String ModuleDialog_details_tab;
 	public static String ModuleDialog_patches_module_label;
@@ -480,6 +481,7 @@
 	public static String ModuleDialog_duplicateReads_error;
 	public static String ModuleDialog_missingPatch_error;
 	public static String ModuleDialog_wrongPatch_error;
+	public static String ModuleDialog_cannotEditDetails_info;
 	public static String ModuleDialog_mustIncludeModule_error;
 
 	public static String ModuleAddExportsBlock_packageEmpty_error;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
index 6bb3cc5..0c4e518 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
@@ -498,6 +498,7 @@
 ModuleDialog_removeFromIncluded_tooltip=Remove selected from included modules
 ModuleDialog_addToExplicitlyIncluded_tooltip=Add selected to explicitly included modules
 ModuleDialog_cannotLimitSingle_error=Cannot limit a single-module entry
+ModuleDialog_unknownModules_info=Contained modules are not known until changes are applied.
 
 ModuleDialog_details_tab=Details
 ModuleDialog_patches_module_label=Patches an existing module
@@ -518,6 +519,7 @@
 ModuleDialog_missingPatch_error=Must specify the module to be patched
 ModuleDialog_wrongPatch_error=Module ''{0}'' is not provided by this build path entry
 ModuleDialog_mustIncludeModule_error=Must include at least one module
+ModuleDialog_cannotEditDetails_info=Most details can only be edited after changes have been applied
 
 ModuleAddExportsBlock_packageEmpty_error=Package is empty
 ModuleAddExportsBlock_sourceModuleEmpty_error=Source module is empty
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/BuildPathBasePage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/BuildPathBasePage.java
index 85f8264..3809acf 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/BuildPathBasePage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/BuildPathBasePage.java
@@ -28,6 +28,7 @@
 import org.eclipse.core.resources.IWorkspaceRunnable;
 
 import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.window.Window;
 
 import org.eclipse.ui.PlatformUI;
@@ -47,6 +48,7 @@
 import org.eclipse.jdt.internal.ui.preferences.PreferencesMessages;
 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
 import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
+import org.eclipse.jdt.internal.ui.wizards.buildpaths.RootCPListElement.RootNodeChange;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.TreeListDialogField;
@@ -278,6 +280,46 @@
 	
 
 
+	/**
+	 * @param listField the UI element holding the list of elements to be manipulated
+	 * @param selElement is classpath element
+	 * @param changeNodeDirection indicate in which direction the element should be moved
+	 */
+	protected void moveCPElementAcrossNode(TreeListDialogField<CPListElement> listField, CPListElement selElement, RootNodeChange changeNodeDirection) {
+		List<CPListElement> elements= listField.getElements();
+		//remove from module node or classnode
+		for (CPListElement cpListElement : elements) {
+			if (cpListElement.isRootNodeForPath()) {
+				RootCPListElement rootElement= (RootCPListElement) cpListElement;
+				if (rootElement.isSourceRootNode(changeNodeDirection) && rootElement.getChildren().contains(selElement)) {
+					rootElement.removeCPListElement(selElement);
+					listField.getTreeViewer().remove(selElement);
+					listField.dialogFieldChanged();
+				}
+			}
+		}
+		// add to classpath node or module and select the cpe
+		for (CPListElement cpListElement : elements) {
+			if (cpListElement.isRootNodeForPath()) {
+				RootCPListElement rootCPListElement= (RootCPListElement) cpListElement;
+				if (rootCPListElement.isTargetRootNode(changeNodeDirection)) {
+					if (rootCPListElement.getChildren().contains(selElement))
+						break;
+					rootCPListElement.addCPListElement(selElement);
+					List<CPListElement> all= listField.getElements();
+					listField.removeAllElements();
+					listField.setElements(all);
+					listField.refresh();
+					listField.getTreeViewer().expandToLevel(2);
+					listField.postSetSelection(new StructuredSelection(selElement));
+					break;
+				}
+			}
+		}
+	}
+
+
+
 	protected abstract class CPListAdapter implements IDialogFieldListener, ITreeListAdapter<CPListElement> {
 		private final Object[] EMPTY_ARR= new Object[0];
 
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/LibrariesWorkbookPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/LibrariesWorkbookPage.java
index 9afee7f..062cd96 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/LibrariesWorkbookPage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/LibrariesWorkbookPage.java
@@ -75,6 +75,7 @@
 import org.eclipse.jdt.internal.ui.jarimport.JarImportWizard;
 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
 import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
+import org.eclipse.jdt.internal.ui.wizards.buildpaths.RootCPListElement.RootNodeChange;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.CheckedListDialogField;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
@@ -170,8 +171,8 @@
 		fLibrariesList.setElements(libelements);
 	}
 	private void updateLibrariesListWithRootNode() {
-		CPListElement rootClasspath = new RootCPListElement(fCurrJProject, NewWizardMessages.PathRootWorkbookPage_classpath,false);
-		CPListElement rootModulepath = new RootCPListElement(fCurrJProject,NewWizardMessages.PathRootWorkbookPage_modulepath,true);
+		RootCPListElement rootClasspath= new RootCPListElement(fCurrJProject, NewWizardMessages.PathRootWorkbookPage_classpath,false);
+		RootCPListElement rootModulepath= new RootCPListElement(fCurrJProject,NewWizardMessages.PathRootWorkbookPage_modulepath,true);
 
 		List<CPListElement> cpelements= fClassPathList.getElements();
 		List<CPListElement> libelements= new ArrayList<>(cpelements.size());
@@ -180,11 +181,11 @@
 		for (int i= 0; i < nElements; i++) {
 			CPListElement cpe= cpelements.get(i);
 			if (isEntryKind(cpe.getEntryKind())) {
-				Object mod = cpe.getAttribute(CPListElement.MODULE);
-				if(mod==null) {
-					((RootCPListElement)rootClasspath).addCPListElement(cpe);
+				Object mod= cpe.getAttribute(CPListElement.MODULE);
+				if(mod == null) {
+					rootClasspath.addCPListElement(cpe);
 				} else {
-					((RootCPListElement)rootModulepath).addCPListElement(cpe);
+					rootModulepath.addCPListElement(cpe);
 				}
 					
 			}
@@ -327,9 +328,9 @@
 
 			for (int i= 0; i < nElementsChosen; i++) {
 				CPListElement curr= libentries[i];
-				boolean contains = cplist.contains(curr);
+				boolean contains= cplist.contains(curr);
 				if(hasRootNodes()) {
-					contains = hasCurrentElement(cplist,curr);
+					contains= hasCurrentElement(cplist,curr);
 				}
 				if (!contains && !elementsToAdd.contains(curr)) {
 					elementsToAdd.add(curr);
@@ -343,32 +344,29 @@
 			
 			if(!hasRootNodes()) {
 				fLibrariesList.addElements(elementsToAdd);
-			}
-			else {
-				// on the new nodes, only additions allowed, rest disabled
+			} else {
+				// on root nodes, only additions allowed, rest disabled
 				List<Object> selectedElements= fLibrariesList.getSelectedElements();
 				List<CPListElement> elements= fLibrariesList.getElements();
-				// if nothing selected, do nothing
-				if(selectedElements.size()==0) {
+				// sanity check, button should only be enabled if exactly one root node is selected 
+				if(selectedElements.size() != 1) {
 					return;
 				}
 				fLibrariesList.removeAllElements();
-				for (int i= 0; i < selectedElements.size(); i++) {
-					if( ((CPListElement)selectedElements.get(i)).isClassPathRootNode()) {
-						for (CPListElement cpListElement : elementsToAdd) {
-							cpListElement.setAttribute(IClasspathAttribute.MODULE, null);
+				RootCPListElement selectedCPElement= (RootCPListElement) selectedElements.get(0);
+				if(selectedCPElement.isClassPathRootNode()) {
+					for (CPListElement cpListElement : elementsToAdd) {
+						cpListElement.setAttribute(IClasspathAttribute.MODULE, null);
+					}
+				} else if(selectedCPElement.isModulePathRootNode()) {
+					for (CPListElement cpListElement : elementsToAdd) {
+						Object attribute= cpListElement.getAttribute(IClasspathAttribute.MODULE);
+						if(attribute == null) {
+							cpListElement.setAttribute(IClasspathAttribute.MODULE, new ModuleEncapsulationDetail[0]);
 						}
 					}
-					if( ((CPListElement)selectedElements.get(i)).isModulePathRootNode()) {
-						for (CPListElement cpListElement : elementsToAdd) {
-							Object attribute= cpListElement.getAttribute(IClasspathAttribute.MODULE);
-							if(attribute == null) {
-								cpListElement.setAttribute(IClasspathAttribute.MODULE, new ModuleEncapsulationDetail[0]);
-							}
-						}
-					}
-					((RootCPListElement)selectedElements.get(i)).addCPListElement(elementsToAdd);					
 				}
+				selectedCPElement.addCPListElement(elementsToAdd);					
 				
 				fLibrariesList.setElements(elements);
 				fLibrariesList.refresh();
@@ -386,7 +384,7 @@
 		//note that the same cpelement with different attribute can be added
 		for (CPListElement cpListElement : cplist) {
 			if(cpListElement.isRootNodeForPath()) {
-				boolean cont =( (RootCPListElement)cpListElement).getChildren().contains(curr);
+				boolean cont= ( (RootCPListElement)cpListElement).getChildren().contains(curr);
 				if(cont == true) {
 					return true;
 				}
@@ -586,9 +584,9 @@
 		}
 		Object elem= selElements.get(0);
 		
-		boolean canEdit = false;
+		boolean canEdit= false;
 		if(hasRootNodes()) {
-			canEdit = ((RootCPListElement)fLibrariesList.getElement(0)).getChildren().indexOf(elem) != -1 || 
+			canEdit= ((RootCPListElement)fLibrariesList.getElement(0)).getChildren().indexOf(elem) != -1 || 
 					((RootCPListElement)fLibrariesList.getElement(1)).getChildren().indexOf(elem) != -1 ;
 			
 		}
@@ -639,13 +637,16 @@
 				}
 			}
 		} else if (key.equals(CPListElement.MODULE)) {
+			boolean wasModular= selElement.getAttribute(CPListElement.MODULE) != null;
 			if (showModuleDialog(getShell(), elem)) {
 				String[] changedAttributes= { CPListElement.MODULE };
 				attributeUpdated(selElement, changedAttributes);
 				if (hasRootNodes()) {
-					Object mod= selElement.getAttribute(CPListElement.MODULE);
-					boolean remove= mod == null;
-					moveCPElementAcrossNode(selElement, remove);
+					boolean isModular= selElement.getAttribute(CPListElement.MODULE) != null;
+					RootNodeChange direction= RootNodeChange.fromOldAndNew(wasModular, isModular);
+					if (direction != RootNodeChange.NoChange) {
+						moveCPElementAcrossNode(fLibrariesList, selElement, direction);
+					}
 				}
 				fLibrariesList.refresh(elem);
 				fClassPathList.dialogFieldChanged(); // validate
@@ -744,9 +745,16 @@
 								Object obj= ((RootCPListElement) cpe).getChildren().get(j);
 								if (obj.equals(elem)) {
 									((RootCPListElement) cpe).getChildren().set(j, curr);
-									int changeNodeLocation= doesElementNeedNodeChange(elem, curr);
-									if (changeNodeLocation != 0) {
-										moveCPElementAcrossNode(curr, changeNodeLocation == -1);
+									RootNodeChange changeNodeDirection= doesElementNeedNodeChange(elem, curr);
+									if (changeNodeDirection != RootNodeChange.NoChange) {
+										moveCPElementAcrossNode(fLibrariesList, curr, changeNodeDirection);
+										CPListElementAttribute moduleAttr= curr.findAttributeElement(CPListElement.MODULE);
+										Object value=  (changeNodeDirection == RootNodeChange.ToModulepath) ? new ModuleEncapsulationDetail[0] : null;
+										if (moduleAttr != null) {
+											moduleAttr.setValue(value);
+										} else {
+											curr.setAttribute(CPListElement.MODULE, value);
+										}
 									}
 									fLibrariesList.dialogFieldChanged();
 									fLibrariesList.refresh();
@@ -767,56 +775,16 @@
 	}
 
 	/**
-	 * @param curr is classpath element
-	 * @param remove if true element needs to be removed from modulepath ( if present) and put in
-	 *            classpath and if false element need to be moved from classpath (if present) to
-	 *            modulepath
-	 */
-	private void moveCPElementAcrossNode(CPListElement curr, boolean remove) {
-		List<CPListElement> elements= fLibrariesList.getElements();
-		CPListElement selElement= curr;
-		//remove from module node or classnode
-		for (CPListElement cpListElement : elements) {
-			if (cpListElement.isRootNodeForPath()) {
-				if ((remove ? cpListElement.isModulePathRootNode() : cpListElement.isClassPathRootNode()) && ((RootCPListElement) cpListElement).getChildren().contains(selElement)) {
-					((RootCPListElement) cpListElement).removeCPListElement(selElement);
-					fLibrariesList.getTreeViewer().remove(selElement);
-					fLibrariesList.dialogFieldChanged();
-				}
-			}
-		}
-		// add to classpath node or module and select the cpe
-		for (CPListElement cpListElement : elements) {
-			if (cpListElement.isRootNodeForPath()) {
-				if (remove ? cpListElement.isClassPathRootNode() : cpListElement.isModulePathRootNode()) {
-					RootCPListElement rootCPListElement= (RootCPListElement) cpListElement;
-					if (rootCPListElement.getChildren().contains(selElement))
-						break;
-					rootCPListElement.addCPListElement(selElement);
-					List<CPListElement> all= fLibrariesList.getElements();
-					fLibrariesList.removeAllElements();
-					fLibrariesList.setElements(all);
-					fLibrariesList.refresh();
-					fLibrariesList.getTreeViewer().expandToLevel(2);
-					fLibrariesList.postSetSelection(new StructuredSelection(selElement));
-					break;
-				}
-			}
-		}
-
-	}
-
-	/**
 	 * @param elem is former cpelement
 	 * @param curr is new cpelement
 	 * @return 0 is no change is required, -1 if modular element is removed, +1 if non-modular element
 	 *         is removed.
 	 */
-	private int doesElementNeedNodeChange(CPListElement elem, CPListElement curr) {
+	private RootNodeChange doesElementNeedNodeChange(CPListElement elem, CPListElement curr) {
 		if (elem.getClasspathEntry().getEntryKind() != IClasspathEntry.CPE_CONTAINER)
-			return 0;
+			return RootNodeChange.NoChange;
 		if (curr.getClasspathEntry().getEntryKind() != IClasspathEntry.CPE_CONTAINER)
-			return 0;
+			return RootNodeChange.NoChange;
 		String v1= null;
 		String v2= null;
 		IVMInstall vm1= JavaRuntime.getVMInstall(elem.getPath());
@@ -831,19 +799,19 @@
 			boolean mod1= JavaModelUtil.is9OrHigher(v1);
 			boolean mod2= JavaModelUtil.is9OrHigher(v2);
 			if (mod1 == true && mod2 == true)
-				return 0;
+				return RootNodeChange.NoChange;
 			if (mod1 == false && mod2 == false)
-				return 0;
+				return RootNodeChange.NoChange;
 			if (mod1 == true && mod2 == false) {
 				// removed module
-				return -1;
+				return RootNodeChange.ToClasspath;
 			}
 			if (mod1 == false && mod2 == true) {
 				//added module
-				return 1;
+				return RootNodeChange.ToModulepath;
 			}
 		}
-		return 0;
+		return RootNodeChange.NoChange;
 	}
 
 	/**
@@ -931,9 +899,9 @@
 
 	private void updateClasspathList() {
 		 List<CPListElement> projelements= fLibrariesList.getElements();
-		 List<CPListElement> flattenedProjElements = new ArrayList<>();
+		 List<CPListElement> flattenedProjElements= new ArrayList<>();
 		 for ( int i =0; i < projelements.size(); i++ ) {
-		 	CPListElement ele = projelements.get(i);
+		 	CPListElement ele= projelements.get(i);
 		 	// if root node, collect the CPList elements
 		 	if(ele.isRootNodeForPath()) {
 		 		ArrayList<Object> children= ((RootCPListElement)ele).getChildren();
@@ -1150,7 +1118,7 @@
 			IPath[] paths= BuildPathDialogAccess.chooseVariableEntries(getShell(), existingPathsArray);
 			if (paths != null) {
 				ArrayList<CPListElement> result= new ArrayList<>();
-				for (int i = 0; i < paths.length; i++) {
+				for (int i= 0; i < paths.length; i++) {
 					IPath path= paths[i];
 					CPListElement elem= createCPVariableElement(path);
 					if (!existingElements.contains(elem)) {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ModuleDialog.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ModuleDialog.java
index 0d1ab2f..66eaa81 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ModuleDialog.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ModuleDialog.java
@@ -545,7 +545,7 @@
 	protected void doSelectionChanged(ListDialogField<? extends ModuleEncapsulationDetail> field) {
 		boolean isModular= fIsModuleCheckbox.isSelected();
 		List<? extends ModuleEncapsulationDetail> selected= field.getSelectedElements();
-		field.enableButton(IDX_ADD, isModular);
+		field.enableButton(IDX_ADD, isModular && fJavaElements != null);
 		field.enableButton(IDX_EDIT, isModular && canEdit(selected));
 		field.enableButton(IDX_REMOVE, isModular && selected.size() > 0);
 		validateDetails(field);
@@ -587,10 +587,14 @@
 	private IStatus computeContentsStatus() {
 		StatusInfo info= new StatusInfo();
 		if (fIsModuleCheckbox.isSelected()) {
-			if (fModuleLists[IDX_INCLUDED].fNames.isEmpty()) {
-				info.setError(NewWizardMessages.ModuleDialog_mustIncludeModule_error);
-			} else if (fModuleLists[IDX_INCLUDED].fNames.size() + fModuleLists[IDX_AVAILABLE].fNames.size() == 1) {
-				info.setInfo(NewWizardMessages.ModuleDialog_cannotLimitSingle_error);
+			if (fJavaElements != null) {
+				if (fModuleLists[IDX_INCLUDED].fNames.isEmpty()) {
+					info.setError(NewWizardMessages.ModuleDialog_mustIncludeModule_error);
+				} else if (fModuleLists[IDX_INCLUDED].fNames.size() + fModuleLists[IDX_AVAILABLE].fNames.size() == 1) {
+					info.setInfo(NewWizardMessages.ModuleDialog_cannotLimitSingle_error);
+				}
+			} else {
+				info.setInfo(NewWizardMessages.ModuleDialog_unknownModules_info);
 			}
 		}
 		return info;
@@ -653,6 +657,9 @@
 				}
 			}
 		}
+		if (status.isOK() && fJavaElements == null) {
+			status.setInfo(NewWizardMessages.ModuleDialog_cannotEditDetails_info);
+		}
 		return status;
 	}
 
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ProjectsWorkbookPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ProjectsWorkbookPage.java
index f47c6e0..3fc6731 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ProjectsWorkbookPage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ProjectsWorkbookPage.java
@@ -44,6 +44,7 @@
 import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider;
 import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
+import org.eclipse.jdt.internal.ui.wizards.buildpaths.RootCPListElement.RootNodeChange;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField;
@@ -135,8 +136,8 @@
 		return false;
 	}
 	private void updateProjectsListWithRootNode() {
-		CPListElement rootClasspath = new RootCPListElement(fCurrJProject, NewWizardMessages.PathRootWorkbookPage_classpath,false);
-		CPListElement rootModulepath =  new RootCPListElement(fCurrJProject,NewWizardMessages.PathRootWorkbookPage_modulepath,true);
+		RootCPListElement rootClasspath = new RootCPListElement(fCurrJProject, NewWizardMessages.PathRootWorkbookPage_classpath,false);
+		RootCPListElement rootModulepath =  new RootCPListElement(fCurrJProject,NewWizardMessages.PathRootWorkbookPage_modulepath,true);
 
 		// add the projects-cpentries that are already on the class path
 		List<CPListElement> cpelements= fClassPathList.getElements();
@@ -148,9 +149,9 @@
 			if (isEntryKind(cpelem.getEntryKind())) {
 				Object mod= cpelem.getAttribute(CPListElement.MODULE);
 				if(mod == null) {
-					((RootCPListElement)rootClasspath).addCPListElement(cpelem);
+					rootClasspath.addCPListElement(cpelem);
 				} else {
-					((RootCPListElement)rootModulepath).addCPListElement(cpelem);
+					rootModulepath.addCPListElement(cpelem);
 				}
 			}
 		}
@@ -471,50 +472,24 @@
 	private void editAttributeEntry(CPListElementAttribute elem) {
 		String key= elem.getKey();
 		boolean needRefresh= false;
+		boolean wasModular= false;
 		if (key.equals(CPListElement.ACCESSRULES)) {
 			showAccessRestrictionDialog(elem.getParent());
 		} else if (key.equals(CPListElement.MODULE)) {
+			wasModular= elem.getValue() != null;
 			needRefresh= showModuleDialog(getShell(), elem);
 		} else {
 			needRefresh= editCustomAttribute(getShell(), elem);
 		}
 		if (needRefresh) {
 			if (key.equals(CPListElement.MODULE) && hasRootNodes()) {
-				// if module attribute is changed, the element 
-				// may change nodes
+				// if module attribute is changed, the element may change nodes
 				CPListElement selElement= elem.getParent();
-				Object mod= selElement.getAttribute(CPListElement.MODULE);
-				boolean remove= mod == null;
-				List<CPListElement> elements= fProjectsList.getElements();
-				//remove from module node or classnode
-				for (CPListElement cpListElement : elements) {
-					if (cpListElement.isRootNodeForPath()) {
-						if ((remove ? cpListElement.isModulePathRootNode() : cpListElement.isClassPathRootNode()) && ((RootCPListElement) cpListElement).getChildren().contains(selElement)) {
-							((RootCPListElement) cpListElement).removeCPListElement(selElement);
-							fProjectsList.getTreeViewer().remove(selElement);
-							fProjectsList.dialogFieldChanged();
-						}
-					}
+				boolean isModular= selElement.getAttribute(CPListElement.MODULE) != null;
+				RootNodeChange changeDirection= RootNodeChange.fromOldAndNew(wasModular, isModular);
+				if (changeDirection != RootNodeChange.NoChange) {
+					moveCPElementAcrossNode(fProjectsList, selElement, changeDirection);
 				}
-				// add to classpath node or module and select the cpe
-				for (CPListElement cpListElement : elements) {
-					if (cpListElement.isRootNodeForPath()) {
-						if (remove ? cpListElement.isClassPathRootNode() : cpListElement.isModulePathRootNode()) {
-							RootCPListElement rootCPListElement= (RootCPListElement) cpListElement;
-							if (rootCPListElement.getChildren().contains(cpListElement))
-								break;
-							rootCPListElement.addCPListElement(selElement);
-							List<CPListElement> all= fProjectsList.getElements();
-							fProjectsList.removeAllElements();
-							fProjectsList.setElements(all);
-							fProjectsList.refresh();
-							fProjectsList.getTreeViewer().expandToLevel(2);
-							fProjectsList.getTreeViewer().setSelection(new StructuredSelection(selElement));
-							break;
-						}
-					}
-				}
-
 			}
 			fProjectsList.refresh(elem);
 			fClassPathList.dialogFieldChanged(); // validate
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/RootCPListElement.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/RootCPListElement.java
index e99460c..74385c3 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/RootCPListElement.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/RootCPListElement.java
@@ -24,6 +24,20 @@
  */
 public class RootCPListElement extends CPListElement {
 
+	enum RootNodeChange {
+		ToModulepath, ToClasspath, NoChange;
+
+		static RootNodeChange fromOldAndNew(boolean wasModular, boolean isModular) {
+			if (wasModular == isModular) {
+				return NoChange;
+			} else if (isModular) {
+				return ToModulepath;
+			} else {
+				return ToClasspath;
+			}
+		}
+	}
+
 	private String fPathRootNodeName= null;
 
 	private boolean fIsModuleRootNode;
@@ -48,23 +62,15 @@
 	}
 
 	void addCPListElement(CPListElement cpe) {
-		if (isRootNodeForPath()) {
-			fChildren.add(cpe);
-		}
+		fChildren.add(cpe);
 	}
 
 	void addCPListElement(List<CPListElement> elementsToAdd) {
-		if (isRootNodeForPath()) {
-			fChildren.addAll(elementsToAdd);
-		}
+		fChildren.addAll(elementsToAdd);
 	}
 
 	ArrayList<Object> getChildren() {
-		if (isRootNodeForPath()) {
-			return fChildren;
-		} else {
-			return null;
-		}
+		return fChildren;
 	}
 
 	String getPathRootNodeName() {
@@ -86,9 +92,15 @@
 		return !fIsModuleRootNode;
 	}
 
+	public boolean isSourceRootNode(RootNodeChange changeNodeDirection) {
+		return RootNodeChange.fromOldAndNew(fIsModuleRootNode, !fIsModuleRootNode) == changeNodeDirection;
+	}
+
+	public boolean isTargetRootNode(RootNodeChange changeNodeDirection) {
+		return RootNodeChange.fromOldAndNew(!fIsModuleRootNode, fIsModuleRootNode) == changeNodeDirection;
+	}
+
 	void removeCPListElement(CPListElement element) {
-		if (isRootNodeForPath()) {
-			fChildren.remove(element);
-		}
+		fChildren.remove(element);
 	}
 }
