private IRunnableDevice<ScanModel> createGridScan(
      final IRunnableDevice<?> detector, List<ScanMetadata> scanMetadata, int... size)
      throws Exception {

    // Create scan points for a grid and make a generator
    GridModel gmodel = new GridModel();
    gmodel.setFastAxisName("xNex");
    gmodel.setFastAxisPoints(size[size.length - 1]);
    gmodel.setSlowAxisName("yNex");
    gmodel.setSlowAxisPoints(size[size.length - 2]);
    gmodel.setBoundingBox(new BoundingBox(0, 0, 3, 3));

    IPointGenerator<?> gen = gservice.createGenerator(gmodel);

    // We add the outer scans, if any
    if (size.length > 2) {
      for (int dim = size.length - 3; dim > -1; dim--) {
        final StepModel model;
        if (size[dim] - 1 > 0) {
          model = new StepModel("neXusScannable" + (dim + 1), 10, 20, 9.99d / (size[dim] - 1));
        } else {
          model =
              new StepModel(
                  "neXusScannable" + (dim + 1), 10, 20, 30); // Will generate one value at 10
        }
        final IPointGenerator<?> step = gservice.createGenerator(model);
        gen = gservice.createCompoundGenerator(step, gen);
      }
    }

    // Create the model for a scan.
    final ScanModel smodel = new ScanModel();
    smodel.setPositionIterable(gen);
    smodel.setDetectors(detector);
    smodel.setScanMetadata(scanMetadata);

    // Create a file to scan into.
    smodel.setFilePath(output.getAbsolutePath());
    System.out.println("File writing to " + smodel.getFilePath());

    // Create a scan and run it without publishing events
    IRunnableDevice<ScanModel> scanner = dservice.createRunnableDevice(smodel, null);

    final IPointGenerator<?> fgen = gen;
    ((IRunnableEventDevice<ScanModel>) scanner)
        .addRunListener(
            new IRunListener() {
              @Override
              public void runWillPerform(RunEvent evt) throws ScanningException {
                try {
                  System.out.println("Running acquisition scan of size " + fgen.size());
                } catch (GeneratorException e) {
                  throw new ScanningException(e);
                }
              }
            });

    return scanner;
  }