diff --git a/com.google.eclipse.protobuf.ui/icons/imports.gif b/com.google.eclipse.protobuf.ui/icons/imports.gif
new file mode 100644
index 0000000..b0e9130
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/icons/imports.gif
Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/icons/option.gif b/com.google.eclipse.protobuf.ui/icons/option.gif
index 9d8c615..557ea83 100644
--- a/com.google.eclipse.protobuf.ui/icons/option.gif
+++ b/com.google.eclipse.protobuf.ui/icons/option.gif
Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/icons/options.gif b/com.google.eclipse.protobuf.ui/icons/options.gif
new file mode 100644
index 0000000..bdef879
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/icons/options.gif
Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/icons/protobuf.gif b/com.google.eclipse.protobuf.ui/icons/protobuf.gif
deleted file mode 100644
index 5f161d9..0000000
--- a/com.google.eclipse.protobuf.ui/icons/protobuf.gif
+++ /dev/null
Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
index 7fe0ced..898e21d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
@@ -28,6 +28,7 @@
 @Singleton
 public class Images {
 
+  private static final String GIF_EXTENSION = ".gif";
   private static final String DEFAULT_IMAGE = "empty.gif";
 
   private static final Map<Modifier, String> IMAGES_BY_MODIFIER = new HashMap<Modifier, String>();
@@ -47,22 +48,24 @@
     IMAGES_BY_TYPE.put(Message.class, "message.gif");
     IMAGES_BY_TYPE.put(Option.class, "option.gif");
     IMAGES_BY_TYPE.put(Package.class, "package.gif");
-    IMAGES_BY_TYPE.put(Protobuf.class, "protobuf.gif");
     IMAGES_BY_TYPE.put(Rpc.class, "rpc.gif");
     IMAGES_BY_TYPE.put(Service.class, "service.gif");
     IMAGES_BY_TYPE.put(Syntax.class, "syntax.gif");
   }
 
-  private static final List<String> STANDALONE_IMAGES = asList("extensions.gif");
+  private static final List<String> STANDALONE_IMAGES = asList("extensions.gif", "imports.gif", "options.gif");
 
   public String imageFor(Object o) {
+    if (o instanceof Keyword) {
+      Keyword k = (Keyword) o;
+      return imageFor(k);
+    }
     if (o instanceof Property) {
       Property p = (Property) o;
       return imageFor(p.getModifier());
     }
-    if (o instanceof Keyword) {
-      Keyword k = (Keyword) o;
-      return imageFor(k);
+    if (o instanceof String) {
+      return o + GIF_EXTENSION;
     }
     return imageFor(o.getClass());
   }
@@ -80,7 +83,7 @@
     Modifier m = Modifier.getByName(value);
     String image = IMAGES_BY_MODIFIER.get(m);
     if (image != null) return image;
-    String imageName = value + ".gif";
+    String imageName = value + GIF_EXTENSION;
     if (IMAGES_BY_TYPE.containsValue(imageName) || STANDALONE_IMAGES.contains(imageName)) return imageName;
     return DEFAULT_IMAGE;
   }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
index a13a9b1..189f736 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
@@ -8,14 +8,14 @@
  */
 package com.google.eclipse.protobuf.ui.labeling;
 
-import static com.google.eclipse.protobuf.scoping.ProtobufImportUriResolver.URI_PREFIX;
 import static org.eclipse.jface.viewers.StyledString.DECORATIONS_STYLER;
 
 import org.eclipse.jface.viewers.StyledString;
 
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.ui.util.Properties;
-import com.google.inject.*;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
 
 /**
  * Registry of commonly used text in the 'Protocol Buffer' editor.
@@ -44,10 +44,6 @@
       Property p = (Property) o;
       return labelFor(p);
     }
-    if (o instanceof Protobuf) {
-      Protobuf p = (Protobuf) o;
-      return labelFor(p);
-    }
     if (o instanceof Rpc) {
       Rpc r = (Rpc) o;
       return labelFor(r);
@@ -60,9 +56,7 @@
   }
 
   private Object labelFor(Import i) {
-    String uri = i.getImportURI();
-    if (uri == null || !uri.startsWith(URI_PREFIX)) return uri;
-    return uri.substring(URI_PREFIX.length());
+    return i.getImportURI();
   }
 
   private Object labelFor(Literal l) {
@@ -79,11 +73,6 @@
     return text;
   }
 
-  private Object labelFor(Protobuf p) {
-    // TODO show this text till I figure out how to hide 'Protobuf' node in outline view
-    return "Protocol Buffer";
-  }
-
   private Object labelFor(Rpc r) {
     StyledString text = new StyledString(r.getName());
     String types = String.format(" : %s > %s", messageName(r.getArgType()), messageName(r.getReturnType()));
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlinePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlinePage.java
index 493b16b..6d26481 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlinePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlinePage.java
@@ -8,7 +8,17 @@
  */
 package com.google.eclipse.protobuf.ui.outline;
 
