diff --git a/src/Python/_property.py b/src/Python/_property.py
index bf7e7a53dc3f4f56ac3481e22f69832acfa264f0..151ce35bea817b2ccae296b1d7c6a2698b293911 100644
--- a/src/Python/_property.py
+++ b/src/Python/_property.py
@@ -1,8 +1,71 @@
 import requests
 import json
 
+
+"""
+Helper classes for handling leversc settings changes
+"""
+class ChangeWrapper:
+    """
+    A wrapper class for bubbling property change updates to leversc class
+    """
+    def __init__(self, parent, incollection):
+        self._parent = parent
+        self._collection = incollection
+
+    def _property_updated(self, childprop):
+        self._parent._property_updated(self)
+
+    def __getitem__(self, keyidx):
+        elem = self._collection.__getitem__(keyidx)
+        if isinstance(elem, (dict,list)):
+            return __class__(self, elem)
+        else:
+            return elem
+    
+    def __setitem__(self, keyidx, v):
+        self._collection.__setitem__(keyidx,v)
+        self._property_updated(self)
+
+    """
+    Some Quality-of-life improvements for introspecting the wrappers
+    """
+    def __str__(self):
+        return str(self._collection)
+
+    def __repr__(self):
+        return "%s(%s)"%(__class__.__name__, repr(self._collection))
+
+
+class PropWrapper(ChangeWrapper):
+    """
+    Top-level property that runs setProperty (network send) on change updates
+    """
+    def __init__(self, lsc, propname, incollection):
+        self._leversc = lsc
+        self._propname = propname
+        super(__class__,self).__init__(self,incollection)
+
+    def unwrap(self):
+        """
+        Return an unwrapped version of this property (that can be edited without network overhead)
+        """
+        return self._collection
+
+    def _property_updated(self, childprop):
+        self._leversc.setProperty(self._propname, self._collection)
+
+    def __str__(self):
+        return str(self._collection)
+
+    def __repr__(self):
+        return "%s(%s)"%(__class__.__name__, repr(self._collection))
+
+
 # retrieves/sets viewParams, renderParams, uiParams, etc....
-def setProperty(self,propertyName,propertyStruct):    
+def setProperty(self,propertyName,propertyStruct):
+    if isinstance(propertyStruct,PropWrapper):
+        propertyStruct = propertyStruct.unwrap()
     URL = self._leversc_url("/"+propertyName)
     response = requests.post(URL,json=propertyStruct)
     
@@ -13,4 +76,4 @@ def getProperty(self,propertyName):
     if 'list'==type(property):
         # view and render params come as 1 element list
         property = property[0]
-    return property
+    return PropWrapper(self,propertyName,property)
diff --git a/src/Python/leversc.py b/src/Python/leversc.py
index 05ca899fd6b3b4112b74967f2498c62388292505..b3fbd6959889187b99c8318dd9129b880f4641b6 100644
--- a/src/Python/leversc.py
+++ b/src/Python/leversc.py
@@ -375,7 +375,7 @@ class leversc:
     from _property import setProperty,getProperty
     @property
     def viewParams(self):
-        return self.getProperty('viewParams')    
+        return self.getProperty('viewParams')
     @viewParams.setter
     def viewParams(self,VP):
         self.setProperty('viewParams',VP)