diff --git a/modules/receipt/commerce_pos_receipt.info.yml b/modules/receipt/commerce_pos_receipt.info.yml
index e7c0403..628b5f2 100644
--- a/modules/receipt/commerce_pos_receipt.info.yml
+++ b/modules/receipt/commerce_pos_receipt.info.yml
@@ -3,6 +3,6 @@ description: Provides receipts printing for Commerce Point of Sale
 type: module
 core: 8.x
 package: Commerce (POS)
-
+configure: commerce_pos_receipt.settings
 dependencies:
   - commerce_pos
diff --git a/modules/receipt/commerce_pos_receipt.install b/modules/receipt/commerce_pos_receipt.install
new file mode 100644
index 0000000..a6cdcb1
--- /dev/null
+++ b/modules/receipt/commerce_pos_receipt.install
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Contains commerce_pos_receipt.install.
+ */
+
+use Drupal;
+
+/**
+ * Implements hook_uninstall().
+ */
+function commerce_pos_receipt_uninstall() {
+  // Remove states.
+  Drupal::state()->delete('commerce_pos_receipt.header');
+  Drupal::state()->delete('commerce_pos_receipt.footer');
+}
\ No newline at end of file
diff --git a/modules/receipt/commerce_pos_receipt.libraries.yml b/modules/receipt/commerce_pos_receipt.libraries.yml
index ca8a5bb..257629a 100755
--- a/modules/receipt/commerce_pos_receipt.libraries.yml
+++ b/modules/receipt/commerce_pos_receipt.libraries.yml
@@ -2,4 +2,9 @@ receipt:
   version: 1.x
   css:
     theme:
-      css/commerce_pos_receipt.css: {}
\ No newline at end of file
+      css/commerce_pos_receipt.css: {}
+  js:
+    js/commerce_pos_receipt.js: {}
+  dependencies:
+    - core/jquery
+    - core/ajax
diff --git a/modules/receipt/commerce_pos_receipt.links.menu.yml b/modules/receipt/commerce_pos_receipt.links.menu.yml
new file mode 100755
index 0000000..9553324
--- /dev/null
+++ b/modules/receipt/commerce_pos_receipt.links.menu.yml
@@ -0,0 +1,6 @@
+commerce_pos_receipt.configuration:
+  title: 'Receipt Configuration'
+  parent: commerce_pos.configuration
+  description: 'Configure the header and footers of the POS receipts.'
+  route_name: commerce_pos_receipt.settings
+  weight: 25
diff --git a/modules/receipt/commerce_pos_receipt.module b/modules/receipt/commerce_pos_receipt.module
index d45967d..24b3ef9 100644
--- a/modules/receipt/commerce_pos_receipt.module
+++ b/modules/receipt/commerce_pos_receipt.module
@@ -44,25 +44,22 @@ function commerce_pos_receipt_preprocess_commerce_pos_receipt(&$variables) {
   /* @var \Drupal\commerce_order\Entity\Order $order */
   $order = $commerce_payment->getOrder();
 
-  //  $header = variable_get('commerce_pos_receipt_header', array('value' => NULL, 'format' => NULL));
-  $header = '<h1>Header</h1>';
+  $header = Drupal::config('commerce_pos_receipt.settings')->get('header');
 
   $variables['receipt_header'] = [
     'message' => [
-      //      '#markup' => check_markup($header['value'], $header['format']),
-      '#markup' => $header,
+      '#markup' => check_markup($header['value'], $header['format']),
     ],
   ];
 
-  //  $footer = variable_get('commerce_pos_receipt_footer', array('value' => NULL, 'format' => NULL));
-  $footer = '<footer>Footer</footer>';
+  $footer = Drupal::config('commerce_pos_receipt.settings')->get('footer');
 
   $variables['receipt_footer'] = [
     'message' => [
-      //            '#markup' => check_markup($footer['value'], $footer['format']),
-      '#markup' => $footer,
+      '#markup' => check_markup($footer['value'], $footer['format']),
     ],
   ];
+
   $variables['#attached']['library'][] = 'commerce/pos-receipt';
   $variables['receipt_body'] = $commerce_payment->label();
 }
diff --git a/modules/receipt/commerce_pos_receipt.permissions.yml b/modules/receipt/commerce_pos_receipt.permissions.yml
index 5f021d8..5d5153e 100644
--- a/modules/receipt/commerce_pos_receipt.permissions.yml
+++ b/modules/receipt/commerce_pos_receipt.permissions.yml
@@ -1,3 +1,3 @@
-administer pos receipt receipts:
+administer pos receipt:
   title: 'Administer POS receipt settings'