-import org.eclipse.xtext.ui.editor.outline.impl.OutlinePage;
+import static com.google.common.collect.Collections2.filter;
+import static com.google.common.collect.Lists.newArrayList;
+import static java.util.Collections.singletonList;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.xtext.ui.editor.outline.IOutlineNode;
+import org.eclipse.xtext.ui.editor.outline.impl.*;
+
+import com.google.common.base.Predicate;
 
 /**
  * Outline Page for Protocol Buffer editors.
@@ -17,11 +27,30 @@
  */
 public class ProtobufOutlinePage extends OutlinePage {
 
-  /**
-   * Indicates that the root node and its immediate children of the Outline View need to be expanded.
-   * @return 3.
-   */
-  @Override protected int getDefaultExpansionLevel() {
-    return 3;
+  @Override protected List<IOutlineNode> getInitiallyExpandedNodes() {
+    IOutlineNode rootNode = getTreeProvider().createRoot(getXtextDocument());
+    List<IOutlineNode> nodes = newArrayList(rootNode);
+    addChildrenToExpand(singletonList(rootNode), nodes, 3);
+    return nodes;
+  }
+
+  private void addChildrenToExpand(Collection<IOutlineNode> parents, List<IOutlineNode> nodes, int depth) {
+    if (depth < 1) return;
+    for (IOutlineNode parent : parents) {
+      Collection<IOutlineNode> children = childrenToExpand(parent);
+      nodes.addAll(children);
+      addChildrenToExpand(children, nodes, depth - 1);
+    }
+  }
+
+  private Collection<IOutlineNode> childrenToExpand(IOutlineNode parent) {
+    if (parent instanceof DocumentRootNode) {
+      return filter(parent.getChildren(), new Predicate<IOutlineNode>() {
+        public boolean apply(IOutlineNode node) {
+          return !(node instanceof EStructuralFeatureNode);
+        }
+      });
+    }
+    return parent.getChildren();
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java
index 412134b..6d1ed58 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java
@@ -8,11 +8,15 @@
  */
 package com.google.eclipse.protobuf.ui.outline;
 
+import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.*;
+
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.ui.editor.outline.IOutlineNode;
 import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider;
+import org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode;
 
 import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.protobuf.Package;
 
 /**
  * Customization of the default outline structure.
@@ -29,6 +33,24 @@
     return true;
   }
 
+  protected void _createChildren(DocumentRootNode parentNode, Protobuf protobuf) {
+    Package aPackage = protobuf.getPackage();
+    if (aPackage != null) {
+      createNode(parentNode, aPackage);
+    }
+    if (!protobuf.getImports().isEmpty()) {
+      createEStructuralFeatureNode(parentNode, protobuf, PROTOBUF__IMPORTS,
+          labelProvider.getImage("imports"), "import declarations", false);
+    }
+    if (!protobuf.getOptions().isEmpty()) {
+      createEStructuralFeatureNode(parentNode, protobuf, PROTOBUF__OPTIONS,
+          labelProvider.getImage("options"), "option declarations", false);
+    }
+    for (ProtobufElement e : protobuf.getElements()) {
+      createNode(parentNode, e);
+    }
+  }
+
   @Override protected void createNode(IOutlineNode parent, EObject modelElement) {
     if (modelElement instanceof MessageReference) return;
     super.createNode(parent, modelElement);
