diff --git a/.cz-config.js b/.cz-config.js
index 16048de8258670e1ee5bc8fb0f5565b220d86d92..0a8b6be03ed5b9d368782f3e18999422072d90a0 100644
--- a/.cz-config.js
+++ b/.cz-config.js
@@ -37,6 +37,11 @@ module.exports = {
       {name: 'Commitizen'},
       {name: 'editorconfig'},
       {name: 'GIT'}
+    ],
+    docs: [
+      {name: 'Javadocs'},
+      {name: 'repo'},
+      {name: 'Maven'}
     ]
   },
 
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 43b3bab7d09e34bc0e116b19c1441fafacca83a7..4a169bcfd20a879c7ec1f6afbabf44a212f7a265 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
 
 ## 1.3.3
 
+* Fixed "`CXXABI_1.3.8' not found " error encountered on some older systems.
 * Fixed a bug where calling createProgram resulted in an exception.
 * Changed aparapi JNI load notification into a proper logger message instead of direct to system.out.
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5c9e13072492af0408fe19fe22681d9dfd6a30be..0d0a383c3cba894f9626b0e1da115456e58886c5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -62,6 +62,36 @@ ISSUES CLOSED: #31
 5. Your pull request will either be approved or feedback will be given on what needs to be
    fixed to get approval. We usually review and comment on Pull Requests within 48 hours.
 
+### Making a Release
+
+Only administrators with privilages to push to the Aparapi Maven Central account can deploy releases. If this isn't you
+then you can just skip this section.
+
+First ensure the package is prepared for the release process:
+
+* Make sure any references to the version number in the readme is updated
+  * Version number in dependency maven snippet.
+  * Add new version to javadoc version list.
+  * Ensure travis badge and javadoc badge point to static tag and not latest.
+* Ensure that none of the dependencies used are snapshots.
+* Check that all Aparapi libraries used as dependencies point to the latest version.
+
+Next lets take a few steps to do the actual release:
+
+1.  Update everything listed above. Do **not** drop the package version's `-SNAPSHOT` suffix in master.
+2.  Create a release branch, but make sure never to push this branch to the server: `git checkout -b release`.
+3.  Drop the `-SNAPSHOT` suffix from the package version.
+4.  Commit the current changes using a generic commit message such as `build(release): version 1.2.3`.
+5.  Fully test the software before deploying, run all tests and install locally to test against the examples package.
+    You can install the package locally with `mvn clean install`.
+6.  Once satisfied the package is stable deploy it to maven central by executing `mvn -P sign clean package deploy`.
+7.  If deployment was successful then create a new tag for the current version with the following command:
+    `git tag -a v1.2.3 -m "Version 1.2.3"`.
+8.  Push the newly created tags to the server: `git push origin v1.2.3:v1.2.3`.
+9.  Checkout master again and then delete the release branch: `git branch -D release`.
+10. Bump the snapshot version of the package to the next expected version, commiting the changes and pushing.
+11. Deploy the new snapshot to the snapshot repository (no need to sign): `mvn clean deploy`.
+
 ## Code of Conduct
 
 ### Our Pledge
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index ec6abbbe51b51d758375463a8d18f3afde6b62ff..99791bc9d23d1cd1e3d4d54f0ee0c9fd869b9716 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -1,6 +1,7 @@
 # Contributors
 
 * Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
+* Joergen Lundgren <joergen_lundgren@hotmail.com>
 * Florian Roesler <florian.roesler@wooga.net>
 * Denis Demidov <dennis.demidov@gmail.com>
 * Jakub Szuppe <j.szuppe@gmail.com>
diff --git a/README.md b/README.md
index 0474c4648f46f8baa67c54719238cff600d2ea86..5978af770d63df15df2354190204dfb57c9d0746 100644
--- a/README.md
+++ b/README.md
@@ -17,9 +17,13 @@ A GPU has a unique architecture that causes them to behave differently than a CP
 
 Aparapi was originally a project conceived and developed by AMD corporation. It was later abandoned by AMD and sat mostly idle for several years. Despite this there were some failed efforts by the community to keep the project alive, but without a clear community leader no new releases ever came. Eventually we came along and rescued the project. Finally after such a long wait the first Aparapi release in 5 years was published and the community continues to push forward with renewed excitement.
 
