Make linux.system.kernel functional
diff --git a/README.rst b/README.rst
index bd9d7f2..2e782e6 100644
--- a/README.rst
+++ b/README.rst
@@ -134,6 +134,33 @@
 
 To disable set autologin to `false`.
 
+Kernel
+~~~~~~
+
+Install always up to date LTS kernel and headers from Ubuntu trusty:
+
+.. code-block:: yaml
+
+    linux:
+      system:
+        kernel:
+          type: generic
+          lts: trusty
+          headers: true
+
+Install specific kernel version and ensure all other kernel packages are
+not present. Also install extra modules and headers for this kernel:
+
+.. code-block:: yaml
+
+    linux:
+      system:
+        kernel:
+          type: generic
+          extra: true
+          headers: true
+          version: 4.2.0-22
+
 Repositories
 ~~~~~~~~~~~~
 
diff --git a/linux/system/kernel.sls b/linux/system/kernel.sls
index 4732e2d..de3bb45 100644
--- a/linux/system/kernel.sls
+++ b/linux/system/kernel.sls
@@ -3,71 +3,43 @@
 
 {%- if system.kernel is defined %}
 
-Basic kernel:
-
-  linux:
-    system:
-      kernel:
-        hold: true
-        versions:
-          generic:
-            headers: true
-
-
-  linux:
-    system:
-      kernel:
-        source:
-          engine: pkg
-          repo: from_repo
-        version: 1.13.42
-        hold: true
-        headers: true
-        generic: true
-
-linux-headers-3.13.0-34
-linux-image-3.13.0-34-generic
-linux-headers-3.13.0-34-generic
-
-{%- if system.kernel.get('source', {'engine': 'pkg'}).engine == 'pkg' %}
-
 {%- if system.kernel.version is defined %}
 
 linux_kernel_package:
   pkg.installed:
-  - name: linux-image-{{ system.kernel.version }}
+  - names:
+    - linux-image-{{ system.kernel.version }}-{{ system.kernel.type|default('generic') }}
+    {%- if system.kernel.get('headers', False) %}
+    - linux-headers-{{ system.kernel.version }}-{{ system.kernel.type|default('generic') }}
+    {%- endif %}
+    {%- if system.kernel.get('extra', False) %}
+    - linux-extra-{{ system.kernel.version }}-{{ system.kernel.type|default('generic') }}
+    {%- endif %}
   - refresh: true
 
+# Not very Salt-ish.. :-(
+linux_kernel_old_absent:
+  cmd.wait:
+  - name: "apt-get purge -y --no-input $(dpkg -l '*linux-image-[0-9]*' '*linux-headers-[0-9]*' '*linux-extra-[0-9]*' | grep -E '^ii' | awk '{print $2}' | grep -v '{{ system.kernel.version }}')"
+  - watch:
+    - pkg: linux_kernel_package
+
 {%- else %}
 
 linux_kernel_package:
   pkg.latest:
-  - name: linux-image-generic
+  - names:
+    - linux-image-{{ system.kernel.type|default('generic') }}{% if system.kernel.get('lts', False) %}-lts-{{ system.kernel.lts }}{% endif %}
+    {%- if system.kernel.get('headers', False) %}
+    - linux-headers-{{ system.kernel.type|default('generic') }}{% if system.kernel.get('lts', False) %}-lts-{{ system.kernel.lts }}{% endif %}
+    {%- endif %}
+    {%- if system.kernel.get('extra', False) %}
+    - linux-extra-{{ system.kernel.type|default('generic') }}{% if system.kernel.get('lts', False) %}-lts-{{ system.kernel.lts }}{% endif %}
+    {%- endif %}
   - refresh: true
 
 {%- endif %}
 
-{%- if system.kernel.headers is defined %}
-{%- if system.kernel.version is defined %}
-
-linux_kernel_package:
-  pkg.installed:
-  - name: linux-image-{{ system.kernel.version }}
-  - version: 
-  - refresh: true
-
-{%- else %}
-
-linux_kernel_package:
-  pkg.latest:
-  - name: linux-image-generic
-  - refresh: true
-
-{%- endif %}
 {%- endif %}
 
 {%- endif %}
-
-{%- endif %}
-
-{%- endif %}
\ No newline at end of file