@Override
  public void performDrop(DropTargetEvent event) {
    try {
      TreeItem dragOverTreeITem =
          treeViewer.getTree().getItem(treeViewer.getTree().toControl(event.x, event.y));

      // This should always be true as all items are Group Explorer Items
      if (dragOverTreeITem.getData() instanceof GroupExplorerItem) {
        final GroupExplorerItem dragOverExplorerItem =
            (GroupExplorerItem) dragOverTreeITem.getData();

        // Drag item dropped ON universal group item
        if (dragOverExplorerItem.isUniversalGroup()) {

          // Drag item came from inside Group Explorer
          if (event.data instanceof ArtifactData) {
            // If event originated outside, it's a copy event;
            // OR if event is inside and ctrl is down, this is a copy; add items to group
            if (!((ArtifactData) event.data).getSource().equals(viewId)
                || ((ArtifactData) event.data).getSource().equals(viewId) && isCtrlPressed) {
              copyArtifactsToGroup(event, dragOverExplorerItem);
            }
            // Else this is a move
            else {
              IStructuredSelection selectedItem = (IStructuredSelection) treeViewer.getSelection();
              Iterator<?> iterator = selectedItem.iterator();
              final Set<Artifact> insertArts = new HashSet<Artifact>();
              while (iterator.hasNext()) {
                Object obj = iterator.next();
                if (obj instanceof GroupExplorerItem) {
                  insertArts.add(((GroupExplorerItem) obj).getArtifact());
                }
              }
              GroupExplorerItem parentUnivGroupItem =
                  ((GroupExplorerItem) selectedItem.getFirstElement()).getParentItem();
              final Artifact parentArtifact = parentUnivGroupItem.getArtifact();
              final Artifact targetArtifact = dragOverExplorerItem.getArtifact();

              for (Artifact artifact : insertArts) {
                // Remove item from old group
                parentArtifact.deleteRelation(
                    CoreRelationTypes.Universal_Grouping__Members, artifact);
                // Add items to new group
                targetArtifact.addRelation(CoreRelationTypes.Universal_Grouping__Members, artifact);
              }
              Artifacts.persistInTransaction(
                  "Group Explorer - Drag/Drop", parentArtifact, targetArtifact);
            }
          }
        }
        // Drag item dropped before or after group member
        else if (!dragOverExplorerItem.isUniversalGroup()) {

          if (event.data instanceof ArtifactData) {

            GroupExplorerItem parentUnivGroupItem = null;
            // Drag item came from inside Group Explorer
            if (((ArtifactData) event.data).getSource().equals(viewId)) {
              IStructuredSelection selectedItem = (IStructuredSelection) treeViewer.getSelection();
              Iterator<?> iterator = selectedItem.iterator();
              Set<Artifact> insertArts = new HashSet<Artifact>();
              while (iterator.hasNext()) {
                Object obj = iterator.next();
                if (obj instanceof GroupExplorerItem) {
                  insertArts.add(((GroupExplorerItem) obj).getArtifact());
                }
              }
              parentUnivGroupItem =
                  ((GroupExplorerItem) selectedItem.getFirstElement()).getParentItem();
              insertArts.toArray(new Artifact[insertArts.size()]);

              Artifact parentArtifact = parentUnivGroupItem.getArtifact();
              Artifact targetArtifact = dragOverExplorerItem.getArtifact();

              for (Artifact art : insertArts) {
                parentArtifact.setRelationOrder(
                    CoreRelationTypes.Universal_Grouping__Members,
                    targetArtifact,
                    isFeedbackAfter,
                    art);
                targetArtifact = art;
              }
              parentArtifact.persist(getClass().getSimpleName());
            }
            // Drag item came from outside Group Explorer
            else {
              List<Artifact> insertArts = Arrays.asList(((ArtifactData) event.data).getArtifacts());
              parentUnivGroupItem = dragOverExplorerItem.getParentItem();
              insertArts.toArray(new Artifact[insertArts.size()]);

              Artifact parentArtifact = parentUnivGroupItem.getArtifact();
              Artifact targetArtifact = dragOverExplorerItem.getArtifact();

              for (Artifact art : insertArts) {
                parentArtifact.addRelation(
                    RelationOrderBaseTypes.USER_DEFINED,
                    CoreRelationTypes.Universal_Grouping__Members,
                    targetArtifact,
                    isFeedbackAfter,
                    art,
                    "");
              }
              parentArtifact.persist(getClass().getSimpleName());
            }
          }
        }
        treeViewer.refresh(dragOverExplorerItem);
      }

      isFeedbackAfter = false;
    } catch (Exception ex) {
      OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
    }
  }