diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py
index 22a4279dce5a88f1b09c33193cc104e6b42731e9..e807a04971bd7a81fe9df38032ecd17e90c734f7 100644
--- a/io_scene_fbx/import_fbx.py
+++ b/io_scene_fbx/import_fbx.py
@@ -351,18 +351,29 @@ def blen_read_geom_array_mapped_edge(
     fbx_layer_data, fbx_layer_index,
     fbx_layer_mapping, fbx_layer_ref,
     stride, item_size, descr,
+    xform=None,
     ):
 
     if fbx_layer_mapping == b'ByEdge':
         if fbx_layer_ref == b'Direct':
             if stride == 1:
-                for i, blen_data_item in enumerate(blen_data):
-                    setattr(blen_data_item, blend_attr,
-                            fbx_layer_data[i])
+                if xform is None:
+                    for i, blen_data_item in enumerate(blen_data):
+                        setattr(blen_data_item, blend_attr,
+                                fbx_layer_data[i])
+                else:
+                    for i, blen_data_item in enumerate(blen_data):
+                        setattr(blen_data_item, blend_attr,
+                                xform(fbx_layer_data[i]))
             else:
-                for i, blen_data_item in enumerate(blen_data):
-                    setattr(blen_data_item, blend_attr,
-                            fbx_layer_data[(i * stride): (i * stride) + item_size])
+                if xform is None:
+                    for i, blen_data_item in enumerate(blen_data):
+                        setattr(blen_data_item, blend_attr,
+                                fbx_layer_data[(i * stride): (i * stride) + item_size])
+                else:
+                    for i, blen_data_item in enumerate(blen_data):
+                        setattr(blen_data_item, blend_attr,
+                                xform(fbx_layer_data[(i * stride): (i * stride) + item_size]))
             return True
         else:
             print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref))
@@ -377,6 +388,7 @@ def blen_read_geom_array_mapped_polygon(
     fbx_layer_data, fbx_layer_index,
     fbx_layer_mapping, fbx_layer_ref,
     stride, item_size, descr,
+    xform=None,
     ):
 
     if fbx_layer_mapping == b'ByPolygon':
@@ -393,8 +405,12 @@ def blen_read_geom_array_mapped_polygon(
         elif fbx_layer_ref == b'Direct':
             # looks like direct may have different meanings!
             assert(stride == 1)
-            for i in fbx_layer_data:
-                setattr(blen_data[i - 1], blend_attr, True)
+            if xform is None:
+                for i in range(len(fbx_layer_data)):
+                    setattr(blen_data[i], blend_attr, fbx_layer_data[i])
+            else:
+                for i in range(len(fbx_layer_data)):
+                    setattr(blen_data[i], blend_attr, xform(fbx_layer_data[i]))
             return True
         else:
             print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref))
@@ -543,11 +559,8 @@ def blen_read_geom_layer_smooth(fbx_obj, mesh):
             fbx_layer_data, None,
             fbx_layer_mapping, fbx_layer_ref,
             1, 1, layer_id,
+            xform=lambda s: not s,
             )
-        if ok_smooth:
-            # ugh, need to negate
-            for e in mesh.edges:
-                e.use_edge_sharp = not e.use_edge_sharp
         return ok_smooth
     elif fbx_layer_mapping == b'ByPolygon':
         blen_data = mesh.polygons
@@ -556,6 +569,7 @@ def blen_read_geom_layer_smooth(fbx_obj, mesh):
             fbx_layer_data, None,
             fbx_layer_mapping, fbx_layer_ref,
             1, 1, layer_id,
+            xform=lambda s: (s != 0),  # smoothgroup bitflags, treat as booleans for now
             )
     else:
         print("warning layer %r mapping type unsupported: %r" % (fbx_layer.id, fbx_layer_mapping))