+Below you will find two side-by-side comparisons for the nbody problem on a CPU vs a GPU. The simulation is being run on an inexpensive graphics card; you can even run it yourself from the [examples project](https://github.com/Syncleus/aparapi-examples). Its obvious the drastic performance gains that can be acheived with Aparapi.
+
+![NBody GPU](http://aparapi.com/images/nbody_gpu.gif) ![NBody CPU](http://aparapi.com/images/nbody_cpu.gif)
+
 ## Support and Documentation
 
-Aparapi Javadocs: [latest](http://www.javadoc.io/doc/com.aparapi/aparapi) - [1.3.2](http://www.javadoc.io/doc/com.aparapi/aparapi/1.3.2) - [1.3.1](http://www.javadoc.io/doc/com.aparapi/aparapi/1.3.1) - [1.3.0](http://www.javadoc.io/doc/com.aparapi/aparapi/1.3.0) - [1.2.0](http://www.javadoc.io/doc/com.aparapi/aparapi/1.2.0) - [1.1.2](http://www.javadoc.io/doc/com.aparapi/aparapi/1.1.2) - [1.1.1](http://www.javadoc.io/doc/com.aparapi/aparapi/1.1.1) - [1.1.0](http://www.javadoc.io/doc/com.aparapi/aparapi/1.1.0) - [1.0.0](http://www.javadoc.io/doc/com.syncleus.aparapi/aparapi/1.0.0)
+Aparapi Javadocs: [latest](http://www.javadoc.io/doc/com.aparapi/aparapi) - [1.3.3](http://www.javadoc.io/doc/com.aparapi/aparapi/1.3.3) - [1.3.2](http://www.javadoc.io/doc/com.aparapi/aparapi/1.3.2) - [1.3.1](http://www.javadoc.io/doc/com.aparapi/aparapi/1.3.1) - [1.3.0](http://www.javadoc.io/doc/com.aparapi/aparapi/1.3.0) - [1.2.0](http://www.javadoc.io/doc/com.aparapi/aparapi/1.2.0) - [1.1.2](http://www.javadoc.io/doc/com.aparapi/aparapi/1.1.2) - [1.1.1](http://www.javadoc.io/doc/com.aparapi/aparapi/1.1.1) - [1.1.0](http://www.javadoc.io/doc/com.aparapi/aparapi/1.1.0) - [1.0.0](http://www.javadoc.io/doc/com.syncleus.aparapi/aparapi/1.0.0)
 
 For detailed documentation see [Aparapi.com](http://Aparapi.com) or check out the [latest Javadocs](http://www.javadoc.io/doc/com.aparapi/aparapi).
 
@@ -56,7 +60,7 @@ To include Aparapi in your project of choice include the following Maven depende
 <dependency>
     <groupId>com.aparapi</groupId>
     <artifactId>aparapi</artifactId>
-    <version>1.3.2</version>
+    <version>1.3.3</version>
 </dependency>
 ```
 
diff --git a/pom.xml b/pom.xml
index 9c321c2b0df8862e8f15c1e8460478edf1827c01..06f23388f5257a5cf88ade8d460b1f020dd7a9cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
 
     <groupId>com.aparapi</groupId>
     <artifactId>aparapi</artifactId>
-    <version>1.3.3-SNAPSHOT</version>
+    <version>1.3.4-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <properties>
diff --git a/src/main/java/com/aparapi/Kernel.java b/src/main/java/com/aparapi/Kernel.java
index 0692c1d77b1c43b54e20cc1960a919cd9a58e063..a735cb50e1e327ff97153f3bb5dd0b719c3fbd04 100644
--- a/src/main/java/com/aparapi/Kernel.java
+++ b/src/main/java/com/aparapi/Kernel.java
@@ -1856,6 +1856,295 @@ public abstract class Kernel implements Cloneable {
       return Math.tan(_d);
    }
 
+    private static final double LOG_2_RECIPROCAL = 1.0D / Math.log(2.0D);
+    private static final double PI_RECIPROCAL = 1.0D / Math.PI;
+
+    @OpenCLMapping(mapTo = "acospi")
+    protected final double acospi(final double a) {
+        return Math.acos(a) * PI_RECIPROCAL;
+    }
+
+    @OpenCLMapping(mapTo = "acospi")
+    protected final float acospi(final float a) {
+        return (float)(Math.acos(a) * PI_RECIPROCAL);
+    }
+
+    @OpenCLMapping(mapTo = "asinpi")
+    protected final double asinpi(final double a) {
+        return Math.asin(a) * PI_RECIPROCAL;
+    }
+
+    @OpenCLMapping(mapTo = "asinpi")
+    protected final float asinpi(final float a) {
+        return (float)(Math.asin(a) * PI_RECIPROCAL);
+    }
+
+    @OpenCLMapping(mapTo = "atanpi")
+    protected final double atanpi(final double a) {
+        return Math.atan(a) * PI_RECIPROCAL;
+    }
+
+    @OpenCLMapping(mapTo = "atanpi")
+    protected final float atanpi(final float a) {
+        return (float)(Math.atan(a) * PI_RECIPROCAL);
+    }
+
+    @OpenCLMapping(mapTo = "atan2pi")
+    protected final double atan2pi(final double y, final double x) {
+        return Math.atan2(y, x) * PI_RECIPROCAL;
+    }
+
+    @OpenCLMapping(mapTo = "atan2pi")
+    protected final float atan2pi(final float y, final double x) {
+        return (float)(Math.atan2(y, x) * PI_RECIPROCAL);
+    }
+
+    @OpenCLMapping(mapTo = "cbrt")
+    protected final double cbrt(final double a) {
+        return Math.cbrt(a);
+    }
+
+    @OpenCLMapping(mapTo = "cbrt")
+    protected final float cbrt(final float a) {
+        return (float)(Math.cbrt(a));
+    }
+
+    @OpenCLMapping(mapTo = "cosh")
+    protected final double cosh(final double x) {
+        return Math.cosh(x);
+    }
+
+    @OpenCLMapping(mapTo = "cosh")
+    protected final float cosh(final float x) {
+        return (float)(Math.cosh(x));
+    }
+
+    @OpenCLMapping(mapTo = "cospi")
+    protected final double cospi(final double a) {
+        return Math.cos(a * Math.PI);
+    }
+
+    @OpenCLMapping(mapTo = "cospi")
+    protected final float cospi(final float a) {
+        return (float)(Math.cos(a * Math.PI));
+    }
+
+    @OpenCLMapping(mapTo = "exp2")
+    protected final double exp2(final double a) {
+        return Math.pow(2.0D, a);
+    }
+
+    @OpenCLMapping(mapTo = "exp2")
+    protected final float exp2(final float a) {
+        return (float)(Math.pow(2.0D, a));
+    }
+
+    @OpenCLMapping(mapTo = "exp10")
+    protected final double exp10(final double a) {
+        return Math.pow(10.0D, a);
+    }
+
+    @OpenCLMapping(mapTo = "exp10")
+    protected final float exp10(final float a) {
+        return (float)(Math.pow(10.0D, a));
+    }
+
+    @OpenCLMapping(mapTo = "expm1")
+    protected final double expm1(final double x) {
+        return Math.expm1(x);
+    }
+
+    @OpenCLMapping(mapTo = "expm1")
+    protected final float expm1(final float x) {
+        return (float)(Math.expm1(x));
+    }
+
+    @OpenCLMapping(mapTo = "log2")
+    protected final double log2(final double a) {
+        return log(a) * LOG_2_RECIPROCAL;
+    }
+
+    @OpenCLMapping(mapTo = "log2")
+    protected final float log2(final float a) {
+        return (float)(log(a) * LOG_2_RECIPROCAL);
+    }
+
+    @OpenCLMapping(mapTo = "log10")
+    protected final double log10(final double a) {
+        return Math.log10(a);
+    }
+
+    @OpenCLMapping(mapTo = "log10")
+    protected final float log10(final float a) {
+        return (float)(Math.log10(a));
+    }
+
+    @OpenCLMapping(mapTo = "log1p")
+    protected final double log1p(final double x) {
+        return Math.log1p(x);
+    }
+
+    @OpenCLMapping(mapTo = "log1p")
+    protected final float log1p(final float x) {
+        return (float)(Math.log1p(x));
+    }
+
+    @OpenCLMapping(mapTo = "mad")
+    protected final double mad(final double a, final double b, final double c) {
+        return a * b + c;
+    }
+
+    @OpenCLMapping(mapTo = "mad")
+    protected final float mad(final float a, final float b, final float c) {
+        return a * b + c;
+    }
+
+    @OpenCLMapping(mapTo = "nextafter")
+    protected final double nextAfter(final double start, final double direction) {
+        return Math.nextAfter(start, direction);
+    }
+
+    @OpenCLMapping(mapTo = "nextafter")
+    protected final float nextAfter(final float start, final float direction) {
+        return (float)(Math.nextAfter(start, direction));
+    }
+
+    /**
+     * Delegates to either {@link java.lang.Math#sinh(double)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/sin.html">sinh(double)</a></code> (OpenCL).
+     *
+     * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
+     *
+     * @param x value to delegate to {@link java.lang.Math#sinh(double)}/<code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/sin.html">sinh(double)</a></code>
+     * @return {@link java.lang.Math#sinh(double)}/<code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/sin.html">sinh(double)</a></code>
+     *
+     * @see java.lang.Math#sinh(double)
+     * @see <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/sin.html">sinh(double)</a></code>
+     */
+    @OpenCLMapping(mapTo = "sinh")
+    protected final double sinh(final double x) {
+        return Math.sinh(x);
+    }
+
+    /**
+     * Delegates to either {@link java.lang.Math#sinh(double)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/sin.html">sinh(float)</a></code> (OpenCL).
+     *
+     * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
+     *
+     * @param x value to delegate to {@link java.lang.Math#sinh(double)}/<code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/sin.html">sinh(float)</a></code>
+     * @return {@link java.lang.Math#sinh(double)}/<code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/sin.html">sinh(float)</a></code>
+     *
+     * @see java.lang.Math#sinh(double)
+     * @see <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/sin.html">sinh(float)</a></code>
+     */
+    @OpenCLMapping(mapTo = "sinh")
+    protected final float sinh(final float x) {
+        return (float)(Math.sinh(x));
+    }
+
+    /**
+     * Backed by either {@link java.lang.Math#sin(double)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">sinpi(double)</a></code> (OpenCL).
+     *
+     * This method is equivelant to <code>Math.sin(a * Math.PI)</code>
+     *
+     * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
+     *
+     * @param a value to delegate to <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">sinpi(double)</a></code> or java equivelant
+     * @return <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">sinpi(double)</a></code> or java equivelant
+     *
+     * @see java.lang.Math#sin(double)
+     * @see <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">sinpi(double)</a></code>
+     */
+    @OpenCLMapping(mapTo = "sinpi")
+    protected final double sinpi(final double a) {
+        return Math.sin(a * Math.PI);
+    }
+
+    /**
+     * Backed by either {@link java.lang.Math#sin(double)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">sinpi(float)</a></code> (OpenCL).
+     *
+     * This method is equivelant to <code>Math.sin(a * Math.PI)</code>
+     *
+     * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
+     *
+     * @param a value to delegate to <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">sinpi(float)</a></code> or java equivelant
+     * @return <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">sinpi(float)</a></code> or java equivelant
+     *
+     * @see java.lang.Math#sin(double)
+     * @see <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">sinpi(float)</a></code>
+     */
+    @OpenCLMapping(mapTo = "sinpi")
+    protected final float sinpi(final float a) {
+        return (float)(Math.sin(a * Math.PI));
+    }
+
+    /**
+     * Delegates to either {@link java.lang.Math#tanh(double)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanh(double)</a></code> (OpenCL).
+     *
+     * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
+     *
+     * @param x value to delegate to {@link java.lang.Math#tanh(double)}/<code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanh(double)</a></code>
+     * @return {@link java.lang.Math#tanh(double)}/<code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanh(double)</a></code>
+     *
+     * @see java.lang.Math#tanh(double)
+     * @see <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanh(double)</a></code>
+     */
+    @OpenCLMapping(mapTo = "tanh")
+    protected final double tanh(final double x) {
+        return Math.tanh(x);
+    }
+
+    /**
+     * Delegates to either {@link java.lang.Math#tanh(float)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanh(float)</a></code> (OpenCL).
+     *
+     * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
+     *
+     * @param x value to delegate to {@link java.lang.Math#tanh(float)}/<code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanh(float)</a></code>
+     * @return {@link java.lang.Math#tanh(float)}/<code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanh(float)</a></code>
+     *
+     * @see java.lang.Math#tanh(float)
+     * @see <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanh(float)</a></code>
+     */
+    @OpenCLMapping(mapTo = "tanh")
+    protected final float tanh(final float x) {
+        return (float)(Math.tanh(x));
+    }
+
+    /**
+     * Backed by either {@link java.lang.Math#tan(double)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanpi(double)</a></code> (OpenCL).
+     *
+     * This method is equivelant to <code>Math.tan(a * Math.PI)</code>
+     *
+     * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
+     *
+     * @param a value to delegate to <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanpi(double)</a></code> or java equivelant
+     * @return <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanpi(double)</a></code> or java equivelant
+     *
+     * @see java.lang.Math#tan(double)
+     * @see <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanpi(double)</a></code>
+     */
+    @OpenCLMapping(mapTo = "tanpi")
+    protected final double tanpi(final double a) {
+        return Math.tan(a * Math.PI);
+    }
+
+    /**
+     * Backed by either {@link java.lang.Math#tan(double)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanpi(float)</a></code> (OpenCL).
+     *
+     * This method is equivelant to <code>Math.tan(a * Math.PI)</code>
+     *
+     * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
+     *
+     * @param a value to delegate to <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanpi(float)</a></code> or java equivelant
+     * @return <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanpi(float)</a></code> or java equivelant
+     *
+     * @see java.lang.Math#tan(double)
+     * @see <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/tan.html">tanpi(float)</a></code>
+     */
+    @OpenCLMapping(mapTo = "tanpi")
+    protected final float tanpi(final float a) {
+        return (float)(Math.tan(a * Math.PI));
+    }
+
    // the following rsqrt and native_sqrt and native_rsqrt don't exist in java Math
    // but added them here for nbody testing, not sure if we want to expose them
    /**