-  restrict access: TRUE
\ No newline at end of file
+  restrict access: TRUE
diff --git a/modules/receipt/commerce_pos_receipt.routing.yml b/modules/receipt/commerce_pos_receipt.routing.yml
index fff46eb..768ede2 100644
--- a/modules/receipt/commerce_pos_receipt.routing.yml
+++ b/modules/receipt/commerce_pos_receipt.routing.yml
@@ -9,4 +9,12 @@ commerce_pos_receipt.print:
         type: 'entity:commerce_payment'
   requirements:
     _custom_access: '\Drupal\commerce_pos_receipt\Controller\PrintController::access'
-    commerce_order: \d+
\ No newline at end of file
+    commerce_order: \d+
+
+commerce_pos_receipt.settings:
+  path: '/admin/commerce/config/pos/receipt'
+  defaults:
+    _form: '\Drupal\commerce_pos_receipt\Form\ReceiptSettingsForm'
+  requirements:
+    _permission: 'administer pos receipt'
+
diff --git a/modules/receipt/css/commerce_pos_receipt.css.map b/modules/receipt/css/commerce_pos_receipt.css.map
index 1e86d7c..70fc4c4 100644
--- a/modules/receipt/css/commerce_pos_receipt.css.map
+++ b/modules/receipt/css/commerce_pos_receipt.css.map
@@ -4,4 +4,4 @@
 "sources": ["../sass/commerce_pos_receipt.scss"],
 "names": [],
 "file": "commerce_pos_receipt.css"
-}
\ No newline at end of file
+}
diff --git a/modules/receipt/js/commerce_pos_receipt.js b/modules/receipt/js/commerce_pos_receipt.js
new file mode 100644
index 0000000..65ad65c
--- /dev/null
+++ b/modules/receipt/js/commerce_pos_receipt.js
@@ -0,0 +1,36 @@
+(function ($, Drupal) {
+  Drupal.ajax.prototype.commands.printReceipt = function (ajax, response, status) {
+    $('body').html(response.content);
+    console.log(response.content);
+    $(response.content).print({
+      globalStyles: false,
+      stylesheet: Drupal.settings.commercePosReceipt.cssUrl
+    });
+  };
+
+  Drupal.behaviors.commercePosReceipt = {
+    attach: function (context, settings) {
+      console.log('12');
+
+      if (Drupal.settings.commercePosReceipt && Drupal.settings.commercePosReceipt.printInfo) {
+        printReceiptRequest(Drupal.settings.commercePosReceipt.printInfo);
+        Drupal.settings.commercePosReceipt.printInfo = false;
+      }
+    }
+  };
+
+  function printReceiptRequest (printInfo) {
+    console.log('22');
+
+    var element = $('<a id="commerce-pos-print-receipt' + printInfo.transactionId + '"></a>');
+    var element_settings = {};
+    element_settings.progress = {'type': 'throbber'};
+    element_settings.url = printInfo.printUrl;
+    element_settings.event = 'click';
+    var base = element.attr('id');
+    Drupal.ajax[base] = new Drupal.ajax(base, element.get(0), element_settings);
+
+    element.trigger('click');
+  }
+
+}(jQuery, Drupal));
diff --git a/modules/receipt/src/Ajax/PrintReceiptCommand.php b/modules/receipt/src/Ajax/PrintReceiptCommand.php
new file mode 100644
index 0000000..6e66897
--- /dev/null
+++ b/modules/receipt/src/Ajax/PrintReceiptCommand.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Drupal\commerce_pos_receipt\Ajax;
+
+use Drupal\Core\Ajax\CommandInterface;
+
+class PrintReceiptCommand implements CommandInterface {
+
+  protected $receipt;
+
+  public function __construct($receipt) {
+    $this->receipt = $receipt;
+  }
+
+  /**
+   * Return an array to be run through json_encode and sent to the client.
+   */
+  public function render() {
+    return [
+      'command' => 'printReceipt',
+      'content' => $this->receipt,
+    ];
+  }
+}
diff --git a/modules/receipt/src/Controller/PrintController.php b/modules/receipt/src/Controller/PrintController.php
index fb7120e..73bf2ec 100644
--- a/modules/receipt/src/Controller/PrintController.php
+++ b/modules/receipt/src/Controller/PrintController.php
@@ -2,7 +2,10 @@
 
 namespace Drupal\commerce_pos_receipt\Controller;
 
+use Drupal;
+use Drupal\commerce_pos_receipt\Ajax\PrintReceiptCommand;
 use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\commerce_payment\Entity\Payment;
