@Override
    public void selectionChanged(SelectionChangedEvent event) {

      final Object treeSelected = ((IStructuredSelection) event.getSelection()).getFirstElement();
      final Object selected =
          treeSelected == null ? treeSelected : manipulateSelection(treeSelected);
      if (selected instanceof EObject) {
        try {
          if (childComposite != null) {
            childComposite.dispose();
            cleanCustomOnSelectionChange();
          }
          childComposite = createComposite();

          final Object root =
              manipulateSelection(
                  ((RootObject) ((TreeViewer) event.getSource()).getInput()).getRoot());

          final VElement viewModel = getViewModelContext().getViewModel();
          final VViewModelProperties properties =
              ViewModelPropertiesHelper.getInhertitedPropertiesOrEmpty(viewModel);
          properties.addNonInheritableProperty(DETAIL_KEY, true);

          final boolean rootSelected = selected.equals(root);

          if (rootSelected) {
            properties.addNonInheritableProperty(ROOT_KEY, true);
          }
          VView view = null;
          if (rootSelected) {
            view = getVElement().getDetailView();
          }
          if (view == null || view.getChildren().isEmpty()) {
            view = ViewProviderHelper.getView((EObject) selected, properties);
          }

          final ReferenceService referenceService =
              getViewModelContext().getService(ReferenceService.class);
          final ViewModelContext childContext =
              getViewModelContext()
                  .getChildContext(
                      (EObject) selected,
                      getVElement(),
                      view,
                      new TreeMasterDetailReferenceService(referenceService));

          manipulateViewContext(childContext);
          ECPSWTViewRenderer.INSTANCE.render(childComposite, childContext);

          relayoutDetail();
        } catch (final ECPRendererException e) {
          Activator.getDefault()
              .getReportService()
              .report(
                  new StatusReport(
                      new Status(
                          IStatus.ERROR,
                          Activator.getDefault().getBundle().getSymbolicName(),
                          e.getMessage(),
                          e)));
        }
      }
    }