*** empty log message ***
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageObject.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageObject.java
index 02f9887..4ad3a79 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageObject.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageObject.java
@@ -15,7 +15,6 @@
 
 import org.eclipse.jdt.core.*;
 import org.eclipse.osgi.util.*;
-import org.osgi.framework.*;
 
 public class ExportPackageObject implements Serializable {
     
@@ -24,12 +23,14 @@
     private String fVersionAttribute;
     private String name;
     private String version;
+    private boolean internal;
     private transient ManifestElement element;
     
     public ExportPackageObject(ManifestElement element, String versionAttribute) {
         fVersionAttribute = versionAttribute;
         name = element.getValue();
         version = element.getAttribute(fVersionAttribute);
+        internal = "true".equals(element.getDirective("x-internal"));
         this.element = element;
     }
     
@@ -62,6 +63,9 @@
             buffer.append(version.trim());
             buffer.append("\"");
         }
+        if (internal)
+            buffer.append(";x-internal:=true");
+
         if (element == null)
             return buffer.toString();
         
@@ -78,11 +82,12 @@
                 buffer.append("\"");
             }
         }
+        
         Enumeration directives = element.getDirectiveKeys();
         if (directives != null) {
             while (directives.hasMoreElements()) {
                 String directive = directives.nextElement().toString();
-                if (directive.equals(Constants.RESOLUTION_DIRECTIVE))
+                if (directive.equals("x-internal"))
                     continue;
                 buffer.append(";");
                 buffer.append(directive);
@@ -111,4 +116,12 @@
         this.version = version;
     }
 
+    public boolean isInternal() {
+        return internal;
+    }
+
+    public void setInternal(boolean internal) {
+        this.internal = internal;
+    }
+
 }
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageSection.java
index 891d280..f16c91b 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageSection.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageSection.java
@@ -111,9 +111,9 @@
 				parent,
 				Section.DESCRIPTION,
 				new String[] {"Add...", "Remove", "Properties..."}); 
-		getSection().setText("Required Packages"); 
+		getSection().setText("Exported Packages"); 
 		getSection()
-				.setDescription("You can specify packages this plug-in depends on without explicitly restricting what plug-ins they must come from."); 
+				.setDescription("Enumerate all the packages that this plug-in exposes to clients.  All other packages will be hidden from clients at all times."); 
 		getTablePart().setEditable(false);
 	}
 
@@ -172,6 +172,13 @@
         return false;
     }
     
+    public void dispose() {
+        IBundleModel model = getBundleModel();
+        if (model != null)
+            model.removeModelChangedListener(this);
+        super.dispose();
+    }
+        
     protected void doPaste() {
     }
 
@@ -216,15 +223,12 @@
         if (dialog.open() == DependencyPropertiesDialog.OK && isEditable()) {
              exportObject.setVersion(dialog.getVersion());
              writeExportPackageHeader();
-             fPackageViewer.refresh(exportObject);
          }
     }
 
 	private void handleRemove() {
 		IStructuredSelection ssel = (IStructuredSelection) fPackageViewer.getSelection();
-		Object[] items = ssel.toArray();
-		fPackageViewer.remove(items);
-		removeExportPackages(items);
+		removeExportPackages(ssel.toArray());
 	}
 
 	private void removeExportPackages(Object[] removed) {
@@ -250,7 +254,6 @@
                         IPackageFragment candidate = (IPackageFragment) selected[i];
                         ExportPackageObject p = new ExportPackageObject(candidate, getVersionAttribute());
                         fPackages.put(p.getName(), p);
-                        fPackageViewer.add(p);
                     }
                     if (selected.length > 0) {
                         writeExportPackageHeader();
@@ -271,7 +274,7 @@
         return vector;
     }
 