@@ -11,18 +14,20 @@ use Drupal\commerce_payment\Entity\Payment;
  * Class PrintController.
  */
 class PrintController extends ControllerBase {
-  
+
   public function access(AccountInterface $account, Payment $commerce_payment) {
     $access = FALSE;
 
     if ($account->hasPermission('administer commerce pos')) {
       $access = TRUE;
     }
-    else if ($account->hasPermission('process commerce pos sales')) {
-      // todo check if the user that made the txn is the current user
-      // this emulates the same functionality as d7
-      if (TRUE) {
-        $access = TRUE;
+    else {
+      if ($account->hasPermission('process commerce pos sales')) {
+        // todo check if the user that made the txn is the current user
+        // this emulates the same functionality as d7
+        if (TRUE) {
+          $access = TRUE;
+        }
       }
     }
 
@@ -30,17 +35,16 @@ class PrintController extends ControllerBase {
   }
 
   public function printReceipt(Payment $commerce_payment) {
-    return [
+    $renderer = Drupal::service('renderer');
+
+    $receipt = [
       '#theme' => 'commerce_pos_receipt',
       '#commerce_payment' => $commerce_payment,
     ];
 
-    //    $commands[] = array(
-    //      'command' => 'printReceipt',
-    //      'content' => $receipt,
-    //    );
-    //
-    //    ajax_deliver(array('#type' => 'ajax', '#commands' => $commands));
+    $response = new AjaxResponse();
+    $response->addCommand(new PrintReceiptCommand($renderer->render($receipt)));
+    return $response;
   }
 
 }
diff --git a/modules/receipt/src/Form/ReceiptSettingsForm.php b/modules/receipt/src/Form/ReceiptSettingsForm.php
new file mode 100644
index 0000000..ceb78f0
--- /dev/null
+++ b/modules/receipt/src/Form/ReceiptSettingsForm.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @file Commerce POS Receipts settings form.
+ */
+
+namespace Drupal\commerce_pos_receipt\Form;
+
+use Drupal\Core\Form\ConfigFormBase;
+use Drupal\Core\Form\FormStateInterface;
+
+class ReceiptSettingsForm extends ConfigFormBase {
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+
+    $header = $this->config('commerce_pos_receipt.settings')->get('header');
+    $footer = $this->config('commerce_pos_receipt.settings')->get('footer');
+    //status_options = [];
+    //
+    //    foreach (commerce_payment_transaction_statuses() as $name => $info) {
+    //      $status_options[$name] = $info['title'];
+    //    }
+    //
+    //    $form['commerce_pos_receipt_visible_payment_status'] = array(
+    //      '#type' => 'checkboxes',
+    //      '#title' => t('Visible payment transaction statuses'),
+    //      '#options' => $status_options,
+    //      '#default_value' => variable_get('commerce_pos_receipt_visible_payment_status', array(COMMERCE_PAYMENT_STATUS_SUCCESS, COMMERCE_PAYMENT_STATUS_VOID)),
+    //      '#multiple' => TRUE,
+    //      '#description' => t('The payment statuses that should show up on a receipt'),
+    //    );
+
+    $form['commerce_pos_receipt_header'] = [
+      '#type' => 'text_format',
+      '#title' => t('Header text'),
+      '#description' => t('This text will appear at the top of printed receipts.'),
+      '#default_value' => $header ? $header['value'] : NULL,
+      '#format' => $header ? $header['format'] : NULL,
+    ];
+
+    $form['commerce_pos_receipt_footer'] = [
+      '#type' => 'text_format',
+      '#title' => t('Footer text'),
+      '#description' => t('This text will appear at the bottom of printed receipts.'),
+      '#default_value' => $footer ? $footer['value'] : NULL,
+      '#format' => $footer ? $footer['format'] : NULL,
+    ];
+
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    parent::submitForm($form, $form_state);
+
+    $values = $form_state->getValues();
+    $this->config('commerce_pos_receipt.settings')
+      ->set('header', $values['commerce_pos_receipt_header'])
+      ->set('footer', $values['commerce_pos_receipt_footer'])
+      ->save();
+  }
+
+  /**
+   * Gets the configuration names that will be editable.
+   *
+   * @return array
+   *   An array of configuration object names that are editable if called in
+   *   conjunction with the trait's config() method.
+   */
+  protected function getEditableConfigNames() {
+    return [
+      'commerce_pos_receipt.settings',
+    ];
+  }
+
+  /**
+   * Returns a unique string identifying the form.
+   *
+   * @return string
+   *   The unique string identifying the form.
+   */
+  public function getFormId() {
+    return 'commerce_pos_receipt_settings';
+  }
+}
diff --git a/modules/receipt/templates/commerce-pos-receipt.html.twig b/modules/receipt/templates/commerce-pos-receipt.html.twig
index 1b25014..af43cf3 100644
--- a/modules/receipt/templates/commerce-pos-receipt.html.twig
+++ b/modules/receipt/templates/commerce-pos-receipt.html.twig
@@ -1,7 +1,6 @@
-<!-- Add you custom twig html here -->
 {{ attach_library('commerce_pos_receipt/receipt') }}
 <div class="pos-receipt">
-    <div class="receipt-header jace">{{ receipt_header }}</div>
+    <div class="receipt-header">{{ receipt_header }}</div>
     <div class="receipt-body">{{ receipt_body }}</div>
     <div class="receipt-footer">{{ receipt_footer }}</div>
 </div>
