diff --git a/addressfield/widgets.py b/addressfield/widgets.py
index 7e1edce3880650de8cb89de22ca2f35b759f011c..11ef7ccbbd75936c83138c81049affe564debe8e 100644
--- a/addressfield/widgets.py
+++ b/addressfield/widgets.py
@@ -29,18 +29,31 @@ class NestedMultiWidget(KeepOwnAttrsWidget, forms.MultiWidget):
         ]
         super().__init__(widgets, *args, **kwargs)
 
+    @property
+    def field_names(self):
+        return list(self.components.keys())
+
     def decompress(self, value):
         if value:
-            return [value.get(field) for field in self.components.keys()]
+            decompressed = list()
+            for i, widget in enumerate(self.widgets):
+                if hasattr(widget, 'components'):
+                    decompressed.append(widget.decompress(value))
+                else:
+                    decompressed.append(value.get(self.field_names[i]))
+            return decompressed
         return [None] * len(self.components)
 
     def value_from_datadict(self, data, files, name):
-        field_names = list(self.components.keys())
-        return {
-            field_names[i]: widget.value_from_datadict(data, files, name + '_%s' % i)
-            for i, widget in enumerate(self.widgets)
-        }
-
+        value = dict()
+        for i, widget in enumerate(self.widgets):
+            widget_value = widget.value_from_datadict(data, files, name + '_%s' % i)
+            # flatten the data structure to a single dict
+            if hasattr(widget, 'widgets'):
+                value.update(widget_value)
+            else:
+                value[self.field_names[i]] = widget_value
+        return value
 
 class LocalityWidget(NestedMultiWidget):
     components = {