diff --git a/src/DirectGateway.php b/src/DirectGateway.php
new file mode 100644
index 0000000..cbb8eaf
--- /dev/null
+++ b/src/DirectGateway.php
@@ -0,0 +1,59 @@
+ '',
+ 'testMode' => false,
+ );
+ }
+
+ public function getCustomerId()
+ {
+ return $this->getParameter('customerId');
+ }
+
+ public function setCustomerId($value)
+ {
+ return $this->setParameter('customerId', $value);
+ }
+
+ public function authorize(array $parameters = array())
+ {
+ return $this->createRequest('\Omnipay\Eway\Message\DirectAuthorizeRequest', $parameters);
+ }
+
+ public function capture(array $parameters = array())
+ {
+ return $this->createRequest('\Omnipay\Eway\Message\DirectCaptureRequest', $parameters);
+ }
+
+ public function purchase(array $parameters = array())
+ {
+ return $this->createRequest('\Omnipay\Eway\Message\DirectPurchaseRequest', $parameters);
+ }
+
+ public function refund(array $parameters = array())
+ {
+ return $this->createRequest('\Omnipay\Eway\Message\DirectRefundRequest', $parameters);
+ }
+
+ public function void(array $parameters = array())
+ {
+ return $this->createRequest('\Omnipay\Eway\Message\DirectVoidRequest', $parameters);
+ }
+}
diff --git a/src/Message/DirectAbstractRequest.php b/src/Message/DirectAbstractRequest.php
new file mode 100644
index 0000000..f65ea71
--- /dev/null
+++ b/src/Message/DirectAbstractRequest.php
@@ -0,0 +1,71 @@
+httpClient->post($this->getEndpoint(), null, $data->asXML())->send();
+
+ return $this->response = new DirectResponse($this, $httpResponse->xml());
+ }
+
+ public function getCustomerId()
+ {
+ return $this->getParameter('customerId');
+ }
+
+ public function setCustomerId($value)
+ {
+ return $this->setParameter('customerId', $value);
+ }
+
+ public function setOption1($value)
+ {
+ return $this->setParameter('option1', $value);
+ }
+
+ public function getOption1()
+ {
+ return $this->getParameter('option1');
+ }
+
+ public function setOption2($value)
+ {
+ return $this->setParameter('option2', $value);
+ }
+
+ public function getOption2()
+ {
+ return $this->getParameter('option2');
+ }
+
+ public function setOption3($value)
+ {
+ return $this->setParameter('option3', $value);
+ }
+
+ public function getOption3()
+ {
+ return $this->getParameter('option3');
+ }
+
+ /**
+ * Get End Point
+ *
+ * Depends on Test or Live environment
+ *
+ * @return string
+ */
+ public function getEndpoint()
+ {
+ return $this->getTestMode() ? $this->testEndpoint : $this->liveEndpoint;
+ }
+}
diff --git a/src/Message/DirectAuthorizeRequest.php b/src/Message/DirectAuthorizeRequest.php
new file mode 100644
index 0000000..8d59fd7
--- /dev/null
+++ b/src/Message/DirectAuthorizeRequest.php
@@ -0,0 +1,53 @@
+validate('card');
+
+ $xml = '';
+ $sxml = new \SimpleXMLElement($xml);
+
+ /* eWAY Customer Id */
+ $sxml->addChild('ewayCustomerID', $this->getCustomerId());
+
+ /* eWAY Transaction Details */
+ $sxml->addChild('ewayTotalAmount', $this->getAmountInteger());
+ $sxml->addChild('ewayTrxnNumber', $this->getTransactionId());
+
+ /* Card Holder Details */
+ $card = $this->getCard();
+ $sxml->addChild('ewayCardHoldersName', $card->getName());
+ $sxml->addChild('ewayCardNumber', $card->getNumber());
+ $sxml->addChild('ewayCardExpiryMonth', $card->getExpiryDate('m'));
+ $sxml->addChild('ewayCardExpiryYear', $card->getExpiryDate('y'));
+ $sxml->addChild('ewayCVN', $card->getCVV());
+
+ /* Customer Details */
+ $sxml->addChild('ewayCustomerFirstName', $card->getFirstName());
+ $sxml->addChild('ewayCustomerLastName', $card->getLastName());
+ $sxml->addChild('ewayCustomerEmail', $card->getEmail());
+ $sxml->addChild('ewayCustomerAddress', $card->getAddress1().' '.$card->getAddress2());
+ $sxml->addChild('ewayCustomerPostcode', $card->getPostCode());
+
+ $sxml->addChild('ewayOption1', $this->getOption1());
+ $sxml->addChild('ewayOption2', $this->getOption2());
+ $sxml->addChild('ewayOption3', $this->getOption3());
+
+ $sxml->addChild('ewayCustomerInvoiceDescription', $this->getDescription());
+ $sxml->addChild('ewayCustomerInvoiceRef', $this->getTransactionReference());
+
+ return $sxml;
+ }
+}
diff --git a/src/Message/DirectCaptureRequest.php b/src/Message/DirectCaptureRequest.php
new file mode 100644
index 0000000..bb89323
--- /dev/null
+++ b/src/Message/DirectCaptureRequest.php
@@ -0,0 +1,38 @@
+validate('transactionId');
+
+ $xml = '';
+ $sxml = new \SimpleXMLElement($xml);
+
+ /* eWAY Customer Id */
+ $sxml->addChild('ewayCustomerID', $this->getCustomerId());
+
+ /* eWAY Transaction Details */
+ $sxml->addChild('ewayTotalAmount', $this->getAmountInteger());
+ $sxml->addChild('ewayAuthTrxnNumber', $this->getTransactionId());
+
+ $sxml->addChild('ewayCardExpiryMonth', null); // optional field
+ $sxml->addChild('ewayCardExpiryYear', null); // optional field
+
+ $sxml->addChild('ewayOption1', $this->getOption1());
+ $sxml->addChild('ewayOption2', $this->getOption2());
+ $sxml->addChild('ewayOption3', $this->getOption3());
+
+ return $sxml;
+ }
+}
diff --git a/src/Message/DirectPurchaseRequest.php b/src/Message/DirectPurchaseRequest.php
new file mode 100644
index 0000000..0001156
--- /dev/null
+++ b/src/Message/DirectPurchaseRequest.php
@@ -0,0 +1,53 @@
+validate('card');
+
+ $xml = '';
+ $sxml = new \SimpleXMLElement($xml);
+
+ /* eWAY Customer Id */
+ $sxml->addChild('ewayCustomerID', $this->getCustomerId());
+
+ /* eWAY Transaction Details */
+ $sxml->addChild('ewayTotalAmount', $this->getAmountInteger());
+ $sxml->addChild('ewayTrxnNumber', $this->getTransactionId());
+
+ /* Card Holder Details */
+ $card = $this->getCard();
+ $sxml->addChild('ewayCardHoldersName', $card->getName());
+ $sxml->addChild('ewayCardNumber', $card->getNumber());
+ $sxml->addChild('ewayCardExpiryMonth', $card->getExpiryDate('m'));
+ $sxml->addChild('ewayCardExpiryYear', $card->getExpiryDate('y'));
+ $sxml->addChild('ewayCVN', $card->getCVV());
+
+ /* Customer Details */
+ $sxml->addChild('ewayCustomerFirstName', $card->getFirstName());
+ $sxml->addChild('ewayCustomerLastName', $card->getLastName());
+ $sxml->addChild('ewayCustomerEmail', $card->getEmail());
+ $sxml->addChild('ewayCustomerAddress', $card->getAddress1().' '.$card->getAddress2());
+ $sxml->addChild('ewayCustomerPostcode', $card->getPostCode());
+
+ $sxml->addChild('ewayOption1', $this->getOption1());
+ $sxml->addChild('ewayOption2', $this->getOption2());
+ $sxml->addChild('ewayOption3', $this->getOption3());
+
+ $sxml->addChild('ewayCustomerInvoiceDescription', $this->getDescription());
+ $sxml->addChild('ewayCustomerInvoiceRef', $this->getTransactionReference());
+
+ return $sxml;
+ }
+}
diff --git a/src/Message/DirectRefundRequest.php b/src/Message/DirectRefundRequest.php
new file mode 100644
index 0000000..e6c511a
--- /dev/null
+++ b/src/Message/DirectRefundRequest.php
@@ -0,0 +1,53 @@
+setParameter('refundPassword', $value);
+ }
+
+ public function getRefundPassword()
+ {
+ return $this->getParameter('refundPassword');
+ }
+
+ public function getData()
+ {
+ $this->validate('refundPassword', 'transactionId');
+
+ $xml = '';
+ $sxml = new \SimpleXMLElement($xml);
+
+ /* eWAY Customer Id */
+ $sxml->addChild('ewayCustomerID', $this->getCustomerId());
+
+ /* eWAY Transaction Details */
+ $sxml->addChild('ewayTotalAmount', $this->getAmountInteger());
+ $sxml->addChild('ewayOriginalTrxnNumber', $this->getTransactionId());
+
+ /* Card Holder Details */
+ $card = $this->getCard();
+ $sxml->addChild('ewayCardExpiryMonth', $card->getExpiryDate('m'));
+ $sxml->addChild('ewayCardExpiryYear', $card->getExpiryDate('y'));
+
+ $sxml->addChild('ewayOption1', $this->getOption1());
+ $sxml->addChild('ewayOption2', $this->getOption2());
+ $sxml->addChild('ewayOption3', $this->getOption3());
+
+ $sxml->addChild('ewayRefundPassword', $this->getRefundPassword());
+ $sxml->addChild('ewayCustomerInvoiceRef', $this->getTransactionReference());
+
+ return $sxml;
+ }
+}
diff --git a/src/Message/DirectResponse.php b/src/Message/DirectResponse.php
new file mode 100644
index 0000000..5dbb81c
--- /dev/null
+++ b/src/Message/DirectResponse.php
@@ -0,0 +1,37 @@
+data->ewayTrxnStatus;
+ }
+
+ public function isRedirect()
+ {
+ return false;
+ }
+
+ public function getTransactionReference()
+ {
+ if (empty($this->data->ewayTrxnNumber)) {
+ return null;
+ }
+
+ return (int) $this->data->ewayTrxnNumber;
+ }
+
+ public function getMessage()
+ {
+ return (string) $this->data->ewayTrxnError;
+ }
+}
diff --git a/src/Message/DirectVoidRequest.php b/src/Message/DirectVoidRequest.php
new file mode 100644
index 0000000..d806f0c
--- /dev/null
+++ b/src/Message/DirectVoidRequest.php
@@ -0,0 +1,35 @@
+validate('transactionId');
+
+ $xml = '';
+ $sxml = new \SimpleXMLElement($xml);
+
+ /* eWAY Customer Id */
+ $sxml->addChild('ewayCustomerID', $this->getCustomerId());
+
+ /* eWAY Transaction Details */
+ $sxml->addChild('ewayTotalAmount', $this->getAmountInteger());
+ $sxml->addChild('ewayAuthTrxnNumber', $this->getTransactionId());
+
+ $sxml->addChild('ewayOption1', $this->getOption1());
+ $sxml->addChild('ewayOption2', $this->getOption2());
+ $sxml->addChild('ewayOption3', $this->getOption3());
+
+ return $sxml;
+ }
+}
diff --git a/tests/DirectGatewayTest.php b/tests/DirectGatewayTest.php
new file mode 100644
index 0000000..838fb3b
--- /dev/null
+++ b/tests/DirectGatewayTest.php
@@ -0,0 +1,204 @@
+gateway = new DirectGateway($this->getHttpClient(), $this->getHttpRequest());
+
+ $this->gateway->setCustomerId('999999999');
+ $this->gateway->setTestMode(true);
+
+ $card = new CreditCard($this->getValidCard());
+
+ $this->purchaseOptions = array(
+ 'amount' => '10.00',
+ 'card' => $card
+ );
+
+ $this->captureOptions = array(
+ 'amount' => '10.00',
+ 'transactionId' => '10451614'
+ );
+
+ $this->refundOptions = array(
+ 'card' => $card,
+ 'amount' => '10.00',
+ 'transactionId' => '10451628',
+ 'refundPassword' => 'Refund123'
+ );
+
+ $this->voidOptions = array(
+ 'transactionId' => '10451636'
+ );
+ }
+
+ public function testAuthorizeSuccess()
+ {
+ $this->setMockHttpResponse('DirectAuthorizeSuccess.txt');
+
+ $request = $this->gateway->authorize($this->purchaseOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectAuthorizeRequest', $request);
+
+ $this->assertTrue($response->isSuccessful());
+ $this->assertSame('10.00', $request->getAmount());
+ $this->assertSame(10451615, $response->getTransactionReference());
+ $this->assertSame('00, Transaction Approved (Sandbox)', $response->getMessage());
+ }
+
+ public function testAuthorizeFailure()
+ {
+ $this->purchaseOptions['amount'] = '10.63';
+
+ $this->setMockHttpResponse('DirectAuthorizeFailure.txt');
+
+ $request = $this->gateway->authorize($this->purchaseOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectAuthorizeRequest', $request);
+
+ $this->assertFalse($response->isSuccessful());
+ $this->assertSame('10.63', $request->getAmount());
+ $this->assertSame(10451614, $response->getTransactionReference());
+ $this->assertSame('63, Security Violation (Sandbox)', $response->getMessage());
+ }
+
+ public function testCaptureSuccess()
+ {
+ $this->setMockHttpResponse('DirectCaptureSuccess.txt');
+
+ $request = $this->gateway->capture($this->captureOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectCaptureRequest', $request);
+
+ $this->assertTrue($response->isSuccessful());
+ $this->assertSame('10.00', $request->getAmount());
+ $this->assertSame(10451626, $response->getTransactionReference());
+ $this->assertSame('00, Transaction Approved (Sandbox)', $response->getMessage());
+ }
+
+ public function testCaptureFailure()
+ {
+ $this->setMockHttpResponse('DirectCaptureFailure.txt');
+
+ $request = $this->gateway->capture($this->captureOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectCaptureRequest', $request);
+
+ $this->assertFalse($response->isSuccessful());
+ $this->assertSame('10.00', $request->getAmount());
+ $this->assertSame('Error: This authorisation has already been completed. Your transaction could not be processed.', $response->getMessage());
+ }
+
+ public function testPurchaseSuccess()
+ {
+ $this->setMockHttpResponse('DirectPurchaseSuccess.txt');
+
+ $request = $this->gateway->purchase($this->purchaseOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectPurchaseRequest', $request);
+
+ $this->assertTrue($response->isSuccessful());
+ $this->assertSame('10.00', $request->getAmount());
+ $this->assertSame(10451628, $response->getTransactionReference());
+ $this->assertSame('00, Transaction Approved (Sandbox)', $response->getMessage());
+ }
+
+ public function testPurchaseFailure()
+ {
+ $this->purchaseOptions['amount'] = '10.63';
+
+ $this->setMockHttpResponse('DirectPurchaseFailure.txt');
+
+ $request = $this->gateway->purchase($this->purchaseOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectPurchaseRequest', $request);
+
+ $this->assertFalse($response->isSuccessful());
+ $this->assertSame('10.63', $request->getAmount());
+ $this->assertSame(10451629, $response->getTransactionReference());
+ $this->assertSame('63, Security Violation (Sandbox)', $response->getMessage());
+ }
+
+ public function testRefundSuccess()
+ {
+ $this->setMockHttpResponse('DirectRefundSuccess.txt');
+
+ $request = $this->gateway->refund($this->refundOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectRefundRequest', $request);
+
+ $this->assertTrue($response->isSuccessful());
+ $this->assertSame('10.00', $request->getAmount());
+ $this->assertSame(10451632, $response->getTransactionReference());
+ $this->assertSame('00,Transaction Approved (Sandbox)', $response->getMessage());
+ }
+
+ public function testRefundFailure()
+ {
+ $this->setMockHttpResponse('DirectRefundFailure.txt');
+
+ $request = $this->gateway->refund($this->refundOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectRefundRequest', $request);
+
+ $this->assertFalse($response->isSuccessful());
+ $this->assertSame('10.00', $request->getAmount());
+ $this->assertSame('Error: This transaction has already been refunded for its total amount. Your refund could not be processed.', $response->getMessage());
+ }
+
+ public function testVoidSuccess()
+ {
+ $this->setMockHttpResponse('DirectVoidSuccess.txt');
+
+ $request = $this->gateway->void($this->voidOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectVoidRequest', $request);
+
+ $this->assertTrue($response->isSuccessful());
+ $this->assertNull($request->getAmount());
+ $this->assertSame(10451638, $response->getTransactionReference());
+ $this->assertSame('00, Transaction Approved (Sandbox)', $response->getMessage());
+ }
+
+ public function testVoidFailure()
+ {
+ $this->setMockHttpResponse('DirectVoidFailure.txt');
+
+ $request = $this->gateway->void($this->voidOptions);
+
+ $response = $request->send();
+
+ $this->assertInstanceOf('Omnipay\Eway\Message\DirectVoidRequest', $request);
+
+ $this->assertFalse($response->isSuccessful());
+ $this->assertNull($request->getAmount());
+ $this->assertSame('Error: This authorisation has already been voided. Your transaction could not be processed.', $response->getMessage());
+ }
+
+}
diff --git a/tests/Mock/DirectAuthorizeFailure.txt b/tests/Mock/DirectAuthorizeFailure.txt
new file mode 100644
index 0000000..9776336
--- /dev/null
+++ b/tests/Mock/DirectAuthorizeFailure.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 303
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 07:38:36 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDQGBTRCAQ=JPCMEJKCMNEMLPNABCDAFFCM; secure; path=/, BIGipServerVirtServerPool-001-SSL=16976650.47873.0000; path=/
+
+False10451614956363, Security Violation (Sandbox)
\ No newline at end of file
diff --git a/tests/Mock/DirectAuthorizeSuccess.txt b/tests/Mock/DirectAuthorizeSuccess.txt
new file mode 100644
index 0000000..7ae6df0
--- /dev/null
+++ b/tests/Mock/DirectAuthorizeSuccess.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 324
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 07:39:18 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDCWTCADRB=FBDJPIICLAMAOPABHKLFGNIP; secure; path=/, BIGipServerVirtServerPool-001-SSL=855837450.47873.0000; path=/
+
+True10451615198238100000, Transaction Approved (Sandbox)
\ No newline at end of file
diff --git a/tests/Mock/DirectCaptureFailure.txt b/tests/Mock/DirectCaptureFailure.txt
new file mode 100644
index 0000000..60ae20e
--- /dev/null
+++ b/tests/Mock/DirectCaptureFailure.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 321
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 07:47:47 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDCUCBTQTR=KBLMKEKCGDBLNKOGPDGPPIND; secure; path=/, BIGipServerVirtServerPool-001-SSL=1694698250.47873.0000; path=/
+
+False1000Error: This authorisation has already been completed. Your transaction could not be processed.
\ No newline at end of file
diff --git a/tests/Mock/DirectCaptureSuccess.txt b/tests/Mock/DirectCaptureSuccess.txt
new file mode 100644
index 0000000..aedcdb4
--- /dev/null
+++ b/tests/Mock/DirectCaptureSuccess.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 304
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 07:47:37 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDCUCBTQTR=JBLMKEKCJPMCLDHOIHGLFNFA; secure; path=/, BIGipServerVirtServerPool-001-SSL=1694698250.47873.0000; path=/
+
+True10451626453711100000, Transaction Approved (Sandbox)
\ No newline at end of file
diff --git a/tests/Mock/DirectPurchaseFailure.txt b/tests/Mock/DirectPurchaseFailure.txt
new file mode 100644
index 0000000..93bf663
--- /dev/null
+++ b/tests/Mock/DirectPurchaseFailure.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 303
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 07:52:49 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDAUABRRQT=GPIIKEKCLJCKBMGFHHMDEENF; secure; path=/, BIGipServerVirtServerPool-001-SSL=1694698250.47873.0000; path=/
+
+False10451629106363, Security Violation (Sandbox)
\ No newline at end of file
diff --git a/tests/Mock/DirectPurchaseSuccess.txt b/tests/Mock/DirectPurchaseSuccess.txt
new file mode 100644
index 0000000..5e0182d
--- /dev/null
+++ b/tests/Mock/DirectPurchaseSuccess.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 324
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 07:52:16 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDQGBTRCAQ=GODMEJKCMFEANBDKFHNHOLFF; secure; path=/, BIGipServerVirtServerPool-001-SSL=16976650.47873.0000; path=/
+
+True10451628865732100000, Transaction Approved (Sandbox)
\ No newline at end of file
diff --git a/tests/Mock/DirectRefundFailure.txt b/tests/Mock/DirectRefundFailure.txt
new file mode 100644
index 0000000..faf7a06
--- /dev/null
+++ b/tests/Mock/DirectRefundFailure.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 334
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 07:57:19 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDAWTADDQB=CCKABEICHPIBLDIMHCCGIKEM; secure; path=/, BIGipServerVirtServerPool-001-SSL=855837450.47873.0000; path=/
+
+False1000Error: This transaction has already been refunded for its total amount. Your refund could not be processed.
\ No newline at end of file
diff --git a/tests/Mock/DirectRefundSuccess.txt b/tests/Mock/DirectRefundSuccess.txt
new file mode 100644
index 0000000..d6a7ef8
--- /dev/null
+++ b/tests/Mock/DirectRefundSuccess.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 303
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 07:56:51 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDCUCBTQTR=ODLMKEKCNOIBGDDCBGCCINPK; secure; path=/, BIGipServerVirtServerPool-001-SSL=1694698250.47873.0000; path=/
+
+True10451632665971100000,Transaction Approved (Sandbox)
\ No newline at end of file
diff --git a/tests/Mock/DirectVoidFailure.txt b/tests/Mock/DirectVoidFailure.txt
new file mode 100644
index 0000000..4955006
--- /dev/null
+++ b/tests/Mock/DirectVoidFailure.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 315
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 08:00:39 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDSEASQAAR=DLHMDJKCFPHAPDBFONGNEHHO; secure; path=/, BIGipServerVirtServerPool-001-SSL=16976650.47873.0000; path=/
+
+False0Error: This authorisation has already been voided. Your transaction could not be processed.
\ No newline at end of file
diff --git a/tests/Mock/DirectVoidSuccess.txt b/tests/Mock/DirectVoidSuccess.txt
new file mode 100644
index 0000000..5db157a
--- /dev/null
+++ b/tests/Mock/DirectVoidSuccess.txt
@@ -0,0 +1,11 @@
+HTTP/1.1 200 OK
+Cache-Control: private
+Content-Length: 301
+Content-Type: text/xml
+Server: Microsoft-IIS/7.5
+X-Powered-By: ASP.NET
+Date: Thu, 21 Nov 2013 08:00:23 GMT
+Connection: keep-alive
+Set-Cookie: ASPSESSIONIDAWTADDQB=OCKABEICOAFLANJGKOLFMIKD; secure; path=/, BIGipServerVirtServerPool-001-SSL=855837450.47873.0000; path=/
+
+True10451638164555000, Transaction Approved (Sandbox)
\ No newline at end of file