-	private void writeExportPackageHeader() {
+	public void writeExportPackageHeader() {
 		StringBuffer buffer = new StringBuffer();
 		if (fPackages != null) {
             Iterator iter = fPackages.values().iterator();
@@ -287,14 +290,15 @@
 
 	public void modelChanged(IModelChangedEvent event) {
 		if (event.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
+            fPackages = null;
 			markStale();
 			return;
 		}
-		refresh();
+        if (event.getChangedProperty().equals(getExportedPackageHeader()))
+            refresh();
 	}
 
 	public void refresh() {
-		fPackages = null;
 		fPackageViewer.refresh();
 		super.refresh();
 	}
@@ -352,11 +356,9 @@
         return (manifestVersion < 2) ? Constants.PACKAGE_SPECIFICATION_VERSION : Constants.VERSION_ATTRIBUTE;
     }
  
-    private String getExportedPackageHeader() {
+    public String getExportedPackageHeader() {
         int manifestVersion = BundlePluginBase.getBundleManifestVersion(getBundle());
         return (manifestVersion < 2) ? ICoreConstants.PROVIDE_PACKAGE : Constants.EXPORT_PACKAGE;
     }
 
-    
- 
 }
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageVisibilitySection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageVisibilitySection.java
index 618cb01..0c3766a 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageVisibilitySection.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageVisibilitySection.java
@@ -14,8 +14,10 @@
 import org.eclipse.jface.viewers.*;
 import org.eclipse.pde.core.*;
 import org.eclipse.pde.core.plugin.*;
+import org.eclipse.pde.internal.core.ibundle.*;
 import org.eclipse.pde.internal.ui.*;
 import org.eclipse.pde.internal.ui.editor.*;
+import org.eclipse.pde.internal.ui.editor.context.*;
 import org.eclipse.pde.internal.ui.elements.*;
 import org.eclipse.pde.internal.ui.parts.*;
 import org.eclipse.swt.*;
@@ -39,6 +41,7 @@
 	private TableViewer fPackageExportViewer;
     private Action fAddAction;
     private Action fRemoveAction;
+    private ExportPackageSection fMaster;
 	
 	class TableContentProvider extends DefaultContentProvider
 			implements IStructuredContentProvider {
@@ -62,11 +65,12 @@
 		}
 	}
     
-	public ExportPackageVisibilitySection(PDEFormPage formPage, Composite parent) {
+	public ExportPackageVisibilitySection(PDEFormPage formPage, Composite parent, ExportPackageSection master) {
 		super(formPage, parent, Section.DESCRIPTION, new String[]{
 				PDEPlugin.getResourceString(KEY_ADD),
 				PDEPlugin.getResourceString(KEY_REMOVE)});
 		handleDefaultButton = false;
+        fMaster = master;
 	}
     
 	public void createClient(Section section, FormToolkit toolkit) {
@@ -83,8 +87,7 @@
         createPackageViewer(container, toolkit);       
         makeActions();
         
-        IPluginModelBase model = (IPluginModelBase) getPage().getModel();
-        model.addModelChangedListener(this);
+        getBundleModel().addModelChangedListener(this);
         
         section.setLayoutData(new GridData(GridData.FILL_BOTH));
 		section.setClient(container);
@@ -147,8 +150,8 @@
 	}
     
 	public void dispose() {
-		IPluginModelBase model = (IPluginModelBase) getPage().getModel();
-		if (model!=null)
+		IBundleModel model = getBundleModel();
+		if (model != null)
 			model.removeModelChangedListener(this);
 		super.dispose();
 	}
@@ -168,7 +171,8 @@
 			markStale();
 			return;
 		}
-		refresh();
+        if (e.getChangedProperty().equals(fMaster.getExportedPackageHeader()))
+            refresh();
 	}
 
 	public void refresh() {
@@ -178,5 +182,13 @@
 	public void selectionChanged(IFormPart source, ISelection selection) {
 	}
     
-	
+    private BundleInputContext getBundleContext() {
+        InputContextManager manager = getPage().getPDEEditor().getContextManager();
+        return (BundleInputContext) manager.findContext(BundleInputContext.CONTEXT_ID);
+    }
+    
+    private IBundleModel getBundleModel() {
+        BundleInputContext context = getBundleContext();
+        return (context != null) ? (IBundleModel)context.getModel() : null;       
+    }
 }
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ImportPackageSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ImportPackageSection.java
index 7751c11..32c1254 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ImportPackageSection.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ImportPackageSection.java
@@ -169,6 +169,13 @@
         return false;
     }
     
