diff --git a/src/main/java/com/googlesource/gerrit/plugins/chound/client/LabelPanel.java b/src/main/java/com/googlesource/gerrit/plugins/chound/client/LabelPanel.java
index 1fb3a28..cd3fcfe 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chound/client/LabelPanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chound/client/LabelPanel.java
@@ -24,10 +24,12 @@
 import com.google.gwt.regexp.shared.MatchResult;
 import com.google.gwt.regexp.shared.RegExp;
 import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Grid;
 import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.InlineHyperlink;
-import com.google.gwt.user.client.ui.InlineLabel;
+import com.google.gwt.user.client.ui.Label;
+
 import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwtexpui.clippy.client.CopyableLabel;
 
 public class LabelPanel extends VerticalPanel {
   static class Factory implements Panel.EntryPoint {
@@ -44,61 +46,66 @@
         panel.getObject(GerritUiExtensionPoint.Key.REVISION_INFO).cast();
 
     new RestApi("changes").id(change.id()).view("revisions").id(rev.id())
-    .view("commit")
-    .get(new AsyncCallback<CommitInfo>() {
-      @Override
-      public void onSuccess(CommitInfo result) {
-        if (result != null) {
-          displayDependsOn(result);
-        }
-      }
+        .view("commit").get(new AsyncCallback<CommitInfo>() {
+          @Override
+          public void onSuccess(CommitInfo result) {
+            if (result != null) {
+              displayDependsOn(result);
+            }
+          }
 
-      @Override
-      public void onFailure(Throwable caught) {
-        // never invoked
-      }
-    });
+          @Override
+          public void onFailure(Throwable caught) {
+            // never invoked
+          }
+        });
 
     new RestApi("changes").view("?q=message:" + change.changeId())
-    .view("+NOT+change:" + change.changeId())
-    .get(new AsyncCallback<NativeMap<ChangeInfo>>() {
-      @Override
-      public void onSuccess(NativeMap<ChangeInfo> result) {
-        if (!result.isEmpty()) {
-          displayNeededBy(result);
-        }
-      }
+        .view("+NOT+change:" + change.changeId())
+        .get(new AsyncCallback<NativeMap<ChangeInfo>>() {
+          @Override
+          public void onSuccess(NativeMap<ChangeInfo> result) {
+            if (!result.isEmpty()) {
+              displayNeededBy(result);
+            }
+          }
 
-      @Override
-      public void onFailure(Throwable caught) {
-        // never invoked
-      }
-    });
+          @Override
+          public void onFailure(Throwable caught) {
+            // never invoked
+          }
+        });
   }
 
   private void displayDependsOn(CommitInfo result) {
+    int row = 0;
+    int column = 1;
+    Grid grid = new Grid(row, column);
     String message = result.message();
     if (message.toLowerCase().contains("depends-on:")) {
-      HorizontalPanel p = new HorizontalPanel();
-      p.add(new InlineLabel("Depends-on"));
       MatchResult matcher;
-      RegExp pattern = RegExp.compile("[Dd]epends-[Oo]n:? (I[0-9a-f]{8,40})", "g");
+      RegExp pattern =
+          RegExp.compile("[Dd]epends-[Oo]n:? (I[0-9a-f]{8,40})", "g");
       while ((matcher = pattern.exec(message)) != null) {
-        p.add(new InlineLabel(matcher.getGroup(1)));
+        grid.insertRow(row);
+        HorizontalPanel p = new HorizontalPanel();
+        p.addStyleName("infoBlock");
+        p.add(new Label("Depends-on"));
+        p.add(new CopyableLabel(matcher.getGroup(1)));
+        grid.setWidget(row, 0, p);
+        row++;
       }
-      add(p);
+      add(grid);
     }
   }
 
   private void displayNeededBy(NativeMap<ChangeInfo> result) {
     HorizontalPanel p = new HorizontalPanel();
-    InlineLabel il = new InlineLabel("Needed-by");
-    p.add(il);
+    p.addStyleName("infoBlock");
+    p.add(new Label("Needed-by"));
     for (String key : result.keySet()) {
-      InlineHyperlink ih = new InlineHyperlink(
-          result.get(key).changeId(), "/c/" + result.get(key)._number());
-      p.add(ih);
+      p.add(new CopyableLabel(result.get(key).changeId()));
     }
     add(p);
   }
-}
\ No newline at end of file
+}
