diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
index d8d1779..43c431f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
@@ -11,14 +11,33 @@
 import static com.google.inject.name.Names.named;
 import static org.eclipse.ui.PlatformUI.isWorkbenchRunning;
 
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
+import org.eclipse.xtext.ui.LanguageSpecific;
+import org.eclipse.xtext.ui.editor.IURIEditorOpener;
+import org.eclipse.xtext.ui.editor.IXtextEditorCallback;
+import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
+import org.eclipse.xtext.ui.editor.outline.actions.IOutlineContribution;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
+
 import com.google.eclipse.protobuf.scoping.IFileUriResolver;
 import com.google.eclipse.protobuf.ui.builder.AutoAddNatureEditorCallback;
+import com.google.eclipse.protobuf.ui.documentation.ProtobufDocumentationProvider;
 import com.google.eclipse.protobuf.ui.editor.ProtobufUriEditorOpener;
 import com.google.eclipse.protobuf.ui.editor.hyperlinking.ProtobufHyperlinkDetector;
 import com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider;
-import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.*;
+import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.HighlightingConfiguration;
+import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.ProtobufSemanticHighlightingCalculator;
 import com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
-import com.google.eclipse.protobuf.ui.outline.*;
+import com.google.eclipse.protobuf.ui.outline.LinkWithEditor;
+import com.google.eclipse.protobuf.ui.outline.ProtobufOutlinePage;
 import com.google.eclipse.protobuf.ui.preferences.PreferenceStoreAccess;
 import com.google.eclipse.protobuf.ui.preferences.pages.compiler.CompilerPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.pages.general.GeneralPreferenceStoreInitializer;
@@ -27,17 +46,6 @@
 import com.google.eclipse.protobuf.ui.validation.ValidateOnActivation;
 import com.google.inject.Binder;
 
-import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
-import org.eclipse.ui.*;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.xtext.ui.LanguageSpecific;
-import org.eclipse.xtext.ui.editor.*;
-import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
-import org.eclipse.xtext.ui.editor.outline.actions.IOutlineContribution;
-import org.eclipse.xtext.ui.editor.preferences.*;
-import org.eclipse.xtext.ui.editor.syntaxcoloring.*;
-
 /**
  * Use this class to register components to be used within the IDE.
  *
@@ -119,4 +127,8 @@
   public void configureHighlightingConfiguration(Binder binder) {
     binder.bind(IHighlightingConfiguration.class).to(HighlightingConfiguration.class);
   }
+
+  public void configureEObjectDocumentationProvider(Binder binder) {
+    binder.bind(IEObjectDocumentationProvider.class).to(ProtobufDocumentationProvider.class);
+  }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/ProtobufDocumentationProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/ProtobufDocumentationProvider.java
new file mode 100644
index 0000000..b4e270e
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/ProtobufDocumentationProvider.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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
+ */
+package com.google.eclipse.protobuf.ui.documentation;
+
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
+import org.eclipse.xtext.documentation.impl.MultiLineCommentDocumentationProvider;
+
+import com.google.inject.Inject;
+
+/**
+ * Provides single-line and multi-line comments as documentation of a protobuf element.
+ *
+ * @author Alex Ruiz
+ */
+public class ProtobufDocumentationProvider implements IEObjectDocumentationProvider {
+
+  private final List<IEObjectDocumentationProvider> delegates = new ArrayList<IEObjectDocumentationProvider>();
+
+  @Inject
+  public ProtobufDocumentationProvider(SingleLineDocumentationProvider p1, MultiLineCommentDocumentationProvider p2) {
+    delegates.add(p1);
+    delegates.add(p2);
+  }
+
+
+  /** {@inheritDoc} */
+  public String getDocumentation(EObject o) {
+    for (IEObjectDocumentationProvider p: delegates) {
+      String documentation = p.getDocumentation(o);
+      if (!(isEmpty(documentation))) return documentation;
+    }
+    return "";
+  }
+
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SingleLineDocumentationProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SingleLineDocumentationProvider.java
new file mode 100644
index 0000000..e74b45d
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SingleLineDocumentationProvider.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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
+ */
+package com.google.eclipse.protobuf.ui.documentation;
+
+import static org.eclipse.xtext.nodemodel.util.NodeModelUtils.getNode;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.TerminalRule;
+import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
+import org.eclipse.xtext.nodemodel.*;
+
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.scoping.ProtoDescriptor;
+import com.google.eclipse.protobuf.scoping.ProtoDescriptorProvider;
+import com.google.inject.Inject;
+
+/**
+ * Provides single line comments of a protobuf element as its documentation when hovered.
+ *
+ * @author Alex Ruiz
+ */
+public class SingleLineDocumentationProvider implements IEObjectDocumentationProvider {
+
+  @Inject private ProtoDescriptorProvider descriptorProvider;
+
+  private static final String RULE_NAME = "SL_COMMENT";
+
+  public String getDocumentation(EObject o) {
+    String comment = findComment(o);
+    return comment != null ? comment : "";
+  }
+
+  private String findComment(EObject o) {
+    EObject target = findRealTarget(o);
+    ICompositeNode node = getNode(target);
+    if (node == null) return null;
+    StringBuilder commentBuilder = new StringBuilder();
+    for (INode currentNode : node.getAsTreeIterable()) {
+      if (currentNode instanceof ILeafNode && !((ILeafNode) currentNode).isHidden()) break;
+      if (currentNode instanceof ILeafNode && isSingleLineCommentTerminalRule(currentNode.getGrammarElement())) {
+        String comment = ((ILeafNode) currentNode).getText();
+        commentBuilder.append(cleanUp(comment));
+      }
+    }
+    return commentBuilder.toString();
+  }
+
+  private EObject findRealTarget(EObject o) {
+    if (o instanceof Option) {
+      ProtoDescriptor descriptor = descriptorProvider.get();
+      Property p = descriptor.lookupOption(((Option) o).getName());
+      return p != null ? p : o;
+    }
+    if (o instanceof FieldOption) {
+      ProtoDescriptor descriptor = descriptorProvider.get();
+      Property p = descriptor.lookupFieldOption(((FieldOption) o).getName());
+      return p != null ? p : o;
+    }
+    return o;
+  }
+
+  private boolean isSingleLineCommentTerminalRule(EObject o) {
+    if (!(o instanceof TerminalRule)) return false;
+    TerminalRule rule = (TerminalRule) o;
+    return RULE_NAME.equalsIgnoreCase(rule.getName());
+  }
+
+  private String cleanUp(String comment) {
+    return comment.replaceFirst("//\\s*", "").replaceAll("\\r\\n", " ").replaceAll("\\n", " ");
+  }
+}
