public Request<RegisterImageRequest> marshall(RegisterImageRequest registerImageRequest) {

    if (registerImageRequest == null) {
      throw new AmazonClientException("Invalid argument passed to marshall(...)");
    }

    Request<RegisterImageRequest> request =
        new DefaultRequest<RegisterImageRequest>(registerImageRequest, "AmazonEC2");
    request.addParameter("Action", "RegisterImage");
    request.addParameter("Version", "2014-05-01");

    if (registerImageRequest.getImageLocation() != null) {
      request.addParameter(
          "ImageLocation", StringUtils.fromString(registerImageRequest.getImageLocation()));
    }
    if (registerImageRequest.getName() != null) {
      request.addParameter("Name", StringUtils.fromString(registerImageRequest.getName()));
    }
    if (registerImageRequest.getDescription() != null) {
      request.addParameter(
          "Description", StringUtils.fromString(registerImageRequest.getDescription()));
    }
    if (registerImageRequest.getArchitecture() != null) {
      request.addParameter(
          "Architecture", StringUtils.fromString(registerImageRequest.getArchitecture()));
    }
    if (registerImageRequest.getKernelId() != null) {
      request.addParameter("KernelId", StringUtils.fromString(registerImageRequest.getKernelId()));
    }
    if (registerImageRequest.getRamdiskId() != null) {
      request.addParameter(
          "RamdiskId", StringUtils.fromString(registerImageRequest.getRamdiskId()));
    }
    if (registerImageRequest.getRootDeviceName() != null) {
      request.addParameter(
          "RootDeviceName", StringUtils.fromString(registerImageRequest.getRootDeviceName()));
    }

    java.util.List<BlockDeviceMapping> blockDeviceMappingsList =
        registerImageRequest.getBlockDeviceMappings();
    int blockDeviceMappingsListIndex = 1;

    for (BlockDeviceMapping blockDeviceMappingsListValue : blockDeviceMappingsList) {
      BlockDeviceMapping blockDeviceMappingMember = blockDeviceMappingsListValue;
      if (blockDeviceMappingMember != null) {
        if (blockDeviceMappingMember.getVirtualName() != null) {
          request.addParameter(
              "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".VirtualName",
              StringUtils.fromString(blockDeviceMappingMember.getVirtualName()));
        }
        if (blockDeviceMappingMember.getDeviceName() != null) {
          request.addParameter(
              "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".DeviceName",
              StringUtils.fromString(blockDeviceMappingMember.getDeviceName()));
        }
        EbsBlockDevice ebsBlockDeviceEbs = blockDeviceMappingMember.getEbs();
        if (ebsBlockDeviceEbs != null) {
          if (ebsBlockDeviceEbs.getSnapshotId() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.SnapshotId",
                StringUtils.fromString(ebsBlockDeviceEbs.getSnapshotId()));
          }
          if (ebsBlockDeviceEbs.getVolumeSize() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.VolumeSize",
                StringUtils.fromInteger(ebsBlockDeviceEbs.getVolumeSize()));
          }
          if (ebsBlockDeviceEbs.isDeleteOnTermination() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.DeleteOnTermination",
                StringUtils.fromBoolean(ebsBlockDeviceEbs.isDeleteOnTermination()));
          }
          if (ebsBlockDeviceEbs.getVolumeType() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.VolumeType",
                StringUtils.fromString(ebsBlockDeviceEbs.getVolumeType()));
          }
          if (ebsBlockDeviceEbs.getIops() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.Iops",
                StringUtils.fromInteger(ebsBlockDeviceEbs.getIops()));
          }
          if (ebsBlockDeviceEbs.isEncrypted() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.Encrypted",
                StringUtils.fromBoolean(ebsBlockDeviceEbs.isEncrypted()));
          }
        }
        if (blockDeviceMappingMember.getNoDevice() != null) {
          request.addParameter(
              "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".NoDevice",
              StringUtils.fromString(blockDeviceMappingMember.getNoDevice()));
        }
      }

      blockDeviceMappingsListIndex++;
    }
    if (registerImageRequest.getVirtualizationType() != null) {
      request.addParameter(
          "VirtualizationType",
          StringUtils.fromString(registerImageRequest.getVirtualizationType()));
    }
    if (registerImageRequest.getSriovNetSupport() != null) {
      request.addParameter(
          "SriovNetSupport", StringUtils.fromString(registerImageRequest.getSriovNetSupport()));
    }

    return request;
  }
  public Request<CreateImageRequest> marshall(CreateImageRequest createImageRequest) {

    if (createImageRequest == null) {
      throw new AmazonClientException("Invalid argument passed to marshall(...)");
    }

    Request<CreateImageRequest> request =
        new DefaultRequest<CreateImageRequest>(createImageRequest, "AmazonEC2");
    request.addParameter("Action", "CreateImage");
    request.addParameter("Version", "2014-06-15");

    if (createImageRequest.getInstanceId() != null) {
      request.addParameter(
          "InstanceId", StringUtils.fromString(createImageRequest.getInstanceId()));
    }
    if (createImageRequest.getName() != null) {
      request.addParameter("Name", StringUtils.fromString(createImageRequest.getName()));
    }
    if (createImageRequest.getDescription() != null) {
      request.addParameter(
          "Description", StringUtils.fromString(createImageRequest.getDescription()));
    }
    if (createImageRequest.isNoReboot() != null) {
      request.addParameter("NoReboot", StringUtils.fromBoolean(createImageRequest.isNoReboot()));
    }

    java.util.List<BlockDeviceMapping> blockDeviceMappingsList =
        createImageRequest.getBlockDeviceMappings();
    int blockDeviceMappingsListIndex = 1;

    for (BlockDeviceMapping blockDeviceMappingsListValue : blockDeviceMappingsList) {
      BlockDeviceMapping blockDeviceMappingMember = blockDeviceMappingsListValue;
      if (blockDeviceMappingMember != null) {
        if (blockDeviceMappingMember.getVirtualName() != null) {
          request.addParameter(
              "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".VirtualName",
              StringUtils.fromString(blockDeviceMappingMember.getVirtualName()));
        }
        if (blockDeviceMappingMember.getDeviceName() != null) {
          request.addParameter(
              "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".DeviceName",
              StringUtils.fromString(blockDeviceMappingMember.getDeviceName()));
        }
        EbsBlockDevice ebsBlockDeviceEbs = blockDeviceMappingMember.getEbs();
        if (ebsBlockDeviceEbs != null) {
          if (ebsBlockDeviceEbs.getSnapshotId() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.SnapshotId",
                StringUtils.fromString(ebsBlockDeviceEbs.getSnapshotId()));
          }
          if (ebsBlockDeviceEbs.getVolumeSize() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.VolumeSize",
                StringUtils.fromInteger(ebsBlockDeviceEbs.getVolumeSize()));
          }
          if (ebsBlockDeviceEbs.isDeleteOnTermination() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.DeleteOnTermination",
                StringUtils.fromBoolean(ebsBlockDeviceEbs.isDeleteOnTermination()));
          }
          if (ebsBlockDeviceEbs.getVolumeType() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.VolumeType",
                StringUtils.fromString(ebsBlockDeviceEbs.getVolumeType()));
          }
          if (ebsBlockDeviceEbs.getIops() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.Iops",
                StringUtils.fromInteger(ebsBlockDeviceEbs.getIops()));
          }
          if (ebsBlockDeviceEbs.isEncrypted() != null) {
            request.addParameter(
                "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".Ebs.Encrypted",
                StringUtils.fromBoolean(ebsBlockDeviceEbs.isEncrypted()));
          }
        }
        if (blockDeviceMappingMember.getNoDevice() != null) {
          request.addParameter(
              "BlockDeviceMapping." + blockDeviceMappingsListIndex + ".NoDevice",
              StringUtils.fromString(blockDeviceMappingMember.getNoDevice()));
        }
      }

      blockDeviceMappingsListIndex++;
    }

    return request;
  }
  public Request<CreateInstanceRequest> marshall(CreateInstanceRequest createInstanceRequest) {
    if (createInstanceRequest == null) {
      throw new AmazonClientException("Invalid argument passed to marshall(...)");
    }

    Request<CreateInstanceRequest> request =
        new DefaultRequest<CreateInstanceRequest>(createInstanceRequest, "AWSOpsWorks");
    String target = "OpsWorks_20130218.CreateInstance";
    request.addHeader("X-Amz-Target", target);

    request.setHttpMethod(HttpMethodName.POST);
    request.setResourcePath("");

    try {
      StringWriter stringWriter = new StringWriter();
      JSONWriter jsonWriter = new JSONWriter(stringWriter);

      jsonWriter.object();

      if (createInstanceRequest.getStackId() != null) {
        jsonWriter.key("StackId").value(createInstanceRequest.getStackId());
      }

      com.amazonaws.internal.ListWithAutoConstructFlag<String> layerIdsList =
          (com.amazonaws.internal.ListWithAutoConstructFlag<String>)
              (createInstanceRequest.getLayerIds());
      if (layerIdsList != null && !(layerIdsList.isAutoConstruct() && layerIdsList.isEmpty())) {

        jsonWriter.key("LayerIds");
        jsonWriter.array();

        for (String layerIdsListValue : layerIdsList) {
          if (layerIdsListValue != null) {
            jsonWriter.value(layerIdsListValue);
          }
        }
        jsonWriter.endArray();
      }
      if (createInstanceRequest.getInstanceType() != null) {
        jsonWriter.key("InstanceType").value(createInstanceRequest.getInstanceType());
      }
      if (createInstanceRequest.getAutoScalingType() != null) {
        jsonWriter.key("AutoScalingType").value(createInstanceRequest.getAutoScalingType());
      }
      if (createInstanceRequest.getHostname() != null) {
        jsonWriter.key("Hostname").value(createInstanceRequest.getHostname());
      }
      if (createInstanceRequest.getOs() != null) {
        jsonWriter.key("Os").value(createInstanceRequest.getOs());
      }
      if (createInstanceRequest.getAmiId() != null) {
        jsonWriter.key("AmiId").value(createInstanceRequest.getAmiId());
      }
      if (createInstanceRequest.getSshKeyName() != null) {
        jsonWriter.key("SshKeyName").value(createInstanceRequest.getSshKeyName());
      }
      if (createInstanceRequest.getAvailabilityZone() != null) {
        jsonWriter.key("AvailabilityZone").value(createInstanceRequest.getAvailabilityZone());
      }
      if (createInstanceRequest.getVirtualizationType() != null) {
        jsonWriter.key("VirtualizationType").value(createInstanceRequest.getVirtualizationType());
      }
      if (createInstanceRequest.getSubnetId() != null) {
        jsonWriter.key("SubnetId").value(createInstanceRequest.getSubnetId());
      }
      if (createInstanceRequest.getArchitecture() != null) {
        jsonWriter.key("Architecture").value(createInstanceRequest.getArchitecture());
      }
      if (createInstanceRequest.getRootDeviceType() != null) {
        jsonWriter.key("RootDeviceType").value(createInstanceRequest.getRootDeviceType());
      }

      com.amazonaws.internal.ListWithAutoConstructFlag<BlockDeviceMapping> blockDeviceMappingsList =
          (com.amazonaws.internal.ListWithAutoConstructFlag<BlockDeviceMapping>)
              (createInstanceRequest.getBlockDeviceMappings());
      if (blockDeviceMappingsList != null
          && !(blockDeviceMappingsList.isAutoConstruct() && blockDeviceMappingsList.isEmpty())) {

        jsonWriter.key("BlockDeviceMappings");
        jsonWriter.array();

        for (BlockDeviceMapping blockDeviceMappingsListValue : blockDeviceMappingsList) {
          if (blockDeviceMappingsListValue != null) {
            jsonWriter.object();
            if (blockDeviceMappingsListValue.getDeviceName() != null) {
              jsonWriter.key("DeviceName").value(blockDeviceMappingsListValue.getDeviceName());
            }
            if (blockDeviceMappingsListValue.getNoDevice() != null) {
              jsonWriter.key("NoDevice").value(blockDeviceMappingsListValue.getNoDevice());
            }
            if (blockDeviceMappingsListValue.getVirtualName() != null) {
              jsonWriter.key("VirtualName").value(blockDeviceMappingsListValue.getVirtualName());
            }
            EbsBlockDevice ebs = blockDeviceMappingsListValue.getEbs();
            if (ebs != null) {

              jsonWriter.key("Ebs");
              jsonWriter.object();

              if (ebs.getSnapshotId() != null) {
                jsonWriter.key("SnapshotId").value(ebs.getSnapshotId());
              }
              if (ebs.getIops() != null) {
                jsonWriter.key("Iops").value(ebs.getIops());
              }
              if (ebs.getVolumeSize() != null) {
                jsonWriter.key("VolumeSize").value(ebs.getVolumeSize());
              }
              if (ebs.getVolumeType() != null) {
                jsonWriter.key("VolumeType").value(ebs.getVolumeType());
              }
              if (ebs.isDeleteOnTermination() != null) {
                jsonWriter.key("DeleteOnTermination").value(ebs.isDeleteOnTermination());
              }
              jsonWriter.endObject();
            }
            jsonWriter.endObject();
          }
        }
        jsonWriter.endArray();
      }
      if (createInstanceRequest.isInstallUpdatesOnBoot() != null) {
        jsonWriter
            .key("InstallUpdatesOnBoot")
            .value(createInstanceRequest.isInstallUpdatesOnBoot());
      }
      if (createInstanceRequest.isEbsOptimized() != null) {
        jsonWriter.key("EbsOptimized").value(createInstanceRequest.isEbsOptimized());
      }
      if (createInstanceRequest.getAgentVersion() != null) {
        jsonWriter.key("AgentVersion").value(createInstanceRequest.getAgentVersion());
      }

      jsonWriter.endObject();

      String snippet = stringWriter.toString();
      byte[] content = snippet.getBytes(UTF8);
      request.setContent(new StringInputStream(snippet));
      request.addHeader("Content-Length", Integer.toString(content.length));
      request.addHeader("Content-Type", "application/x-amz-json-1.1");
    } catch (Throwable t) {
      throw new AmazonClientException("Unable to marshall request to JSON: " + t.getMessage(), t);
    }

    return request;
  }