@jerith True, WidgetRow and WidgetContained can be done in setup. However, DashboardPage cannot, since it depends on whether the dashboard was accessed via the shared url or not. I don't think this is an issue, because Dashboard contains the bulk of the dashboard element setup. DashboardPage is only used to render the dashboard page as a shared or non-shared page. I guess I could keep two instances of a dashboard page (the shared one and non-shared one) for each dashboard, but it feels a bit unnecessary if the DashboardPage rendering does so little.