diff --git a/src/mol-gl/shader/chunks/apply-marker-color.glsl b/src/mol-gl/shader/chunks/apply-marker-color.glsl
index cc65b55255af0f62e342933641ebf6ab60c05e84..daa93f04d774627a3d84c98b0c9e8d0de371d440 100644
--- a/src/mol-gl/shader/chunks/apply-marker-color.glsl
+++ b/src/mol-gl/shader/chunks/apply-marker-color.glsl
@@ -2,7 +2,7 @@
 if (uAlpha >= uPickingAlphaThreshold) {
     float marker = vMarker * 255.0;
     if (marker > 0.1) {
-        if (mod(marker, 2.0) > 0.1) {
+        if (intMod(marker, 2.0) > 0.1) {
             gl_FragColor.rgb = mix(uHighlightColor, gl_FragColor.rgb, 0.3);
         } else {
             gl_FragColor.rgb = mix(uSelectColor, gl_FragColor.rgb, 0.3);
diff --git a/src/mol-gl/shader/chunks/common-frag-params.glsl b/src/mol-gl/shader/chunks/common-frag-params.glsl
index dc62dbe9bec92fae2018665d136b5f10e624f71b..9048de9fd32056f16cbd386f9683cccf9e09ac46 100644
--- a/src/mol-gl/shader/chunks/common-frag-params.glsl
+++ b/src/mol-gl/shader/chunks/common-frag-params.glsl
@@ -14,4 +14,6 @@ uniform vec3 uFogColor;
 
 uniform float uAlpha;
 uniform float uPickingAlphaThreshold;
-uniform int uPickable;
\ No newline at end of file
+uniform int uPickable;
+
+#pragma glslify: import('./common.glsl')
\ No newline at end of file
diff --git a/src/mol-gl/shader/chunks/common-vert-params.glsl b/src/mol-gl/shader/chunks/common-vert-params.glsl
index 5028d0abb23450b2c7126a1ed256a6ebfeff95d6..e2b15799cbbdc638f2796e680838ffdcd24a566f 100644
--- a/src/mol-gl/shader/chunks/common-vert-params.glsl
+++ b/src/mol-gl/shader/chunks/common-vert-params.glsl
@@ -10,4 +10,5 @@ varying float vMarker;
 
 varying vec3 vViewPosition;
 
-#pragma glslify: readFromTexture = require(../utils/read-from-texture.glsl)
\ No newline at end of file
+#pragma glslify: import('./common.glsl')
+#pragma glslify: readFromTexture = require('../utils/read-from-texture.glsl', intMod=intMod, intDiv=intDiv, foo=foo) // foo=foo is a workaround for a bug in glslify
\ No newline at end of file
diff --git a/src/mol-gl/shader/chunks/common.glsl b/src/mol-gl/shader/chunks/common.glsl
new file mode 100644
index 0000000000000000000000000000000000000000..cea7b801c7dbecfd57c393de02fed6023156ffbb
--- /dev/null
+++ b/src/mol-gl/shader/chunks/common.glsl
@@ -0,0 +1,2 @@
+float intDiv(float a, float b) { return float(int(a) / int(b)); }
+float intMod(float a, float b) { return a - b * float(int(a) / int(b)); }
\ No newline at end of file
diff --git a/src/mol-gl/shader/direct-volume.frag b/src/mol-gl/shader/direct-volume.frag
index d94f580286440e3c29ef0aaf57e391d8a289b5a7..47ccb7dd689daca83a62ebf63c36e2b8670f78f1 100644
--- a/src/mol-gl/shader/direct-volume.frag
+++ b/src/mol-gl/shader/direct-volume.frag
@@ -45,11 +45,12 @@ uniform int uPickable;
     uniform sampler2D tColor;
 #endif
 
-#pragma glslify: readFromTexture = require(./utils/read-from-texture.glsl)
+#pragma glslify: import('./chunks/common.glsl')
+#pragma glslify: readFromTexture = require(./utils/read-from-texture.glsl, intMod=intMod, intDiv=intDiv, foo=foo) // foo=foo is a workaround for a bug in glslify
 #pragma glslify: encodeIdRGB = require(./utils/encode-id-rgb.glsl)
 #pragma glslify: decodeIdRGB = require(./utils/decode-id-rgb.glsl)
-#pragma glslify: texture3dFrom2dNearest = require(./utils/texture3d-from-2d-nearest.glsl)
-#pragma glslify: texture3dFrom2dLinear = require(./utils/texture3d-from-2d-linear.glsl)
+#pragma glslify: texture3dFrom2dNearest = require(./utils/texture3d-from-2d-nearest.glsl, intMod=intMod, intDiv=intDiv, foo=foo) // foo=foo is a workaround for a bug in glslify
+#pragma glslify: texture3dFrom2dLinear = require(./utils/texture3d-from-2d-linear.glsl, intMod=intMod, intDiv=intDiv, foo=foo) // foo=foo is a workaround for a bug in glslify
 
 // uniform vec3 uLightPosition;
 uniform vec3 uLightColor;
diff --git a/src/mol-gl/shader/gaussian-density.frag b/src/mol-gl/shader/gaussian-density.frag
index ce7bacf7acdf79d87af242c8d8e20379041f83dd..137c2189100d4c1ba4c070e189cc10de0f0a5dbe 100644
--- a/src/mol-gl/shader/gaussian-density.frag
+++ b/src/mol-gl/shader/gaussian-density.frag
@@ -21,8 +21,9 @@ varying float vRadius;
     varying float vGroup;
 #endif
 
+#pragma glslify: import('./chunks/common.glsl')
 #pragma glslify: encodeIdRGB = require(./utils/encode-id-rgb.glsl)
-#pragma glslify: texture3dFrom2dNearest = require(./utils/texture3d-from-2d-nearest.glsl)
+#pragma glslify: texture3dFrom2dNearest = require(./utils/texture3d-from-2d-nearest.glsl, intMod=intMod, intDiv=intDiv, foo=foo) // foo=foo is a workaround for a bug in glslify
 
 uniform vec3 uBboxSize;
 uniform vec3 uBboxMin;
diff --git a/src/mol-gl/shader/utils/encode-float-rgb.glsl b/src/mol-gl/shader/utils/encode-float-rgb.glsl
index 1cecbf759e9efc95c259c9e2389c052b6a627c59..07183663150d825630e63e886432bb0d9f2993c1 100644
--- a/src/mol-gl/shader/utils/encode-float-rgb.glsl
+++ b/src/mol-gl/shader/utils/encode-float-rgb.glsl
@@ -4,8 +4,6 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-// TODO use myMod and myDiv to fix issues with picking?
-
 vec3 encodeFloatRGB(in float value) {
     value = clamp(value, 0.0, 16777216.0);
     vec3 c = vec3(0.0);
diff --git a/src/mol-gl/shader/utils/read-from-texture.glsl b/src/mol-gl/shader/utils/read-from-texture.glsl
index 7442b957dcd212f310fd8090102c618093f29a44..97843f8e2df610df67b6d19f463626351b144251 100644
--- a/src/mol-gl/shader/utils/read-from-texture.glsl
+++ b/src/mol-gl/shader/utils/read-from-texture.glsl
@@ -4,9 +4,6 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-float intDiv(float a, float b) { return float(int(a) / int(b)); }
-float intMod(float a, float b) { return a - b * float(int(a) / int(b)); }
-
 vec4 readFromTexture (const in sampler2D tex, const in float i, const in vec2 dim) {
     float x = intMod(i, dim.x);
     float y = floor(intDiv(i, dim.x));
diff --git a/src/mol-gl/shader/utils/texture3d-from-2d-linear.glsl b/src/mol-gl/shader/utils/texture3d-from-2d-linear.glsl
index d0d4f928722704f05356bb122005853f55cac4b1..0a9ceffa8c8798ced39e5e1b68758f1ae0c39b96 100644
--- a/src/mol-gl/shader/utils/texture3d-from-2d-linear.glsl
+++ b/src/mol-gl/shader/utils/texture3d-from-2d-linear.glsl
@@ -5,9 +5,6 @@
  * @author Michael Krone <michael.krone@uni-tuebingen.de>
  */
 
-float intDiv(float a, float b) { return float(int(a) / int(b)); }
-float intMod(float a, float b) { return a - b * float(int(a) / int(b)); }
-
 vec4 texture3dFrom2dLinear(sampler2D tex, vec3 pos, vec3 gridDim, vec2 texDim) {
     float zSlice0 = floor(pos.z * gridDim.z);
     float column0 = intMod(zSlice0 * gridDim.x, texDim.x) / gridDim.x;
diff --git a/src/mol-gl/shader/utils/texture3d-from-2d-nearest.glsl b/src/mol-gl/shader/utils/texture3d-from-2d-nearest.glsl
index 8c4fb0882c831709358714535f7c24be8637e4a9..b9570eaef378a8d3be78ab8aebb4e7d0570f2d86 100644
--- a/src/mol-gl/shader/utils/texture3d-from-2d-nearest.glsl
+++ b/src/mol-gl/shader/utils/texture3d-from-2d-nearest.glsl
@@ -5,9 +5,6 @@
  * @author Michael Krone <michael.krone@uni-tuebingen.de>
  */
 
-float intDiv(float a, float b) { return float(int(a) / int(b)); }
-float intMod(float a, float b) { return a - b * float(int(a) / int(b)); }
-
 vec4 texture3dFrom2dNearest(sampler2D tex, vec3 pos, vec3 gridDim, vec2 texDim) {
     float zSlice = floor(pos.z * gridDim.z + 0.5); // round to nearest z-slice
     float column = intMod(zSlice * gridDim.x, texDim.x) / gridDim.x;