@Override
  protected ContainerShape createPictogramElement(IAddContext context, IRectangle bounds) {

    T addedGateway = getBusinessObject(context);
    IGaService gaService = Graphiti.getGaService();
    IPeService peService = Graphiti.getPeService();

    int x = bounds.getX();
    int y = bounds.getY();
    int width = bounds.getWidth();
    int height = bounds.getHeight();

    // Create a container for the gateway-symbol
    final ContainerShape newShape =
        peService.createContainerShape(context.getTargetContainer(), true);
    final Rectangle gatewayRect = gaService.createInvisibleRectangle(newShape);
    gaService.setLocationAndSize(gatewayRect, x, y, width, height);

    Shape gatewayShape = peService.createShape(newShape, false);
    Polygon gateway = GraphicsUtil.createGateway(gatewayShape, width, height);
    StyleUtil.applyStyle(gateway, addedGateway);
    gaService.setLocationAndSize(gateway, 0, 0, width, height);

    return newShape;
  }
  /**
   * Move bendpoints after the resize operation took place
   *
   * @param context
   */
  @Deprecated
  protected void moveAllBendpoints(IResizeShapeContext context) {

    Shape shape = context.getShape();

    IRectangle postResizeBounds = LayoutUtil.getAbsoluteBounds(shape);

    if (postResizeBounds.getX() == preResizeBounds.getX()
        && postResizeBounds.getY() == preResizeBounds.getY()) {

      // no resize from top left
      // no need to adjust bendpoints
      return;
    }

    int deltaX = (postResizeBounds.getX() - preResizeBounds.getX());
    int deltaY = (postResizeBounds.getY() - preResizeBounds.getY());

    Set<Connection> connectionsToMove = new HashSet<Connection>();

    // move connections contained in the resized shape
    connectionsToMove.addAll(calculateContainerConnections(context));

    for (Connection connection : connectionsToMove) {

      if (connection instanceof FreeFormConnection) {
        Layouter.layoutConnectionAfterShapeMove(connection, getFeatureProvider());
        moveConnectionBendpoints((FreeFormConnection) connection, deltaX, deltaY);
      }
    }
  }
  /**
   * Move child shapes during a resize operation.
   *
   * @param context
   */
  protected void moveChildShapes(IResizeShapeContext context) {

    Shape shape = context.getShape();

    if (!(shape instanceof ContainerShape)) {
      return;
    }

    IRectangle postResizeBounds = LayoutUtil.getAbsoluteBounds(shape);

    if (postResizeBounds.getX() == preResizeBounds.getX()
        && postResizeBounds.getY() == preResizeBounds.getY()) {

      // no resize from top left
      // no need to adjust bendpoints / children positions
      return;
    }

    int deltaX = preResizeBounds.getX() - postResizeBounds.getX();
    int deltaY = preResizeBounds.getY() - postResizeBounds.getY();

    FeatureSupport.moveChildren(
        (ContainerShape) shape, point(deltaX, deltaY), getFeatureProvider());
  }