+    public void dispose() {
+        IBundleModel model = getBundleModel();
+        if (model != null)
+            model.removeModelChangedListener(this);
+        super.dispose();
+    }
+    
     protected void doPaste() {
     }
 
@@ -214,15 +221,12 @@
             importObject.setOptional(dialog.isOptional());
             importObject.setVersion(dialog.getVersion());
             writeImportPackages();
-            fPackageViewer.refresh(importObject);
          }
     }
 
 	private void handleRemove() {
 		IStructuredSelection ssel = (IStructuredSelection) fPackageViewer.getSelection();
-		Object[] items = ssel.toArray();
-		fPackageViewer.remove(items);
-		removeImportPackages(items);
+		removeImportPackages(ssel.toArray());
 	}
 
 	/**
@@ -252,7 +256,6 @@
 				ExportPackageDescription candidate = (ExportPackageDescription) selected[i];
 				ImportPackageObject p = new ImportPackageObject(candidate, getVersionAttribute());
                 fPackages.put(p.getName(), p);
-                fPackageViewer.add(p);
             }
 			if (selected.length > 0) {
 				writeImportPackages();
@@ -297,13 +300,14 @@
 	public void modelChanged(IModelChangedEvent event) {
 		if (event.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
 			markStale();
+            fPackages = null;
 			return;
 		}
-		refresh();
+        if (event.getChangedProperty().equals(Constants.IMPORT_PACKAGE))
+            refresh();
 	}
 
 	public void refresh() {
-		fPackages = null;
 		fPackageViewer.refresh();
 		super.refresh();
 	}
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/RuntimePage.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/RuntimePage.java
index 897c491..959ed32 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/RuntimePage.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/RuntimePage.java
@@ -39,8 +39,9 @@
         form.getBody().setLayout(layout);
 		
         if (isBundle()) {
-            mform.addPart(new ExportPackageSection(this, form.getBody()));
-            mform.addPart(new ExportPackageVisibilitySection(this, form.getBody()));
+            ExportPackageSection section = new ExportPackageSection(this, form.getBody());
+            mform.addPart(section);
+            mform.addPart(new ExportPackageVisibilitySection(this, form.getBody(), section));
             mform.addPart(new LibrarySection(this, form.getBody()));
         } else {
             mform.addPart(new LibrarySection(this, form.getBody()));		
diff --git a/ui/org.eclipse.pde.ui/src_Forms/org/eclipse/pde/internal/ui/model/bundle/Bundle.java b/ui/org.eclipse.pde.ui/src_Forms/org/eclipse/pde/internal/ui/model/bundle/Bundle.java
index a89be6a..91dfc4e 100644
--- a/ui/org.eclipse.pde.ui/src_Forms/org/eclipse/pde/internal/ui/model/bundle/Bundle.java
+++ b/ui/org.eclipse.pde.ui/src_Forms/org/eclipse/pde/internal/ui/model/bundle/Bundle.java
@@ -101,6 +101,7 @@
 	 */
 	public void setHeader(String key, String value) {
 		ManifestHeader header = (ManifestHeader)fDocumentHeaders.get(key);
+        String old = header == null ? null : header.getValue();
 		if (header == null) {
 			header = new ManifestHeader();
 		}
@@ -108,7 +109,7 @@
 		header.setValue(value);
 		fDocumentHeaders.put(key, header);
 		
-		fModel.fireModelObjectChanged(header, key, null, value);
+		fModel.fireModelObjectChanged(header, key, old, value);
 	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.pde.internal.core.ibundle.IBundle#getHeader(java.lang.String)