diff --git a/xs/src/admesh/stl.h b/xs/src/admesh/stl.h
index e6e69c7f6..d97760eb0 100644
--- a/xs/src/admesh/stl.h
+++ b/xs/src/admesh/stl.h
@@ -25,6 +25,12 @@
 
 #include <stdio.h>
 #include <stdint.h>
+#include <stddef.h>
+#include <boost/predef/detail/endian_compat.h>
+
+#ifndef BOOST_LITTLE_ENDIAN
+#error "admesh works correctly on little endian machines only!"
+#endif
 
 #ifdef __cplusplus
 extern "C" {
@@ -51,12 +57,16 @@ typedef struct {
   float z;
 } stl_vertex;
 
+static_assert(sizeof(stl_vertex) == 12, "size of stl_vertex incorrect");
+
 typedef struct {
   float x;
   float y;
   float z;
 } stl_normal;
 
+static_assert(sizeof(stl_normal) == 12, "size of stl_normal incorrect");
+
 typedef char stl_extra[2];
 
 typedef struct {
@@ -66,6 +76,11 @@ typedef struct {
 } stl_facet;
 #define SIZEOF_STL_FACET       50
 
+static_assert(offsetof(stl_facet, normal) == 0, "stl_facet.normal has correct offset");
+static_assert(offsetof(stl_facet, vertex) == 12, "stl_facet.vertex has correct offset");
+static_assert(offsetof(stl_facet, extra ) == 48, "stl_facet.extra has correct offset");
+static_assert(sizeof(stl_facet) >= SIZEOF_STL_FACET, "size of stl_facet incorrect");
+
 typedef enum {binary, ascii, inmemory} stl_type;
 
 typedef struct {
@@ -85,6 +100,8 @@ typedef struct stl_hash_edge {
   struct stl_hash_edge  *next;
 } stl_hash_edge;
 
+static_assert(offsetof(stl_hash_edge, facet_number) == SIZEOF_EDGE_SORT, "size of stl_hash_edge.key incorrect");
+
 typedef struct {
   // Index of a neighbor facet.
   int   neighbor[3];
diff --git a/xs/src/admesh/stl_io.c b/xs/src/admesh/stl_io.c
index e015cee99..7d8e4eab8 100644
--- a/xs/src/admesh/stl_io.c
+++ b/xs/src/admesh/stl_io.c
@@ -203,63 +203,6 @@ stl_print_neighbors(stl_file *stl, char *file) {
   fclose(fp);
 }
 
-void
-stl_put_little_int(FILE *fp, int value_in) {
-  int new_value;
-  union {
-    int  int_value;
-    char char_value[4];
-  } value;
-
-  value.int_value = value_in;
-
-  new_value  = value.char_value[0] & 0xFF;
-  new_value |= (value.char_value[1] & 0xFF) << 0x08;
-  new_value |= (value.char_value[2] & 0xFF) << 0x10;
-  new_value |= (value.char_value[3] & 0xFF) << 0x18;
-  fwrite(&new_value, sizeof(int), 1, fp);
-}
-
-void
-stl_put_little_float(FILE *fp, float value_in) {
-  int new_value;
-  union {
-    float float_value;
-    char  char_value[4];
-  } value;
-
-  value.float_value = value_in;
-
-  new_value  = value.char_value[0] & 0xFF;
-  new_value |= (value.char_value[1] & 0xFF) << 0x08;
-  new_value |= (value.char_value[2] & 0xFF) << 0x10;
-  new_value |= (value.char_value[3] & 0xFF) << 0x18;
-  fwrite(&new_value, sizeof(int), 1, fp);
-}
-
-void
-stl_write_binary_block(stl_file *stl, FILE *fp)
-{
-  int i;
-  for(i = 0; i < stl->stats.number_of_facets; i++)
-    {
-      stl_put_little_float(fp, stl->facet_start[i].normal.x);
-      stl_put_little_float(fp, stl->facet_start[i].normal.y);
-      stl_put_little_float(fp, stl->facet_start[i].normal.z);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[0].x);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[0].y);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[0].z);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[1].x);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[1].y);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[1].z);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[2].x);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[2].y);
-      stl_put_little_float(fp, stl->facet_start[i].vertex[2].z);
-      fputc(stl->facet_start[i].extra[0], fp);
-      fputc(stl->facet_start[i].extra[1], fp);
-    }
-}
-
 void
 stl_write_binary(stl_file *stl, const char *file, const char *label) {
   FILE      *fp;
@@ -285,11 +228,9 @@ stl_write_binary(stl_file *stl, const char *file, const char *label) {
   for(i = strlen(label); i < LABEL_SIZE; i++) putc(0, fp);
 
   fseek(fp, LABEL_SIZE, SEEK_SET);
-
-  stl_put_little_int(fp, stl->stats.number_of_facets);
-
-  stl_write_binary_block(stl, fp);
-
+  fwrite(&stl->stats.number_of_facets, 4, 1, fp);
+  for(i = 0; i < stl->stats.number_of_facets; i++)
+    fwrite(stl->facet_start + i, SIZEOF_STL_FACET, 1, fp);
   fclose(fp);
 }
 
diff --git a/xs/src/admesh/stlinit.c b/xs/src/admesh/stlinit.c
index 4e48ef48e..de1760bd5 100644
--- a/xs/src/admesh/stlinit.c
+++ b/xs/src/admesh/stlinit.c
@@ -27,10 +27,8 @@
 
 #include "stl.h"
 
-#if !defined(SEEK_SET)
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
+#ifndef SEEK_SET
+#error "SEEK_SET not defined"
 #endif
 
 void
@@ -277,10 +275,7 @@ stl_read(stl_file *stl, int first_facet, int first) {
       /* Read a single facet from a binary .STL file */
     {
       /* we assume little-endian architecture! */
-      if (fread(&facet.normal, sizeof(stl_normal), 1, stl->fp) \
-          + fread(&facet.vertex, sizeof(stl_vertex), 3, stl->fp) \
-          + fread(&facet.extra, sizeof(char), 2, stl->fp) != 6) {
-        perror("Cannot read facet");
+      if (fread(&facet, 1, SIZEOF_STL_FACET, stl->fp) != SIZEOF_STL_FACET) {
         stl->error = 1;
         return;
       }
@@ -343,8 +338,7 @@ stl_read(stl_file *stl, int first_facet, int first) {
     }
 #endif
     /* Write the facet into memory. */
-    stl->facet_start[i] = facet;
-
+    memcpy(stl->facet_start+i, &facet, SIZEOF_STL_FACET);
     stl_facet_stats(stl, facet, first);
     first = 0;
   }