diff --git a/composer.json b/composer.json
index cfc89fd344fd23c2ac8c4de5990888a84116ea18..c5495dfbd58c4e6482d71b5b261daf28691e028a 100755
--- a/composer.json
+++ b/composer.json
@@ -1,7 +1,7 @@
 {
   "name": "adi-ia/cbs-techstore-client-php",
   "description": "A PHP client used to connect with the CBS API and perform requests",
-  "version": "6.0.0",
+  "version": "6.1.0",
   "license": "Apache-2.0",
   "homepage": "https://wiki.doit.wisc.edu/confluence/display/ADIIA/CBS",
   "authors": [
diff --git a/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomer.php b/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomer.php
new file mode 100644
index 0000000000000000000000000000000000000000..9652e6b89778e2e43ed2b388655a6c8ed09b82b0
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomer.php
@@ -0,0 +1,179 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer;
+
+/**
+ * ExternalCustomer represents an external customer, for example, a Parent
+ */
+class ExternalCustomer
+{
+
+    /** @var string */
+    private $customerType;
+
+    /** @var string */
+    private $customerIdentifier;
+
+    /** @var string */
+    private $firstName;
+
+    /** @var string */
+    private $lastName;
+
+    /** @var string */
+    private $email;
+
+    /** @var string */
+    private $phone;
+
+    /** @var string */
+    private $reference;
+
+    /** @var string */
+    private $testMode;
+
+    /**
+     * @return string
+     */
+    public function getCustomerType()
+    {
+        return $this->customerType;
+    }
+
+    /**
+     * @param string $customerType
+     * @return ExternalCustomer
+     */
+    public function setCustomerType($customerType)
+    {
+        $this->customerType = $customerType;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getCustomerIdentifier()
+    {
+        return $this->customerIdentifier;
+    }
+
+    /**
+     * @param string $customerIdentifier
+     * @return ExternalCustomer
+     */
+    public function setCustomerIdentifier($customerIdentifier)
+    {
+        $this->customerIdentifier = $customerIdentifier;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getFirstName()
+    {
+        return $this->firstName;
+    }
+
+    /**
+     * @param string $firstName
+     * @return ExternalCustomer
+     */
+    public function setFirstName($firstName)
+    {
+        $this->firstName = $firstName;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getLastName()
+    {
+        return $this->lastName;
+    }
+
+    /**
+     * @param string $lastName
+     * @return ExternalCustomer
+     */
+    public function setLastName($lastName)
+    {
+        $this->lastName = $lastName;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->email;
+    }
+
+    /**
+     * @param string $email
+     * @return ExternalCustomer
+     */
+    public function setEmail($email)
+    {
+        $this->email = $email;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getPhone()
+    {
+        return $this->phone;
+    }
+
+    /**
+     * @param string $phone
+     * @return ExternalCustomer
+     */
+    public function setPhone($phone)
+    {
+        $this->phone = $phone;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getReference()
+    {
+        return $this->reference;
+    }
+
+    /**
+     * @param string $reference
+     * @return ExternalCustomer
+     */
+    public function setReference($reference)
+    {
+        $this->reference = $reference;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getTestMode()
+    {
+        return $this->testMode;
+    }
+
+    /**
+     * @param string $testMode
+     * @return ExternalCustomer
+     */
+    public function setTestMode($testMode)
+    {
+        $this->testMode = $testMode;
+        return $this;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerInputParametersMapper.php b/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerInputParametersMapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ae98e6737603ecb33e9cce56d225b726aa7eeae
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerInputParametersMapper.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer;
+
+use edu\wisc\services\cbs\external_customer\generated\InputParameters;
+
+/**
+ * Maps an {@link ExternalCustomer} to an {@link InputParameters}
+ */
+class ExternalCustomerInputParametersMapper
+{
+
+    /**
+     * Maps an {@link ExternalCustomer} to {@link InputParameters}
+     * @param ExternalCustomer $customer
+     * @return InputParameters
+     */
+    public static function toInputParameters(ExternalCustomer $customer)
+    {
+        return (new InputParameters(
+            '',
+            '',
+            '',
+            '',
+            '',
+            '',
+            '',
+            ''
+        ))
+            ->setP_CUSTOMER_TYPE($customer->getCustomerType())
+            ->setP_CUSTOMER_IDENTIFIER($customer->getCustomerIdentifier())
+            ->setP_FIRST_NAME($customer->getFirstName())
+            ->setP_LAST_NAME($customer->getLastName())
+            ->setP_PHONE($customer->getPhone())
+            ->setP_REFERENCE($customer->getReference())
+            ->setP_TEST_MODE($customer->getTestMode());
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerService.php b/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerService.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f45a8f42008fc38541a4363dfc2cdd3a88ad55e
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerService.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer;
+
+/**
+ * Service intended to create external customers (e.g. Parents) in CBS
+ */
+interface ExternalCustomerService
+{
+
+    /**
+     * @param ExternalCustomer $customer
+     * @return mixed
+     */
+    public function createCustomer(ExternalCustomer $customer);
+
+}
\ No newline at end of file
diff --git a/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerServiceResponse.php b/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerServiceResponse.php
new file mode 100644
index 0000000000000000000000000000000000000000..9111e2dfecda6d62ce1992d0305a4c7587ff7561
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/ExternalCustomerServiceResponse.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer;
+
+use edu\wisc\services\cbs\common\AbstractServiceResponse;
+
+/**
+ * Represents a response from a {@link ExternalCustomerService}
+ */
+class ExternalCustomerServiceResponse extends AbstractServiceResponse
+{
+
+    /** @var string */
+    private $customerNumber;
+
+    /** @var string */
+    private $status;
+
+    /** @var string */
+    private $resultMessage;
+
+    public function __construct($status, $resultMessage, $customerNumber)
+    {
+        parent::__construct($status, $resultMessage);
+        $this->customerNumber = $customerNumber;
+    }
+
+    /**
+     * @return string
+     */
+    public function getCustomerNumber()
+    {
+        return $this->customerNumber;
+    }
+
+    /**
+     * @return string
+     */
+    public function getStatus()
+    {
+        return $this->status;
+    }
+
+    /**
+     * @return string
+     */
+    public function getResultMessage()
+    {
+        return $this->resultMessage;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/edu/wisc/services/cbs/external_customer/MockExternalCustomerService.php b/src/main/edu/wisc/services/cbs/external_customer/MockExternalCustomerService.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e7fb057faae8c1a9a06515c88038c585ce46b4a
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/MockExternalCustomerService.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer;
+
+/**
+ * Mock implementation of {@link ExternalCustomerService}
+ */
+class MockExternalCustomerService implements ExternalCustomerService
+{
+
+    /** @var ExternalCustomerServiceResponse */
+    private $response;
+
+    /**
+     * MockExternalCustomerService constructor.
+     * @param ExternalCustomerServiceResponse|null $response
+     */
+    public function __construct(ExternalCustomerServiceResponse $response = null)
+    {
+        if ($response !== null) {
+            $this->response = $response;
+        } else {
+            $this->response = new ExternalCustomerServiceResponse(
+                true,
+                'MockExternalCustomerServiceResponse',
+                '123456789'
+            );
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createCustomer(ExternalCustomer $customer)
+    {
+        return $this->response;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/edu/wisc/services/cbs/external_customer/SoapExternalCustomerService.php b/src/main/edu/wisc/services/cbs/external_customer/SoapExternalCustomerService.php
new file mode 100644
index 0000000000000000000000000000000000000000..51440a402fb0369a3e31351ef1b0eed8159adccc
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/SoapExternalCustomerService.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer;
+
+use edu\wisc\services\cbs\api\SoapService;
+use edu\wisc\services\cbs\common\WssSoapHeaderBuilder;
+use edu\wisc\services\cbs\external_customer\generated\DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service;
+
+/**
+ * SOAP backed implementation of {@link ExternalCustomerService}
+ */
+class SoapExternalCustomerService implements SoapService, ExternalCustomerService
+{
+
+    /** URL for QA WSDL */
+    const CBQA12 = 'http://pegasus.doit.wisc.edu:8018/webservices/SOAProvider/plsql/doit_soa_external_customer_v2/?wsdl';
+    /** URL for DV WSDL */
+    const CBDV12 = 'http://pegasus.doit.wisc.edu:8016/webservices/SOAProvider/plsql/doit_soa_external_customer_v2/?wsdl';
+
+    /** @var DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service */
+    private $soapClient;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($username, $password, $wsdlPath = null, \SoapClient $externalCustomerSoapClient = null)
+    {
+        if ($externalCustomerSoapClient !== null) {
+            $this->soapClient = $externalCustomerSoapClient;
+            return;
+        } else if ($wsdlPath !== null) {
+            $this->soapClient = new DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service(
+                [],
+                $wsdlPath
+            );
+            $this->soapClient->__setSoapHeaders(WssSoapHeaderBuilder::buildUsernameToken($username, $password));
+        } else {
+            $this->soapClient = new DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service(
+                [],
+                __DIR__ . '/../../../../../resources/doit_soa_external_customer_v2.xml'
+            );
+            $this->soapClient->__setSoapHeaders(WssSoapHeaderBuilder::buildUsernameToken($username, $password));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createCustomer(ExternalCustomer $customer)
+    {
+        $outputParameters = $this->soapClient->CREATE_CUSTOMER(
+            ExternalCustomerInputParametersMapper::toInputParameters($customer)
+        );
+        return new ExternalCustomerServiceResponse(
+            strcasecmp($outputParameters->getP_STATUS(), 'SUCCESS') === 0,
+            $outputParameters->getP_RESULT_MESSAGE(),
+            $outputParameters->getP_CUSTOMER_NUMBER()
+        );
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/edu/wisc/services/cbs/external_customer/generated/DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service.php b/src/main/edu/wisc/services/cbs/external_customer/generated/DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service.php
new file mode 100644
index 0000000000000000000000000000000000000000..229e71e0d22fd123524b580ec982716c77a25dca
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/generated/DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer\generated;
+
+class DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service extends \SoapClient
+{
+
+    /**
+     * @var array $classmap The defined classes
+     */
+    private static $classmap = array (
+      'InputParameters' => 'edu\\wisc\\services\\cbs\\external_customer\\generated\\InputParameters',
+      'OutputParameters' => 'edu\\wisc\\services\\cbs\\external_customer\\generated\\OutputParameters',
+      'SOAHeader' => 'edu\\wisc\\services\\cbs\\external_customer\\generated\\SOAHeader',
+    );
+
+    /**
+     * @param array $options A array of config values
+     * @param string $wsdl The wsdl file to use
+     */
+    public function __construct(array $options = array(), $wsdl = null)
+    {
+      foreach (self::$classmap as $key => $value) {
+        if (!isset($options['classmap'][$key])) {
+          $options['classmap'][$key] = $value;
+        }
+      }
+      $options = array_merge(array (
+      'features' => 1,
+    ), $options);
+      if (!$wsdl) {
+        $wsdl = 'src/main/resources/doit_soa_external_customer_v2.xml';
+      }
+      parent::__construct($wsdl, $options);
+    }
+
+    /**
+     * @param InputParameters $body
+     * @return OutputParameters
+     */
+    public function CREATE_CUSTOMER(InputParameters $body)
+    {
+      return $this->__soapCall('CREATE_CUSTOMER', array($body));
+    }
+
+}
diff --git a/src/main/edu/wisc/services/cbs/external_customer/generated/InputParameters.php b/src/main/edu/wisc/services/cbs/external_customer/generated/InputParameters.php
new file mode 100644
index 0000000000000000000000000000000000000000..12f0f5b398215de0003c9b8258cc8f7d35f52de1
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/generated/InputParameters.php
@@ -0,0 +1,214 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer\generated;
+
+class InputParameters
+{
+
+    /**
+     * @var string $P_CUSTOMER_TYPE
+     */
+    protected $P_CUSTOMER_TYPE = null;
+
+    /**
+     * @var string $P_CUSTOMER_IDENTIFIER
+     */
+    protected $P_CUSTOMER_IDENTIFIER = null;
+
+    /**
+     * @var string $P_FIRST_NAME
+     */
+    protected $P_FIRST_NAME = null;
+
+    /**
+     * @var string $P_LAST_NAME
+     */
+    protected $P_LAST_NAME = null;
+
+    /**
+     * @var string $P_EMAIL
+     */
+    protected $P_EMAIL = null;
+
+    /**
+     * @var string $P_PHONE
+     */
+    protected $P_PHONE = null;
+
+    /**
+     * @var string $P_REFERENCE
+     */
+    protected $P_REFERENCE = null;
+
+    /**
+     * @var string $P_TEST_MODE
+     */
+    protected $P_TEST_MODE = null;
+
+    /**
+     * @param string $P_CUSTOMER_TYPE
+     * @param string $P_CUSTOMER_IDENTIFIER
+     * @param string $P_FIRST_NAME
+     * @param string $P_LAST_NAME
+     * @param string $P_EMAIL
+     * @param string $P_PHONE
+     * @param string $P_REFERENCE
+     * @param string $P_TEST_MODE
+     */
+    public function __construct($P_CUSTOMER_TYPE, $P_CUSTOMER_IDENTIFIER, $P_FIRST_NAME, $P_LAST_NAME, $P_EMAIL, $P_PHONE, $P_REFERENCE, $P_TEST_MODE)
+    {
+      $this->P_CUSTOMER_TYPE = $P_CUSTOMER_TYPE;
+      $this->P_CUSTOMER_IDENTIFIER = $P_CUSTOMER_IDENTIFIER;
+      $this->P_FIRST_NAME = $P_FIRST_NAME;
+      $this->P_LAST_NAME = $P_LAST_NAME;
+      $this->P_EMAIL = $P_EMAIL;
+      $this->P_PHONE = $P_PHONE;
+      $this->P_REFERENCE = $P_REFERENCE;
+      $this->P_TEST_MODE = $P_TEST_MODE;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_CUSTOMER_TYPE()
+    {
+      return $this->P_CUSTOMER_TYPE;
+    }
+
+    /**
+     * @param string $P_CUSTOMER_TYPE
+     * @return \edu\wisc\services\cbs\external_customer\generated\InputParameters
+     */
+    public function setP_CUSTOMER_TYPE($P_CUSTOMER_TYPE)
+    {
+      $this->P_CUSTOMER_TYPE = $P_CUSTOMER_TYPE;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_CUSTOMER_IDENTIFIER()
+    {
+      return $this->P_CUSTOMER_IDENTIFIER;
+    }
+
+    /**
+     * @param string $P_CUSTOMER_IDENTIFIER
+     * @return \edu\wisc\services\cbs\external_customer\generated\InputParameters
+     */
+    public function setP_CUSTOMER_IDENTIFIER($P_CUSTOMER_IDENTIFIER)
+    {
+      $this->P_CUSTOMER_IDENTIFIER = $P_CUSTOMER_IDENTIFIER;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_FIRST_NAME()
+    {
+      return $this->P_FIRST_NAME;
+    }
+
+    /**
+     * @param string $P_FIRST_NAME
+     * @return \edu\wisc\services\cbs\external_customer\generated\InputParameters
+     */
+    public function setP_FIRST_NAME($P_FIRST_NAME)
+    {
+      $this->P_FIRST_NAME = $P_FIRST_NAME;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_LAST_NAME()
+    {
+      return $this->P_LAST_NAME;
+    }
+
+    /**
+     * @param string $P_LAST_NAME
+     * @return \edu\wisc\services\cbs\external_customer\generated\InputParameters
+     */
+    public function setP_LAST_NAME($P_LAST_NAME)
+    {
+      $this->P_LAST_NAME = $P_LAST_NAME;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_EMAIL()
+    {
+      return $this->P_EMAIL;
+    }
+
+    /**
+     * @param string $P_EMAIL
+     * @return \edu\wisc\services\cbs\external_customer\generated\InputParameters
+     */
+    public function setP_EMAIL($P_EMAIL)
+    {
+      $this->P_EMAIL = $P_EMAIL;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_PHONE()
+    {
+      return $this->P_PHONE;
+    }
+
+    /**
+     * @param string $P_PHONE
+     * @return \edu\wisc\services\cbs\external_customer\generated\InputParameters
+     */
+    public function setP_PHONE($P_PHONE)
+    {
+      $this->P_PHONE = $P_PHONE;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_REFERENCE()
+    {
+      return $this->P_REFERENCE;
+    }
+
+    /**
+     * @param string $P_REFERENCE
+     * @return \edu\wisc\services\cbs\external_customer\generated\InputParameters
+     */
+    public function setP_REFERENCE($P_REFERENCE)
+    {
+      $this->P_REFERENCE = $P_REFERENCE;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_TEST_MODE()
+    {
+      return $this->P_TEST_MODE;
+    }
+
+    /**
+     * @param string $P_TEST_MODE
+     * @return \edu\wisc\services\cbs\external_customer\generated\InputParameters
+     */
+    public function setP_TEST_MODE($P_TEST_MODE)
+    {
+      $this->P_TEST_MODE = $P_TEST_MODE;
+      return $this;
+    }
+
+}
diff --git a/src/main/edu/wisc/services/cbs/external_customer/generated/OutputParameters.php b/src/main/edu/wisc/services/cbs/external_customer/generated/OutputParameters.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5de3635cefef101a44d9100b2ca87a56df3637f
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/generated/OutputParameters.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer\generated;
+
+class OutputParameters
+{
+
+    /**
+     * @var string $P_CUSTOMER_NUMBER
+     */
+    protected $P_CUSTOMER_NUMBER = null;
+
+    /**
+     * @var string $P_STATUS
+     */
+    protected $P_STATUS = null;
+
+    /**
+     * @var string $P_RESULT_MESSAGE
+     */
+    protected $P_RESULT_MESSAGE = null;
+
+    /**
+     * @param string $P_CUSTOMER_NUMBER
+     * @param string $P_STATUS
+     * @param string $P_RESULT_MESSAGE
+     */
+    public function __construct($P_CUSTOMER_NUMBER, $P_STATUS, $P_RESULT_MESSAGE)
+    {
+      $this->P_CUSTOMER_NUMBER = $P_CUSTOMER_NUMBER;
+      $this->P_STATUS = $P_STATUS;
+      $this->P_RESULT_MESSAGE = $P_RESULT_MESSAGE;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_CUSTOMER_NUMBER()
+    {
+      return $this->P_CUSTOMER_NUMBER;
+    }
+
+    /**
+     * @param string $P_CUSTOMER_NUMBER
+     * @return \edu\wisc\services\cbs\external_customer\generated\OutputParameters
+     */
+    public function setP_CUSTOMER_NUMBER($P_CUSTOMER_NUMBER)
+    {
+      $this->P_CUSTOMER_NUMBER = $P_CUSTOMER_NUMBER;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_STATUS()
+    {
+      return $this->P_STATUS;
+    }
+
+    /**
+     * @param string $P_STATUS
+     * @return \edu\wisc\services\cbs\external_customer\generated\OutputParameters
+     */
+    public function setP_STATUS($P_STATUS)
+    {
+      $this->P_STATUS = $P_STATUS;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getP_RESULT_MESSAGE()
+    {
+      return $this->P_RESULT_MESSAGE;
+    }
+
+    /**
+     * @param string $P_RESULT_MESSAGE
+     * @return \edu\wisc\services\cbs\external_customer\generated\OutputParameters
+     */
+    public function setP_RESULT_MESSAGE($P_RESULT_MESSAGE)
+    {
+      $this->P_RESULT_MESSAGE = $P_RESULT_MESSAGE;
+      return $this;
+    }
+
+}
diff --git a/src/main/edu/wisc/services/cbs/external_customer/generated/SOAHeader.php b/src/main/edu/wisc/services/cbs/external_customer/generated/SOAHeader.php
new file mode 100644
index 0000000000000000000000000000000000000000..2bd9b14209fde03bbfb0a4f678b9356b54c1b544
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/generated/SOAHeader.php
@@ -0,0 +1,139 @@
+<?php
+
+namespace edu\wisc\services\cbs\external_customer\generated;
+
+class SOAHeader
+{
+
+    /**
+     * @var string $Responsibility
+     */
+    protected $Responsibility = null;
+
+    /**
+     * @var string $RespApplication
+     */
+    protected $RespApplication = null;
+
+    /**
+     * @var string $SecurityGroup
+     */
+    protected $SecurityGroup = null;
+
+    /**
+     * @var string $NLSLanguage
+     */
+    protected $NLSLanguage = null;
+
+    /**
+     * @var string $Org_Id
+     */
+    protected $Org_Id = null;
+
+    /**
+     * @param string $Responsibility
+     * @param string $RespApplication
+     * @param string $SecurityGroup
+     * @param string $NLSLanguage
+     * @param string $Org_Id
+     */
+    public function __construct($Responsibility, $RespApplication, $SecurityGroup, $NLSLanguage, $Org_Id)
+    {
+      $this->Responsibility = $Responsibility;
+      $this->RespApplication = $RespApplication;
+      $this->SecurityGroup = $SecurityGroup;
+      $this->NLSLanguage = $NLSLanguage;
+      $this->Org_Id = $Org_Id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getResponsibility()
+    {
+      return $this->Responsibility;
+    }
+
+    /**
+     * @param string $Responsibility
+     * @return \edu\wisc\services\cbs\external_customer\generated\SOAHeader
+     */
+    public function setResponsibility($Responsibility)
+    {
+      $this->Responsibility = $Responsibility;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getRespApplication()
+    {
+      return $this->RespApplication;
+    }
+
+    /**
+     * @param string $RespApplication
+     * @return \edu\wisc\services\cbs\external_customer\generated\SOAHeader
+     */
+    public function setRespApplication($RespApplication)
+    {
+      $this->RespApplication = $RespApplication;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getSecurityGroup()
+    {
+      return $this->SecurityGroup;
+    }
+
+    /**
+     * @param string $SecurityGroup
+     * @return \edu\wisc\services\cbs\external_customer\generated\SOAHeader
+     */
+    public function setSecurityGroup($SecurityGroup)
+    {
+      $this->SecurityGroup = $SecurityGroup;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNLSLanguage()
+    {
+      return $this->NLSLanguage;
+    }
+
+    /**
+     * @param string $NLSLanguage
+     * @return \edu\wisc\services\cbs\external_customer\generated\SOAHeader
+     */
+    public function setNLSLanguage($NLSLanguage)
+    {
+      $this->NLSLanguage = $NLSLanguage;
+      return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getOrg_Id()
+    {
+      return $this->Org_Id;
+    }
+
+    /**
+     * @param string $Org_Id
+     * @return \edu\wisc\services\cbs\external_customer\generated\SOAHeader
+     */
+    public function setOrg_Id($Org_Id)
+    {
+      $this->Org_Id = $Org_Id;
+      return $this;
+    }
+
+}
diff --git a/src/main/edu/wisc/services/cbs/external_customer/generated/autoload.php b/src/main/edu/wisc/services/cbs/external_customer/generated/autoload.php
new file mode 100644
index 0000000000000000000000000000000000000000..677fa56f0e947a348459a8cf1973b87e0d16e34a
--- /dev/null
+++ b/src/main/edu/wisc/services/cbs/external_customer/generated/autoload.php
@@ -0,0 +1,21 @@
+<?php
+
+
+ function autoload_d7fc76be4a5fe70046e6a183474348b6($class)
+{
+    $classes = array(
+        'edu\wisc\services\cbs\external_customer\generated\DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service' => __DIR__ .'/DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service.php',
+        'edu\wisc\services\cbs\external_customer\generated\InputParameters' => __DIR__ .'/InputParameters.php',
+        'edu\wisc\services\cbs\external_customer\generated\OutputParameters' => __DIR__ .'/OutputParameters.php',
+        'edu\wisc\services\cbs\external_customer\generated\SOAHeader' => __DIR__ .'/SOAHeader.php'
+    );
+    if (!empty($classes[$class])) {
+        include $classes[$class];
+    };
+}
+
+spl_autoload_register('autoload_d7fc76be4a5fe70046e6a183474348b6');
+
+// Do nothing. The rest is just leftovers from the code generation.
+{
+}
diff --git a/src/main/resources/doit_soa_external_customer_v2.xml b/src/main/resources/doit_soa_external_customer_v2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..016d4c1f64a5f264fda189b3b95bbf1da89c07e2
--- /dev/null
+++ b/src/main/resources/doit_soa_external_customer_v2.xml
@@ -0,0 +1 @@
+<?xml version = '1.0' encoding = 'UTF-8'?><definitions name="DOIT_SOA_EXTERNAL_CUSTOMER_V2" targetNamespace="http://xmlns.oracle.com/apps/ont/soaprovider/plsql/doit_soa_external_customer_v2/" xmlns:tns="http://xmlns.oracle.com/apps/ont/soaprovider/plsql/doit_soa_external_customer_v2/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns1="http://xmlns.oracle.com/apps/ont/soaprovider/plsql/doit_soa_external_customer_v2/create_customer/">   <types>      <schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/apps/ont/soaprovider/plsql/doit_soa_external_customer_v2/create_customer/">         <include schemaLocation="http://pegasus.doit.wisc.edu:8018/webservices/SOAProvider/plsql/doit_soa_external_customer_v2/APPS_DOIT_SOA_EXTERNAL_CUSTOMER_V2_CREATE_CUSTOMER.xsd"/>      </schema>      <schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/apps/ont/soaprovider/plsql/doit_soa_external_customer_v2/">         <element name="SOAHeader">            <complexType>               <sequence>                  <element name="Responsibility" minOccurs="0" type="string"/>                  <element name="RespApplication" minOccurs="0" type="string"/>                  <element name="SecurityGroup" minOccurs="0" type="string"/>                  <element name="NLSLanguage" minOccurs="0" type="string"/>                  <element name="Org_Id" minOccurs="0" type="string"/>               </sequence>            </complexType>         </element>      </schema>   </types>   <message name="CREATE_CUSTOMER_Input_Msg">      <part name="header" element="tns:SOAHeader"/>      <part name="body" element="tns1:InputParameters"/>   </message>   <message name="CREATE_CUSTOMER_Output_Msg">      <part name="body" element="tns1:OutputParameters"/>   </message>   <portType name="DOIT_SOA_EXTERNAL_CUSTOMER_V2_PortType">      <operation name="CREATE_CUSTOMER">         <input message="tns:CREATE_CUSTOMER_Input_Msg"/>         <output message="tns:CREATE_CUSTOMER_Output_Msg"/>      </operation>   </portType>   <binding name="DOIT_SOA_EXTERNAL_CUSTOMER_V2_Binding" type="tns:DOIT_SOA_EXTERNAL_CUSTOMER_V2_PortType">      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>      <operation name="CREATE_CUSTOMER">         <soap:operation soapAction="http://pegasus.doit.wisc.edu:8018/webservices/SOAProvider/plsql/doit_soa_external_customer_v2/"/>         <input>            <soap:header message="tns:CREATE_CUSTOMER_Input_Msg" part="header" use="literal"/>            <soap:body parts="body" use="literal"/>         </input>         <output>            <soap:body use="literal"/>         </output>      </operation>   </binding>   <service name="DOIT_SOA_EXTERNAL_CUSTOMER_V2_Service">      <port name="DOIT_SOA_EXTERNAL_CUSTOMER_V2_Port" binding="tns:DOIT_SOA_EXTERNAL_CUSTOMER_V2_Binding">         <soap:address location="http://pegasus.doit.wisc.edu:8018/webservices/SOAProvider/plsql/doit_soa_external_customer_v2/"/>      </port>   </service></definitions>
\ No newline at end of file
diff --git a/src/test/edu/wisc/services/cbs/external_customer/MockExternalCustomerServiceTest.php b/src/test/edu/wisc/services/cbs/external_customer/MockExternalCustomerServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..401e5308a1569748212a6935200d1d5a39bf4bab
--- /dev/null
+++ b/src/test/edu/wisc/services/cbs/external_customer/MockExternalCustomerServiceTest.php
@@ -0,0 +1,36 @@
+<?php
+
+use edu\wisc\services\cbs\external_customer\ExternalCustomer;
+use edu\wisc\services\cbs\external_customer\ExternalCustomerServiceResponse;
+use edu\wisc\services\cbs\external_customer\MockExternalCustomerService;
+
+/**
+ * Tests for {@link MockExternalCustomerService}
+ */
+class MockExternalCustomerServiceTest extends PHPUnit_Framework_TestCase
+{
+
+    /** @test */
+    public function alwaysSucceedsByDefault()
+    {
+        $client = new MockExternalCustomerService();
+        $customer = new ExternalCustomer();
+        $response = $client->createCustomer($customer);
+        static::assertTrue($response->isSuccess());
+    }
+
+    /** @test */
+    public function returnsCustomResponse()
+    {
+        $mockResponse = new ExternalCustomerServiceResponse(
+            true,
+            "Custom External Customer Service Response",
+            '123456789'
+        );
+        $client = new MockExternalCustomerService($mockResponse);
+        $customer = new ExternalCustomer();
+        $response = $client->createCustomer($customer);
+        static::assertEquals($mockResponse, $response);
+    }
+
+}
\ No newline at end of file
diff --git a/src/test/edu/wisc/services/cbs/external_customer/SoapExternalCustomerIT.php b/src/test/edu/wisc/services/cbs/external_customer/SoapExternalCustomerIT.php
new file mode 100644
index 0000000000000000000000000000000000000000..bb57fb01a0b95d37ae1f36abf6bd27440c0a8056
--- /dev/null
+++ b/src/test/edu/wisc/services/cbs/external_customer/SoapExternalCustomerIT.php
@@ -0,0 +1,34 @@
+<?php
+
+use edu\wisc\services\cbs\IntegrationTestCase;
+use edu\wisc\services\cbs\external_customer\SoapExternalCustomerService;
+
+class SoapExternalCustomerIT extends IntegrationTestCase
+{
+
+    /**
+     * @test
+     */
+    public function createsClientWithOnlyUsernameAndPassword()
+    {
+        $soapExternalCustomerService = new SoapExternalCustomerService(
+            static::$itData['cbs.username'],
+            static::$itData['cbs.password']
+        );
+        static::assertNotNull($soapExternalCustomerService);
+    }
+
+    /**
+     * @test
+     */
+    public function createsClientWithWsdl()
+    {
+        $soapExternalCustomerService = new SoapExternalCustomerService(
+            static::$itData['cbs.username'],
+            static::$itData['cbs.password'],
+            SoapExternalCustomerService::CBQA12
+        );
+        static::assertNotNull($soapExternalCustomerService);
+    }
+
+}
\ No newline at end of file