diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp
index 41aeaba468..cad6a852cb 100644
--- a/assignment-client/src/assets/AssetServer.cpp
+++ b/assignment-client/src/assets/AssetServer.cpp
@@ -915,59 +915,52 @@ void AssetServer::handleAssetUpload(QSharedPointer<ReceivedMessage> message, Sha
 void AssetServer::sendStatsPacket() {
     QJsonObject serverStats;
 
-    auto stats = DependencyManager::get<NodeList>()->sampleStatsForAllConnections();
+    auto nodeList = DependencyManager::get<NodeList>();
+    nodeList->eachNode([&](auto& node) {
+        auto& stats = node->getConnectionStats();
 
-    for (const auto& stat : stats) {
         QJsonObject nodeStats;
-        auto endTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(stat.second.endTime);
+        auto endTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(stats.endTime);
         QDateTime date = QDateTime::fromMSecsSinceEpoch(endTimeMs.count());
 
         static const float USEC_PER_SEC = 1000000.0f;
         static const float MEGABITS_PER_BYTE = 8.0f / 1000000.0f; // Bytes => Mbits
-        float elapsed = (float)(stat.second.endTime - stat.second.startTime).count() / USEC_PER_SEC; // sec
+        float elapsed = (float)(stats.endTime - stats.startTime).count() / USEC_PER_SEC; // sec
         float megabitsPerSecPerByte = MEGABITS_PER_BYTE / elapsed; // Bytes => Mb/s
 
         QJsonObject connectionStats;
         connectionStats["1. Last Heard"] = date.toString();
-        connectionStats["2. Est. Max (P/s)"] = stat.second.estimatedBandwith;
-        connectionStats["3. RTT (ms)"] = stat.second.rtt;
-        connectionStats["4. CW (P)"] = stat.second.congestionWindowSize;
-        connectionStats["5. Period (us)"] = stat.second.packetSendPeriod;
-        connectionStats["6. Up (Mb/s)"] = stat.second.sentBytes * megabitsPerSecPerByte;
-        connectionStats["7. Down (Mb/s)"] = stat.second.receivedBytes * megabitsPerSecPerByte;
+        connectionStats["2. Est. Max (P/s)"] = stats.estimatedBandwith;
+        connectionStats["3. RTT (ms)"] = stats.rtt;
+        connectionStats["4. CW (P)"] = stats.congestionWindowSize;
+        connectionStats["5. Period (us)"] = stats.packetSendPeriod;
+        connectionStats["6. Up (Mb/s)"] = stats.sentBytes * megabitsPerSecPerByte;
+        connectionStats["7. Down (Mb/s)"] = stats.receivedBytes * megabitsPerSecPerByte;
         nodeStats["Connection Stats"] = connectionStats;
 
         using Events = udt::ConnectionStats::Stats::Event;
-        const auto& events = stat.second.events;
+        const auto& events = stats.events;
 
         QJsonObject upstreamStats;
-        upstreamStats["1. Sent (P/s)"] = stat.second.sendRate;
-        upstreamStats["2. Sent Packets"] = stat.second.sentPackets;
+        upstreamStats["1. Sent (P/s)"] = stats.sendRate;
+        upstreamStats["2. Sent Packets"] = (int)stats.sentPackets;
         upstreamStats["3. Recvd ACK"] = events[Events::ReceivedACK];
         upstreamStats["4. Procd ACK"] = events[Events::ProcessedACK];
-        upstreamStats["5. Retransmitted"] = events[Events::Retransmission];
+        upstreamStats["5. Retransmitted"] = (int)stats.retransmittedPackets;
         nodeStats["Upstream Stats"] = upstreamStats;
 
         QJsonObject downstreamStats;
-        downstreamStats["1. Recvd (P/s)"] = stat.second.receiveRate;
-        downstreamStats["2. Recvd Packets"] = stat.second.receivedPackets;
+        downstreamStats["1. Recvd (P/s)"] = stats.receiveRate;
+        downstreamStats["2. Recvd Packets"] = (int)stats.receivedPackets;
         downstreamStats["3. Sent ACK"] = events[Events::SentACK];
-        downstreamStats["4. Duplicates"] = events[Events::Duplicate];
+        downstreamStats["4. Duplicates"] = (int)stats.duplicatePackets;
         nodeStats["Downstream Stats"] = downstreamStats;
 
-        QString uuid;
-        auto nodelist = DependencyManager::get<NodeList>();
-        if (stat.first == nodelist->getDomainHandler().getSockAddr()) {
-            uuid = uuidStringWithoutCurlyBraces(nodelist->getDomainHandler().getUUID());
-            nodeStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = "DomainServer";
-        } else {
-            auto node = nodelist->findNodeWithAddr(stat.first);
-            uuid = uuidStringWithoutCurlyBraces(node ? node->getUUID() : QUuid());
-            nodeStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuid;
-        }
+        QString uuid = uuidStringWithoutCurlyBraces(node->getUUID());
+        nodeStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuid;
 
         serverStats[uuid] = nodeStats;
-    }
+    });
 
     // send off the stats packets
     ThreadedAssignment::addPacketStatsAndSendStatsPacket(serverStats);
diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp
index 77f416f31e..004e4ad2ea 100644
--- a/assignment-client/src/audio/AudioMixer.cpp
+++ b/assignment-client/src/audio/AudioMixer.cpp
@@ -338,7 +338,7 @@ void AudioMixer::sendStatsPacket() {
             QJsonObject nodeStats;
             QString uuidString = uuidStringWithoutCurlyBraces(node->getUUID());
 
-            nodeStats["outbound_kbps"] = node->getOutboundBandwidth();
+            nodeStats["outbound_kbps"] = node->getOutboundKbps();
             nodeStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuidString;
 
             nodeStats["jitter"] = clientData->getAudioStreamStats();
diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp
index 53fc13e5cf..5b72616e5f 100644
--- a/assignment-client/src/avatars/AvatarMixer.cpp
+++ b/assignment-client/src/avatars/AvatarMixer.cpp
@@ -839,8 +839,8 @@ void AvatarMixer::sendStatsPacket() {
         // add the key to ask the domain-server for a username replacement, if it has it
         avatarStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuidStringWithoutCurlyBraces(node->getUUID());
 
-        avatarStats[NODE_OUTBOUND_KBPS_STAT_KEY] = node->getOutboundBandwidth();
-        avatarStats[NODE_INBOUND_KBPS_STAT_KEY] = node->getInboundBandwidth();
+        avatarStats[NODE_OUTBOUND_KBPS_STAT_KEY] = node->getOutboundKbps();
+        avatarStats[NODE_INBOUND_KBPS_STAT_KEY] = node->getInboundKbps();
 
         AvatarMixerClientData* clientData = static_cast<AvatarMixerClientData*>(node->getLinkedData());
         if (clientData) {
diff --git a/assignment-client/src/messages/MessagesMixer.cpp b/assignment-client/src/messages/MessagesMixer.cpp
index c11c8f40a0..d2127835f9 100644
--- a/assignment-client/src/messages/MessagesMixer.cpp
+++ b/assignment-client/src/messages/MessagesMixer.cpp
@@ -75,8 +75,8 @@ void MessagesMixer::sendStatsPacket() {
     DependencyManager::get<NodeList>()->eachNode([&](const SharedNodePointer& node) {
         QJsonObject clientStats;
         clientStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuidStringWithoutCurlyBraces(node->getUUID());
-        clientStats["outbound_kbps"] = node->getOutboundBandwidth();
-        clientStats["inbound_kbps"] = node->getInboundBandwidth();
+        clientStats["outbound_kbps"] = node->getOutboundKbps();
+        clientStats["inbound_kbps"] = node->getInboundKbps();
         messagesMixerObject[uuidStringWithoutCurlyBraces(node->getUUID())] = clientStats;
     });
 
diff --git a/interface/resources/qml/+android/Stats.qml b/interface/resources/qml/+android/Stats.qml
index e9a2aa47eb..fe56f3797b 100644
--- a/interface/resources/qml/+android/Stats.qml
+++ b/interface/resources/qml/+android/Stats.qml
@@ -192,13 +192,13 @@ Item {
                     }
                     StatText {
                         visible: root.expanded;
-                        text: "Audio In Audio: " + root.audioAudioInboundPPS + " pps, " +
-                            "Silent: " + root.audioSilentInboundPPS + " pps";
+                        text: "Audio Mixer Out: " + root.audioMixerOutKbps + " kbps, " +
+                        root.audioMixerOutPps + "pps";
                     }
                     StatText {
                         visible: root.expanded;
-                        text: "Audio Mixer Out: " + root.audioMixerOutKbps + " kbps, " +
-                            root.audioMixerOutPps + "pps";
+                        text: "Audio In Audio: " + root.audioAudioInboundPPS + " pps, " +
+                            "Silent: " + root.audioSilentInboundPPS + " pps";
                     }
                     StatText {
                         visible: root.expanded;
diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml
index 1a29ce87df..a65170ee3b 100644
--- a/interface/resources/qml/Stats.qml
+++ b/interface/resources/qml/Stats.qml
@@ -210,13 +210,13 @@ Item {
                     }
                     StatText {
                         visible: root.expanded;
-                        text: "Audio In Audio: " + root.audioAudioInboundPPS + " pps, " +
-                            "Silent: " + root.audioSilentInboundPPS + " pps";
+                        text: "Audio Mixer Out: " + root.audioMixerOutKbps + " kbps, " +
+                        root.audioMixerOutPps + "pps";
                     }
                     StatText {
                         visible: root.expanded;
-                        text: "Audio Mixer Out: " + root.audioMixerOutKbps + " kbps, " +
-                            root.audioMixerOutPps + "pps";
+                        text: "Audio In Audio: " + root.audioAudioInboundPPS + " pps, " +
+                            "Silent: " + root.audioSilentInboundPPS + " pps";
                     }
                     StatText {
                         visible: root.expanded;
diff --git a/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml b/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml
index b7d01a62e0..a2104826c3 100644
--- a/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml
+++ b/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml
@@ -869,7 +869,7 @@ Flickable {
                     id: outOfRangeDataStrategyComboBox
 
                     height: 25
-                    width: 100
+                    width: 150
 
                     editable: true
                     colorScheme: hifi.colorSchemes.dark
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index f04212b604..bff39d76ee 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -862,7 +862,6 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) {
     DependencyManager::set<LODManager>();
     DependencyManager::set<StandAloneJSConsole>();
     DependencyManager::set<DialogsManager>();
-    DependencyManager::set<BandwidthRecorder>();
     DependencyManager::set<ResourceCacheSharedItems>();
     DependencyManager::set<DesktopScriptingInterface>();
     DependencyManager::set<EntityScriptingInterface>(true);
@@ -1579,13 +1578,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
 
     connect(this, SIGNAL(aboutToQuit()), this, SLOT(onAboutToQuit()));
 
-    // hook up bandwidth estimator
-    QSharedPointer<BandwidthRecorder> bandwidthRecorder = DependencyManager::get<BandwidthRecorder>();
-    connect(nodeList.data(), &LimitedNodeList::dataSent,
-        bandwidthRecorder.data(), &BandwidthRecorder::updateOutboundData);
-    connect(nodeList.data(), &LimitedNodeList::dataReceived,
-        bandwidthRecorder.data(), &BandwidthRecorder::updateInboundData);
-
     // FIXME -- I'm a little concerned about this.
     connect(myAvatar->getSkeletonModel().get(), &SkeletonModel::skeletonLoaded,
         this, &Application::checkSkeleton, Qt::QueuedConnection);
@@ -2051,15 +2043,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
         properties["deadlock_watchdog_maxElapsed"] = (int)DeadlockWatchdogThread::_maxElapsed;
         properties["deadlock_watchdog_maxElapsedAverage"] = (int)DeadlockWatchdogThread::_maxElapsedAverage;
 
-        auto bandwidthRecorder = DependencyManager::get<BandwidthRecorder>();
-        properties["packet_rate_in"] = bandwidthRecorder->getCachedTotalAverageInputPacketsPerSecond();
-        properties["packet_rate_out"] = bandwidthRecorder->getCachedTotalAverageOutputPacketsPerSecond();
-        properties["kbps_in"] = bandwidthRecorder->getCachedTotalAverageInputKilobitsPerSecond();
-        properties["kbps_out"] = bandwidthRecorder->getCachedTotalAverageOutputKilobitsPerSecond();
-
-        properties["atp_in_kbps"] = bandwidthRecorder->getAverageInputKilobitsPerSecond(NodeType::AssetServer);
-
         auto nodeList = DependencyManager::get<NodeList>();
+        properties["packet_rate_in"] = nodeList->getInboundPPS();
+        properties["packet_rate_out"] = nodeList->getOutboundPPS();
+        properties["kbps_in"] = nodeList->getInboundKbps();
+        properties["kbps_out"] = nodeList->getOutboundKbps();
+
         SharedNodePointer entityServerNode = nodeList->soloNodeOfType(NodeType::EntityServer);
         SharedNodePointer audioMixerNode = nodeList->soloNodeOfType(NodeType::AudioMixer);
         SharedNodePointer avatarMixerNode = nodeList->soloNodeOfType(NodeType::AvatarMixer);
@@ -2070,6 +2059,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
         properties["avatar_ping"] = avatarMixerNode ? avatarMixerNode->getPingMs() : -1;
         properties["asset_ping"] = assetServerNode ? assetServerNode->getPingMs() : -1;
         properties["messages_ping"] = messagesMixerNode ? messagesMixerNode->getPingMs() : -1;
+        properties["atp_in_kbps"] = messagesMixerNode ? assetServerNode->getInboundKbps() : 0.0f;
 
         auto loadingRequests = ResourceCache::getLoadingRequests();
 
diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp
index 495e29f986..cb204c9772 100644
--- a/interface/src/ui/Stats.cpp
+++ b/interface/src/ui/Stats.cpp
@@ -30,7 +30,6 @@
 
 #include <gl/Context.h>
 
-#include "BandwidthRecorder.h"
 #include "Menu.h"
 #include "Util.h"
 #include "SequenceNumberStats.h"
@@ -166,20 +165,25 @@ void Stats::updateStats(bool force) {
         STAT_UPDATE(collisionPicksUpdated, updatedPicks[PickQuery::Collision]);
     }
 
-    auto bandwidthRecorder = DependencyManager::get<BandwidthRecorder>();
-    STAT_UPDATE(packetInCount, (int)bandwidthRecorder->getCachedTotalAverageInputPacketsPerSecond());
-    STAT_UPDATE(packetOutCount, (int)bandwidthRecorder->getCachedTotalAverageOutputPacketsPerSecond());
-    STAT_UPDATE_FLOAT(mbpsIn, (float)bandwidthRecorder->getCachedTotalAverageInputKilobitsPerSecond() / 1000.0f, 0.01f);
-    STAT_UPDATE_FLOAT(mbpsOut, (float)bandwidthRecorder->getCachedTotalAverageOutputKilobitsPerSecond() / 1000.0f, 0.01f);
+    STAT_UPDATE(packetInCount, nodeList->getInboundPPS());
+    STAT_UPDATE(packetOutCount, nodeList->getOutboundPPS());
+    STAT_UPDATE_FLOAT(mbpsIn, nodeList->getInboundKbps() / 1000.0f, 0.01f);
+    STAT_UPDATE_FLOAT(mbpsOut, nodeList->getOutboundKbps() / 1000.0f, 0.01f);
 
-    STAT_UPDATE_FLOAT(assetMbpsIn, (float)bandwidthRecorder->getAverageInputKilobitsPerSecond(NodeType::AssetServer) / 1000.0f, 0.01f);
-    STAT_UPDATE_FLOAT(assetMbpsOut, (float)bandwidthRecorder->getAverageOutputKilobitsPerSecond(NodeType::AssetServer) / 1000.0f, 0.01f);
-
-    // Second column: ping
     SharedNodePointer audioMixerNode = nodeList->soloNodeOfType(NodeType::AudioMixer);
     SharedNodePointer avatarMixerNode = nodeList->soloNodeOfType(NodeType::AvatarMixer);
     SharedNodePointer assetServerNode = nodeList->soloNodeOfType(NodeType::AssetServer);
     SharedNodePointer messageMixerNode = nodeList->soloNodeOfType(NodeType::MessagesMixer);
+
+    if (assetServerNode) {
+        STAT_UPDATE_FLOAT(assetMbpsIn, assetServerNode->getInboundKbps() / 1000.0f, 0.01f);
+        STAT_UPDATE_FLOAT(assetMbpsOut, assetServerNode->getOutboundKbps() / 1000.0f, 0.01f);
+    } else {
+        STAT_UPDATE_FLOAT(assetMbpsIn, 0.0f, 0.01f);
+        STAT_UPDATE_FLOAT(assetMbpsOut, 0.0f, 0.01f);
+    }
+
+    // Second column: ping
     STAT_UPDATE(audioPing, audioMixerNode ? audioMixerNode->getPingMs() : -1); 
     const int mixerLossRate = (int)roundf(_audioStats->data()->getMixerStream()->lossRateWindow() * 100.0f);
     const int clientLossRate = (int)roundf(_audioStats->data()->getClientStream()->lossRateWindow() * 100.0f);
@@ -198,7 +202,7 @@ void Stats::updateStats(bool force) {
         // TODO: this should also support entities
         if (node->getType() == NodeType::EntityServer) {
             totalPingOctree += node->getPingMs();
-            totalEntityKbps += node->getInboundBandwidth();
+            totalEntityKbps += node->getInboundKbps();
             octreeServerCount++;
             if (pingOctreeMax < node->getPingMs()) {
                 pingOctreeMax = node->getPingMs();
@@ -218,10 +222,10 @@ void Stats::updateStats(bool force) {
     if (_expanded || force) {
         SharedNodePointer avatarMixer = nodeList->soloNodeOfType(NodeType::AvatarMixer);
         if (avatarMixer) {
-            STAT_UPDATE(avatarMixerInKbps, (int)roundf(bandwidthRecorder->getAverageInputKilobitsPerSecond(NodeType::AvatarMixer)));
-            STAT_UPDATE(avatarMixerInPps, (int)roundf(bandwidthRecorder->getAverageInputPacketsPerSecond(NodeType::AvatarMixer)));
-            STAT_UPDATE(avatarMixerOutKbps, (int)roundf(bandwidthRecorder->getAverageOutputKilobitsPerSecond(NodeType::AvatarMixer)));
-            STAT_UPDATE(avatarMixerOutPps, (int)roundf(bandwidthRecorder->getAverageOutputPacketsPerSecond(NodeType::AvatarMixer)));
+            STAT_UPDATE(avatarMixerInKbps, (int)roundf(avatarMixer->getInboundKbps()));
+            STAT_UPDATE(avatarMixerInPps, avatarMixer->getInboundPPS());
+            STAT_UPDATE(avatarMixerOutKbps, (int)roundf(avatarMixer->getOutboundKbps()));
+            STAT_UPDATE(avatarMixerOutPps, avatarMixer->getOutboundPPS());
         } else {
             STAT_UPDATE(avatarMixerInKbps, -1);
             STAT_UPDATE(avatarMixerInPps, -1);
@@ -233,17 +237,15 @@ void Stats::updateStats(bool force) {
         SharedNodePointer audioMixerNode = nodeList->soloNodeOfType(NodeType::AudioMixer);
         auto audioClient = DependencyManager::get<AudioClient>().data();
         if (audioMixerNode || force) {
-            STAT_UPDATE(audioMixerKbps, (int)roundf(
-                bandwidthRecorder->getAverageInputKilobitsPerSecond(NodeType::AudioMixer) +
-                bandwidthRecorder->getAverageOutputKilobitsPerSecond(NodeType::AudioMixer)));
-            STAT_UPDATE(audioMixerPps, (int)roundf(
-                bandwidthRecorder->getAverageInputPacketsPerSecond(NodeType::AudioMixer) +
-                bandwidthRecorder->getAverageOutputPacketsPerSecond(NodeType::AudioMixer)));
+            STAT_UPDATE(audioMixerKbps, (int)roundf(audioMixerNode->getInboundKbps() +
+                                                    audioMixerNode->getOutboundKbps()));
+            STAT_UPDATE(audioMixerPps, audioMixerNode->getInboundPPS() +
+                                       audioMixerNode->getOutboundPPS());
 
-            STAT_UPDATE(audioMixerInKbps, (int)roundf(bandwidthRecorder->getAverageInputKilobitsPerSecond(NodeType::AudioMixer)));
-            STAT_UPDATE(audioMixerInPps, (int)roundf(bandwidthRecorder->getAverageInputPacketsPerSecond(NodeType::AudioMixer)));
-            STAT_UPDATE(audioMixerOutKbps, (int)roundf(bandwidthRecorder->getAverageOutputKilobitsPerSecond(NodeType::AudioMixer)));
-            STAT_UPDATE(audioMixerOutPps, (int)roundf(bandwidthRecorder->getAverageOutputPacketsPerSecond(NodeType::AudioMixer)));
+            STAT_UPDATE(audioMixerInKbps, (int)roundf(audioMixerNode->getInboundKbps()));
+            STAT_UPDATE(audioMixerInPps, audioMixerNode->getInboundPPS());
+            STAT_UPDATE(audioMixerOutKbps, (int)roundf(audioMixerNode->getOutboundKbps()));
+            STAT_UPDATE(audioMixerOutPps, audioMixerNode->getOutboundPPS());
             STAT_UPDATE(audioAudioInboundPPS, (int)audioClient->getAudioInboundPPS());
             STAT_UPDATE(audioSilentInboundPPS, (int)audioClient->getSilentInboundPPS());
             STAT_UPDATE(audioOutboundPPS, (int)audioClient->getAudioOutboundPPS());
diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp
index 6a472cab1e..9c5424950a 100644
--- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp
+++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp
@@ -37,7 +37,7 @@ void LineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointe
     if (_lineVerticesID == GeometryCache::UNKNOWN_ID) {
         _lineVerticesID = geometryCache->allocateID();
     }
-    glm::vec4 lineColor(toGlm(entity->getColor()), entity->getLocalRenderAlpha());
+    glm::vec4 lineColor(toGlm(entity->getColor()), 1.0f);
     geometryCache->updateVertices(_lineVerticesID, _linePoints, lineColor);
 }
 
diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp
index 8d46af0013..bfa238d695 100644
--- a/libraries/entities/src/EntityItem.cpp
+++ b/libraries/entities/src/EntityItem.cpp
@@ -73,33 +73,60 @@ EntityItem::~EntityItem() {
 EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& params) const {
     EntityPropertyFlags requestedProperties;
 
+    // Core
     requestedProperties += PROP_SIMULATION_OWNER;
+    requestedProperties += PROP_VISIBLE;
+    requestedProperties += PROP_NAME;
+    requestedProperties += PROP_LOCKED;
+    requestedProperties += PROP_USER_DATA;
+    requestedProperties += PROP_HREF;
+    requestedProperties += PROP_DESCRIPTION;
     requestedProperties += PROP_POSITION;
+    requestedProperties += PROP_DIMENSIONS;
     requestedProperties += PROP_ROTATION;
+    requestedProperties += PROP_REGISTRATION_POINT;
+    // TODO: handle PROP_CREATED?
+    requestedProperties += PROP_LAST_EDITED_BY;
+    requestedProperties += PROP_ENTITY_HOST_TYPE;
+    requestedProperties += PROP_OWNING_AVATAR_ID;
+    requestedProperties += PROP_PARENT_ID;
+    requestedProperties += PROP_PARENT_JOINT_INDEX;
+    requestedProperties += PROP_QUERY_AA_CUBE;
+    requestedProperties += PROP_CAN_CAST_SHADOW;
+    // requestedProperties += PROP_VISIBLE_IN_SECONDARY_CAMERA; // not sent over wire
+    withReadLock([&] {
+        requestedProperties += _grabProperties.getEntityProperties(params);
+    });
+
+    // Physics
+    requestedProperties += PROP_DENSITY;
     requestedProperties += PROP_VELOCITY;
     requestedProperties += PROP_ANGULAR_VELOCITY;
-    requestedProperties += PROP_ACCELERATION;
-
-    requestedProperties += PROP_DIMENSIONS;
-    requestedProperties += PROP_DENSITY;
     requestedProperties += PROP_GRAVITY;
+    requestedProperties += PROP_ACCELERATION;
     requestedProperties += PROP_DAMPING;
+    requestedProperties += PROP_ANGULAR_DAMPING;
     requestedProperties += PROP_RESTITUTION;
     requestedProperties += PROP_FRICTION;
     requestedProperties += PROP_LIFETIME;
-    requestedProperties += PROP_SCRIPT;
-    requestedProperties += PROP_SCRIPT_TIMESTAMP;
-    requestedProperties += PROP_SERVER_SCRIPTS;
-    requestedProperties += PROP_COLLISION_SOUND_URL;
-    requestedProperties += PROP_REGISTRATION_POINT;
-    requestedProperties += PROP_ANGULAR_DAMPING;
-    requestedProperties += PROP_VISIBLE;
-    requestedProperties += PROP_CAN_CAST_SHADOW;
     requestedProperties += PROP_COLLISIONLESS;
     requestedProperties += PROP_COLLISION_MASK;
     requestedProperties += PROP_DYNAMIC;
-    requestedProperties += PROP_LOCKED;
-    requestedProperties += PROP_USER_DATA;
+    requestedProperties += PROP_COLLISION_SOUND_URL;
+    requestedProperties += PROP_ACTION_DATA;
+
+    // Cloning
+    requestedProperties += PROP_CLONEABLE;
+    requestedProperties += PROP_CLONE_LIFETIME;
+    requestedProperties += PROP_CLONE_LIMIT;
+    requestedProperties += PROP_CLONE_DYNAMIC;
+    requestedProperties += PROP_CLONE_AVATAR_ENTITY;
+    requestedProperties += PROP_CLONE_ORIGIN_ID;
+
+    // Scripts
+    requestedProperties += PROP_SCRIPT;
+    requestedProperties += PROP_SCRIPT_TIMESTAMP;
+    requestedProperties += PROP_SERVER_SCRIPTS;
 
     // Certifiable properties
     requestedProperties += PROP_ITEM_NAME;
@@ -114,30 +141,6 @@ EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& param
     requestedProperties += PROP_CERTIFICATE_ID;
     requestedProperties += PROP_STATIC_CERTIFICATE_VERSION;
 
-    requestedProperties += PROP_NAME;
-    requestedProperties += PROP_HREF;
-    requestedProperties += PROP_DESCRIPTION;
-    requestedProperties += PROP_ACTION_DATA;
-    requestedProperties += PROP_PARENT_ID;
-    requestedProperties += PROP_PARENT_JOINT_INDEX;
-    requestedProperties += PROP_QUERY_AA_CUBE;
-
-    requestedProperties += PROP_ENTITY_HOST_TYPE;
-    requestedProperties += PROP_OWNING_AVATAR_ID;
-
-    requestedProperties += PROP_LAST_EDITED_BY;
-
-    requestedProperties += PROP_CLONEABLE;
-    requestedProperties += PROP_CLONE_LIFETIME;
-    requestedProperties += PROP_CLONE_LIMIT;
-    requestedProperties += PROP_CLONE_DYNAMIC;
-    requestedProperties += PROP_CLONE_AVATAR_ENTITY;
-    requestedProperties += PROP_CLONE_ORIGIN_ID;
-
-    withReadLock([&] {
-        requestedProperties += _grabProperties.getEntityProperties(params);
-    });
-
     return requestedProperties;
 }
 
@@ -243,36 +246,72 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet
 
         propertyFlags -= PROP_LAST_ITEM; // clear the last item for now, we may or may not set it as the actual item
 
+        // NOTE: When we enable partial packing of entity properties, we'll want to pack simulationOwner, transform, and velocity properties near each other
+        // since they will commonly be transmitted together.  simulationOwner must always go first, to avoid race conditions of simulation ownership bids
         // These items would go here once supported....
         //      PROP_PAGED_PROPERTY,
         //      PROP_CUSTOM_PROPERTIES_INCLUDED,
 
         APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, _simulationOwner.toByteArray());
+        APPEND_ENTITY_PROPERTY(PROP_VISIBLE, getVisible());
+        APPEND_ENTITY_PROPERTY(PROP_NAME, getName());
+        APPEND_ENTITY_PROPERTY(PROP_LOCKED, getLocked());
+        APPEND_ENTITY_PROPERTY(PROP_USER_DATA, getUserData());
+        APPEND_ENTITY_PROPERTY(PROP_HREF, getHref());
+        APPEND_ENTITY_PROPERTY(PROP_DESCRIPTION, getDescription());
         APPEND_ENTITY_PROPERTY(PROP_POSITION, getLocalPosition());
+        APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, getUnscaledDimensions());
         APPEND_ENTITY_PROPERTY(PROP_ROTATION, getLocalOrientation());
+        APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getRegistrationPoint());
+        // TODO: handle created?
+        APPEND_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, getLastEditedBy());
+        // APPEND_ENTITY_PROPERTY(PROP_ENTITY_HOST_TYPE, getEntityHostType());  // not sent over wire
+        // APPEND_ENTITY_PROPERTY(PROP_OWNING_AVATAR_ID, getOwningAvatarID());  // not sent over wire
+        // convert AVATAR_SELF_ID to actual sessionUUID.
+        QUuid actualParentID = getParentID();
+        if (actualParentID == AVATAR_SELF_ID) {
+            auto nodeList = DependencyManager::get<NodeList>();
+            actualParentID = nodeList->getSessionUUID();
+        }
+        APPEND_ENTITY_PROPERTY(PROP_PARENT_ID, actualParentID);
+        APPEND_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, getParentJointIndex());
+        APPEND_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, getQueryAACube());
+        APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, getCanCastShadow());
+        // APPEND_ENTITY_PROPERTY(PROP_VISIBLE_IN_SECONDARY_CAMERA, getIsVisibleInSecondaryCamera()); // not sent over wire
+        withReadLock([&] {
+            _grabProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties,
+                propertyFlags, propertiesDidntFit, propertyCount, appendState);
+        });
+
+        // Physics
+        APPEND_ENTITY_PROPERTY(PROP_DENSITY, getDensity());
         APPEND_ENTITY_PROPERTY(PROP_VELOCITY, getLocalVelocity());
         APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, getLocalAngularVelocity());
-        APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getAcceleration());
-
-        APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, getUnscaledDimensions());
-        APPEND_ENTITY_PROPERTY(PROP_DENSITY, getDensity());
         APPEND_ENTITY_PROPERTY(PROP_GRAVITY, getGravity());
+        APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getAcceleration());
         APPEND_ENTITY_PROPERTY(PROP_DAMPING, getDamping());
+        APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, getAngularDamping());
         APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, getRestitution());
         APPEND_ENTITY_PROPERTY(PROP_FRICTION, getFriction());
         APPEND_ENTITY_PROPERTY(PROP_LIFETIME, getLifetime());
-        APPEND_ENTITY_PROPERTY(PROP_SCRIPT, getScript());
-        APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, getScriptTimestamp());
-        APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, getServerScripts());
-        APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getRegistrationPoint());
-        APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, getAngularDamping());
-        APPEND_ENTITY_PROPERTY(PROP_VISIBLE, getVisible());
-        APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, getCanCastShadow());
         APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, getCollisionless());
         APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, getCollisionMask());
         APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, getDynamic());
-        APPEND_ENTITY_PROPERTY(PROP_LOCKED, getLocked());
-        APPEND_ENTITY_PROPERTY(PROP_USER_DATA, getUserData());
+        APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, getCollisionSoundURL());
+        APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, getDynamicData());
+
+        // Cloning
+        APPEND_ENTITY_PROPERTY(PROP_CLONEABLE, getCloneable());
+        APPEND_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, getCloneLifetime());
+        APPEND_ENTITY_PROPERTY(PROP_CLONE_LIMIT, getCloneLimit());
+        APPEND_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, getCloneDynamic());
+        APPEND_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, getCloneAvatarEntity());
+        APPEND_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, getCloneOriginID());
+
+        // Scripts
+        APPEND_ENTITY_PROPERTY(PROP_SCRIPT, getScript());
+        APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, getScriptTimestamp());
+        APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, getServerScripts());
 
         // Certifiable Properties
         APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, getMarketplaceID());
@@ -287,36 +326,6 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet
         APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, getCertificateID());
         APPEND_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, getStaticCertificateVersion());
 
-        APPEND_ENTITY_PROPERTY(PROP_NAME, getName());
-        APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, getCollisionSoundURL());
-        APPEND_ENTITY_PROPERTY(PROP_HREF, getHref());
-        APPEND_ENTITY_PROPERTY(PROP_DESCRIPTION, getDescription());
-        APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, getDynamicData());
-
-        // convert AVATAR_SELF_ID to actual sessionUUID.
-        QUuid actualParentID = getParentID();
-        if (actualParentID == AVATAR_SELF_ID) {
-            auto nodeList = DependencyManager::get<NodeList>();
-            actualParentID = nodeList->getSessionUUID();
-        }
-        APPEND_ENTITY_PROPERTY(PROP_PARENT_ID, actualParentID);
-
-        APPEND_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, getParentJointIndex());
-        APPEND_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, getQueryAACube());
-        APPEND_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, getLastEditedBy());
-
-        APPEND_ENTITY_PROPERTY(PROP_CLONEABLE, getCloneable());
-        APPEND_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, getCloneLifetime());
-        APPEND_ENTITY_PROPERTY(PROP_CLONE_LIMIT, getCloneLimit());
-        APPEND_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, getCloneDynamic());
-        APPEND_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, getCloneAvatarEntity());
-        APPEND_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, getCloneOriginID());
-
-        withReadLock([&] {
-            _grabProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties,
-                                               propertyFlags, propertiesDidntFit, propertyCount, appendState);
-        });
-
         appendSubclassData(packetData, params, entityTreeElementExtraEncodeData,
                                 requestedProperties,
                                 propertyFlags,
@@ -676,7 +685,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
     const QUuid& myNodeID = nodeList->getSessionUUID();
     bool weOwnSimulation = _simulationOwner.matchesValidID(myNodeID);
 
-    // pack SimulationOwner, transform, and velocity properties near each other
     // NOTE: the server is authoritative for changes to simOwnerID so we always unpack ownership data
     // even when we would otherwise ignore the rest of the packet.
 
@@ -769,6 +777,14 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
         return otherOverwrites && simulationChanged && (valueChanged || filterRejection);
     };
 
+    // Core
+    // PROP_SIMULATION_OWNER handled above
+    READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, setVisible);
+    READ_ENTITY_PROPERTY(PROP_NAME, QString, setName);
+    READ_ENTITY_PROPERTY(PROP_LOCKED, bool, setLocked);
+    READ_ENTITY_PROPERTY(PROP_USER_DATA, QString, setUserData);
+    READ_ENTITY_PROPERTY(PROP_HREF, QString, setHref);
+    READ_ENTITY_PROPERTY(PROP_DESCRIPTION, QString, setDescription);
     {   // When we own the simulation we don't accept updates to the entity's transform/velocities
         // we also want to ignore any duplicate packets that have the same "recently updated" values
         // as a packet we've already recieved. This is because we want multiple edits of the same
@@ -781,30 +797,68 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
 
         // Note: duplicate packets are expected and not wrong. They may be sent for any number of
         // reasons and the contract is that the client handles them in an idempotent manner.
-        auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){
+        auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value) {
             if (shouldUpdate(_lastUpdatedPositionTimestamp, value != _lastUpdatedPositionValue)) {
                 setPosition(value);
                 _lastUpdatedPositionTimestamp = lastEdited;
                 _lastUpdatedPositionValue = value;
             }
         };
-
-        auto customUpdateRotationFromNetwork = [this, shouldUpdate, lastEdited](glm::quat value){
+        READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, customUpdatePositionFromNetwork);
+    }
+    READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, setUnscaledDimensions);
+    {   // See comment above
+        auto customUpdateRotationFromNetwork = [this, shouldUpdate, lastEdited](glm::quat value) {
             if (shouldUpdate(_lastUpdatedRotationTimestamp, value != _lastUpdatedRotationValue)) {
                 setRotation(value);
                 _lastUpdatedRotationTimestamp = lastEdited;
                 _lastUpdatedRotationValue = value;
             }
         };
+        READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, customUpdateRotationFromNetwork);
+    }
+    READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint);
+    // READ_ENTITY_PROPERTY(PROP_CREATED, quint64, setCreated);                          // not sent over wire
+    READ_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, QUuid, setLastEditedBy);
+    // READ_ENTITY_PROPERTY(PROP_ENTITY_HOST_TYPE, entity::HostType, setEntityHostType); // not sent over wire
+    // READ_ENTITY_PROPERTY(PROP_OWNING_AVATAR_ID, QUuuid, setOwningAvatarID);           // not sent over wire
+    {   // parentID and parentJointIndex are protected by simulation ownership
+        bool oldOverwrite = overwriteLocalData;
+        overwriteLocalData = overwriteLocalData && !weOwnSimulation;
+        READ_ENTITY_PROPERTY(PROP_PARENT_ID, QUuid, setParentID);
+        READ_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, quint16, setParentJointIndex);
+        overwriteLocalData = oldOverwrite;
+    }
+    {   // See comment above
+        auto customUpdateQueryAACubeFromNetwork = [this, shouldUpdate, lastEdited](AACube value) {
+            if (shouldUpdate(_lastUpdatedQueryAACubeTimestamp, value != _lastUpdatedQueryAACubeValue)) {
+                setQueryAACube(value);
+                _lastUpdatedQueryAACubeTimestamp = lastEdited;
+                _lastUpdatedQueryAACubeValue = value;
+            }
+        };
+        READ_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, AACube, customUpdateQueryAACubeFromNetwork);
+    }
+    READ_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow);
+    // READ_ENTITY_PROPERTY(PROP_VISIBLE_IN_SECONDARY_CAMERA, bool, setIsVisibleInSecondaryCamera);  // not sent over wire
+    withWriteLock([&] {
+        int bytesFromGrab = _grabProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args,
+            propertyFlags, overwriteLocalData,
+            somethingChanged);
+        bytesRead += bytesFromGrab;
+        dataAt += bytesFromGrab;
+    });
 
-        auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){
-             if (shouldUpdate(_lastUpdatedVelocityTimestamp, value != _lastUpdatedVelocityValue)) {
+    READ_ENTITY_PROPERTY(PROP_DENSITY, float, setDensity);
+    {
+        auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value) {
+            if (shouldUpdate(_lastUpdatedVelocityTimestamp, value != _lastUpdatedVelocityValue)) {
                 setVelocity(value);
                 _lastUpdatedVelocityTimestamp = lastEdited;
                 _lastUpdatedVelocityValue = value;
             }
         };
-
+        READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, customUpdateVelocityFromNetwork);
         auto customUpdateAngularVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){
             if (shouldUpdate(_lastUpdatedAngularVelocityTimestamp, value != _lastUpdatedAngularVelocityValue)) {
                 setAngularVelocity(value);
@@ -812,7 +866,8 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
                 _lastUpdatedAngularVelocityValue = value;
             }
         };
-
+        READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, customUpdateAngularVelocityFromNetwork);
+        READ_ENTITY_PROPERTY(PROP_GRAVITY, glm::vec3, setGravity);
         auto customSetAcceleration = [this, shouldUpdate, lastEdited](glm::vec3 value){
             if (shouldUpdate(_lastUpdatedAccelerationTimestamp, value != _lastUpdatedAccelerationValue)) {
                 setAcceleration(value);
@@ -820,48 +875,40 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
                 _lastUpdatedAccelerationValue = value;
             }
         };
-
-        READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, customUpdatePositionFromNetwork);
-        READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, customUpdateRotationFromNetwork);
-        READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, customUpdateVelocityFromNetwork);
-        READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, customUpdateAngularVelocityFromNetwork);
         READ_ENTITY_PROPERTY(PROP_ACCELERATION, glm::vec3, customSetAcceleration);
     }
-
-    READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, setUnscaledDimensions);
-    READ_ENTITY_PROPERTY(PROP_DENSITY, float, setDensity);
-    READ_ENTITY_PROPERTY(PROP_GRAVITY, glm::vec3, setGravity);
-
     READ_ENTITY_PROPERTY(PROP_DAMPING, float, setDamping);
+    READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, setAngularDamping);
     READ_ENTITY_PROPERTY(PROP_RESTITUTION, float, setRestitution);
     READ_ENTITY_PROPERTY(PROP_FRICTION, float, setFriction);
     READ_ENTITY_PROPERTY(PROP_LIFETIME, float, setLifetime);
-    READ_ENTITY_PROPERTY(PROP_SCRIPT, QString, setScript);
-    READ_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp);
-
-    {
-        // We use this scope to work around an issue stopping server script changes
-        // from being received by an entity script server running a script that continously updates an entity.
-
-        // Basically, we'll allow recent changes to the server scripts even if there are local changes to other properties
-        // that have been made more recently.
-
-        bool overwriteLocalData = !ignoreServerPacket || (lastEditedFromBufferAdjusted > _serverScriptsChangedTimestamp);
-
-        READ_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, QString, setServerScripts);
-    }
-
-    READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint);
-
-    READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, setAngularDamping);
-    READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, setVisible);
-    READ_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow);
     READ_ENTITY_PROPERTY(PROP_COLLISIONLESS, bool, setCollisionless);
     READ_ENTITY_PROPERTY(PROP_COLLISION_MASK, uint16_t, setCollisionMask);
     READ_ENTITY_PROPERTY(PROP_DYNAMIC, bool, setDynamic);
-    READ_ENTITY_PROPERTY(PROP_LOCKED, bool, setLocked);
-    READ_ENTITY_PROPERTY(PROP_USER_DATA, QString, setUserData);
+    READ_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL);
+    READ_ENTITY_PROPERTY(PROP_ACTION_DATA, QByteArray, setDynamicData);
 
+    // Cloning
+    READ_ENTITY_PROPERTY(PROP_CLONEABLE, bool, setCloneable);
+    READ_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, float, setCloneLifetime);
+    READ_ENTITY_PROPERTY(PROP_CLONE_LIMIT, float, setCloneLimit);
+    READ_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, bool, setCloneDynamic);
+    READ_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, bool, setCloneAvatarEntity);
+    READ_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, QUuid, setCloneOriginID);
+
+    // Scripts
+    READ_ENTITY_PROPERTY(PROP_SCRIPT, QString, setScript);
+    READ_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp);
+    {
+        // We use this scope to work around an issue stopping server script changes
+        // from being received by an entity script server running a script that continously updates an entity.
+        // Basically, we'll allow recent changes to the server scripts even if there are local changes to other properties
+        // that have been made more recently.
+        bool overwriteLocalData = !ignoreServerPacket || (lastEditedFromBufferAdjusted > _serverScriptsChangedTimestamp);
+        READ_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, QString, setServerScripts);
+    }
+
+    // Certifiable props
     READ_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, QString, setMarketplaceID);
     READ_ENTITY_PROPERTY(PROP_ITEM_NAME, QString, setItemName);
     READ_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, QString, setItemDescription);
@@ -874,49 +921,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
     READ_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, QString, setCertificateID);
     READ_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, quint32, setStaticCertificateVersion);
 
-    READ_ENTITY_PROPERTY(PROP_NAME, QString, setName);
-    READ_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL);
-    READ_ENTITY_PROPERTY(PROP_HREF, QString, setHref);
-    READ_ENTITY_PROPERTY(PROP_DESCRIPTION, QString, setDescription);
-    READ_ENTITY_PROPERTY(PROP_ACTION_DATA, QByteArray, setDynamicData);
-
-    {   // parentID and parentJointIndex are also protected by simulation ownership
-        bool oldOverwrite = overwriteLocalData;
-        overwriteLocalData = overwriteLocalData && !weOwnSimulation;
-        READ_ENTITY_PROPERTY(PROP_PARENT_ID, QUuid, setParentID);
-        READ_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, quint16, setParentJointIndex);
-        overwriteLocalData = oldOverwrite;
-    }
-
-
-    {
-        auto customUpdateQueryAACubeFromNetwork = [this, shouldUpdate, lastEdited](AACube value){
-            if (shouldUpdate(_lastUpdatedQueryAACubeTimestamp, value != _lastUpdatedQueryAACubeValue)) {
-                setQueryAACube(value);
-                _lastUpdatedQueryAACubeTimestamp = lastEdited;
-                _lastUpdatedQueryAACubeValue = value;
-            }
-        };
-        READ_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, AACube, customUpdateQueryAACubeFromNetwork);
-    }
-
-    READ_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, QUuid, setLastEditedBy);
-
-    READ_ENTITY_PROPERTY(PROP_CLONEABLE, bool, setCloneable);
-    READ_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, float, setCloneLifetime);
-    READ_ENTITY_PROPERTY(PROP_CLONE_LIMIT, float, setCloneLimit);
-    READ_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, bool, setCloneDynamic);
-    READ_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, bool, setCloneAvatarEntity);
-    READ_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, QUuid, setCloneOriginID);
-
-    withWriteLock([&] {
-        int bytesFromGrab = _grabProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args,
-                                                                             propertyFlags, overwriteLocalData,
-                                                                             somethingChanged);
-        bytesRead += bytesFromGrab;
-        dataAt += bytesFromGrab;
-    });
-
     bytesRead += readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args,
                                                   propertyFlags, overwriteLocalData, somethingChanged);
 
@@ -1285,34 +1289,60 @@ EntityItemProperties EntityItem::getProperties(const EntityPropertyFlags& desire
 
     properties._type = getType();
 
+    // Core
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(simulationOwner, getSimulationOwner);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(visible, getVisible);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(name, getName);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(locked, getLocked);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(userData, getUserData);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(href, getHref);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(description, getDescription);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(position, getLocalPosition);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(dimensions, getUnscaledDimensions);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(rotation, getLocalOrientation);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(registrationPoint, getRegistrationPoint);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(created, getCreated);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(lastEditedBy, getLastEditedBy);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(entityHostType, getEntityHostType);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(owningAvatarID, getOwningAvatarID);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(parentID, getParentID);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(parentJointIndex, getParentJointIndex);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(queryAACube, getQueryAACube);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(canCastShadow, getCanCastShadow);
+    // COPY_ENTITY_PROPERTY_TO_PROPERTIES(isVisibleInSecondaryCamera, getIsVisibleInSecondaryCamera); // not sent over wire
+    withReadLock([&] {
+        _grabProperties.getProperties(properties);
+    });
+
+    // Physics
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(density, getDensity);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(velocity, getLocalVelocity);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularVelocity, getLocalAngularVelocity);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(gravity, getGravity);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(acceleration, getAcceleration);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(damping, getDamping);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularDamping, getAngularDamping);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(restitution, getRestitution);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(friction, getFriction);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(created, getCreated);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifetime, getLifetime);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(script, getScript);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(scriptTimestamp, getScriptTimestamp);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(serverScripts, getServerScripts);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionSoundURL, getCollisionSoundURL);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(registrationPoint, getRegistrationPoint);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularVelocity, getLocalAngularVelocity);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularDamping, getAngularDamping);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(localRenderAlpha, getLocalRenderAlpha);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(visible, getVisible);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(canCastShadow, getCanCastShadow);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionless, getCollisionless);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionMask, getCollisionMask);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(dynamic, getDynamic);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(locked, getLocked);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(userData, getUserData);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionSoundURL, getCollisionSoundURL);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(actionData, getDynamicData);
+
+    // Cloning
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneable, getCloneable);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneLifetime, getCloneLifetime);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneLimit, getCloneLimit);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneDynamic, getCloneDynamic);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneAvatarEntity, getCloneAvatarEntity);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneOriginID, getCloneOriginID);
+
+    // Scripts
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(script, getScript);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(scriptTimestamp, getScriptTimestamp);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(serverScripts, getServerScripts);
 
     // Certifiable Properties
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(itemName, getItemName);
@@ -1327,31 +1357,13 @@ EntityItemProperties EntityItem::getProperties(const EntityPropertyFlags& desire
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(certificateID, getCertificateID);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(staticCertificateVersion, getStaticCertificateVersion);
 
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(name, getName);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(href, getHref);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(description, getDescription);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(actionData, getDynamicData);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(parentID, getParentID);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(parentJointIndex, getParentJointIndex);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(queryAACube, getQueryAACube);
+    // Script local data
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(localPosition, getLocalPosition);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(localRotation, getLocalOrientation);
-
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(entityHostType, getEntityHostType);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(owningAvatarID, getOwningAvatarID);
-
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(lastEditedBy, getLastEditedBy);
-
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneable, getCloneable);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneLifetime, getCloneLifetime);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneLimit, getCloneLimit);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneDynamic, getCloneDynamic);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneAvatarEntity, getCloneAvatarEntity);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneOriginID, getCloneOriginID);
-
-    withReadLock([&] {
-        _grabProperties.getProperties(properties);
-    });
+    // FIXME: are these needed?
+    //COPY_ENTITY_PROPERTY_TO_PROPERTIES(localVelocity, getLocalVelocity);
+    //COPY_ENTITY_PROPERTY_TO_PROPERTIES(localAngularVelocity, getLocalAngularVelocity);
+    //COPY_ENTITY_PROPERTY_TO_PROPERTIES(localDimensions, getLocalDimensions);
 
     properties._defaultSettings = false;
 
@@ -1421,42 +1433,61 @@ bool EntityItem::stillWaitingToTakeOwnership(uint64_t timestamp) const {
 bool EntityItem::setProperties(const EntityItemProperties& properties) {
     bool somethingChanged = false;
 
-    // these affect transform and velocity properties
+    // Core
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(simulationOwner, setSimulationOwner);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(visible, setVisible);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(name, setName);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(locked, setLocked);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(userData, setUserData);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(href, setHref);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(description, setDescription);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(position, setPosition);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(dimensions, setUnscaledDimensions);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(rotation, setRotation);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(registrationPoint, setRegistrationPoint);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(created, setCreated);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(lastEditedBy, setLastEditedBy);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(entityHostType, setEntityHostType);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(owningAvatarID, setOwningAvatarID);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(parentID, setParentID);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(parentJointIndex, setParentJointIndex);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(queryAACube, setQueryAACube);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(canCastShadow, setCanCastShadow);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(isVisibleInSecondaryCamera, setIsVisibleInSecondaryCamera);
+    withWriteLock([&] {
+        bool grabPropertiesChanged = _grabProperties.setProperties(properties);
+        somethingChanged |= grabPropertiesChanged;
+    });
+
+    // Physics
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(density, setDensity);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(velocity, setVelocity);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(angularVelocity, setAngularVelocity);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(acceleration, setAcceleration);
-
-    // these (along with "position" above) affect tree structure
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(dimensions, setUnscaledDimensions);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(registrationPoint, setRegistrationPoint);
-
-    // these (along with all properties above) affect the simulation
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(density, setDensity);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(gravity, setGravity);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(acceleration, setAcceleration);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(damping, setDamping);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(angularDamping, setAngularDamping);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(restitution, setRestitution);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(friction, setFriction);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, setLifetime);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionless, setCollisionless);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionMask, setCollisionMask);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(dynamic, setDynamic);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(created, setCreated);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, setLifetime);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(locked, setLocked);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionSoundURL, setCollisionSoundURL);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(actionData, setDynamicData);
 
-    // non-simulation properties below
+    // Cloning
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneable, setCloneable);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneLifetime, setCloneLifetime);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneLimit, setCloneLimit);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneDynamic, setCloneDynamic);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneAvatarEntity, setCloneAvatarEntity);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneOriginID, setCloneOriginID);
+
+    // Scripts
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(script, setScript);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(scriptTimestamp, setScriptTimestamp);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(serverScripts, setServerScripts);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionSoundURL, setCollisionSoundURL);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(localRenderAlpha, setLocalRenderAlpha);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(visible, setVisible);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(canCastShadow, setCanCastShadow);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(userData, setUserData);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(isVisibleInSecondaryCamera, setIsVisibleInSecondaryCamera);
 
     // Certifiable Properties
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemName, setItemName);
@@ -1471,31 +1502,6 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) {
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(certificateID, setCertificateID);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(staticCertificateVersion, setStaticCertificateVersion);
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(name, setName);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(href, setHref);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(description, setDescription);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(actionData, setDynamicData);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(parentID, setParentID);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(parentJointIndex, setParentJointIndex);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(queryAACube, setQueryAACube);
-
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(entityHostType, setEntityHostType);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(owningAvatarID, setOwningAvatarID);
-
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(lastEditedBy, setLastEditedBy);
-
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneable, setCloneable);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneLifetime, setCloneLifetime);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneLimit, setCloneLimit);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneDynamic, setCloneDynamic);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneAvatarEntity, setCloneAvatarEntity);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneOriginID, setCloneOriginID);
-
-    withWriteLock([&] {
-        bool grabPropertiesChanged = _grabProperties.setProperties(properties);
-        somethingChanged |= grabPropertiesChanged;
-    });
-
     if (updateQueryAACube()) {
         somethingChanged = true;
     }
@@ -2686,20 +2692,6 @@ void EntityItem::setDescription(const QString& value) {
     });
 }
 
-float EntityItem::getLocalRenderAlpha() const {
-    float result;
-    withReadLock([&] {
-        result = _localRenderAlpha;
-    });
-    return result;
-}
-
-void EntityItem::setLocalRenderAlpha(float localRenderAlpha) {
-    withWriteLock([&] {
-        _localRenderAlpha = localRenderAlpha;
-    });
-}
-
 glm::vec3 EntityItem::getGravity() const {
     glm::vec3 result;
     withReadLock([&] {
diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h
index 09cd0b5d26..826a9c34a0 100644
--- a/libraries/entities/src/EntityItem.h
+++ b/libraries/entities/src/EntityItem.h
@@ -206,9 +206,6 @@ public:
     glm::vec3 getUnscaledDimensions() const;
     virtual void setUnscaledDimensions(const glm::vec3& value);
 
-    float getLocalRenderAlpha() const;
-    void setLocalRenderAlpha(float localRenderAlpha);
-
     void setDensity(float density);
     float computeMass() const;
     void setMass(float mass);
@@ -594,7 +591,6 @@ protected:
     mutable bool _recalcMinAACube { true };
     mutable bool _recalcMaxAACube { true };
 
-    float _localRenderAlpha { ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA };
     float _density { ENTITY_ITEM_DEFAULT_DENSITY }; // kg/m^3
     // NOTE: _volumeMultiplier is used to allow some mass properties code exist in the EntityItem base class
     // rather than in all of the derived classes.  If we ever collapse these classes to one we could do it a
diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp
index 1c384ad16c..1745658cf1 100644
--- a/libraries/entities/src/EntityItemProperties.cpp
+++ b/libraries/entities/src/EntityItemProperties.cpp
@@ -50,10 +50,6 @@ EntityItemProperties::EntityItemProperties(EntityPropertyFlags desiredProperties
     _lastEdited(0),
     _type(EntityTypes::Unknown),
 
-    _localRenderAlpha(1.0f),
-
-    _localRenderAlphaChanged(false),
-
     _defaultSettings(true),
     _naturalDimensions(1.0f, 1.0f, 1.0f),
     _naturalPosition(0.0f, 0.0f, 0.0f),
@@ -350,58 +346,90 @@ void EntityItemProperties::setBillboardModeFromString(const QString& materialMap
 EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
     EntityPropertyFlags changedProperties;
 
-    CHECK_PROPERTY_CHANGE(PROP_LAST_EDITED_BY, lastEditedBy);
+    // Core
+    CHECK_PROPERTY_CHANGE(PROP_SIMULATION_OWNER, simulationOwner);
+    CHECK_PROPERTY_CHANGE(PROP_VISIBLE, visible);
+    CHECK_PROPERTY_CHANGE(PROP_NAME, name);
+    CHECK_PROPERTY_CHANGE(PROP_LOCKED, locked);
+    CHECK_PROPERTY_CHANGE(PROP_USER_DATA, userData);
+    CHECK_PROPERTY_CHANGE(PROP_HREF, href);
+    CHECK_PROPERTY_CHANGE(PROP_DESCRIPTION, description);
     CHECK_PROPERTY_CHANGE(PROP_POSITION, position);
     CHECK_PROPERTY_CHANGE(PROP_DIMENSIONS, dimensions);
     CHECK_PROPERTY_CHANGE(PROP_ROTATION, rotation);
+    CHECK_PROPERTY_CHANGE(PROP_REGISTRATION_POINT, registrationPoint);
+    //CHECK_PROPERTY_CHANGE(PROP_CREATED, created); // can't change
+    CHECK_PROPERTY_CHANGE(PROP_LAST_EDITED_BY, lastEditedBy);
+    CHECK_PROPERTY_CHANGE(PROP_ENTITY_HOST_TYPE, entityHostType);
+    CHECK_PROPERTY_CHANGE(PROP_OWNING_AVATAR_ID, owningAvatarID);
+    CHECK_PROPERTY_CHANGE(PROP_PARENT_ID, parentID);
+    CHECK_PROPERTY_CHANGE(PROP_PARENT_JOINT_INDEX, parentJointIndex);
+    CHECK_PROPERTY_CHANGE(PROP_QUERY_AA_CUBE, queryAACube);
+    CHECK_PROPERTY_CHANGE(PROP_CAN_CAST_SHADOW, canCastShadow);
+    CHECK_PROPERTY_CHANGE(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera);
+    changedProperties += _grab.getChangedProperties();
+
+    // Physics
     CHECK_PROPERTY_CHANGE(PROP_DENSITY, density);
     CHECK_PROPERTY_CHANGE(PROP_VELOCITY, velocity);
+    CHECK_PROPERTY_CHANGE(PROP_ANGULAR_VELOCITY, angularVelocity);
     CHECK_PROPERTY_CHANGE(PROP_GRAVITY, gravity);
     CHECK_PROPERTY_CHANGE(PROP_ACCELERATION, acceleration);
     CHECK_PROPERTY_CHANGE(PROP_DAMPING, damping);
+    CHECK_PROPERTY_CHANGE(PROP_ANGULAR_DAMPING, angularDamping);
     CHECK_PROPERTY_CHANGE(PROP_RESTITUTION, restitution);
     CHECK_PROPERTY_CHANGE(PROP_FRICTION, friction);
     CHECK_PROPERTY_CHANGE(PROP_LIFETIME, lifetime);
-    CHECK_PROPERTY_CHANGE(PROP_SCRIPT, script);
-    CHECK_PROPERTY_CHANGE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp);
-    CHECK_PROPERTY_CHANGE(PROP_SERVER_SCRIPTS, serverScripts);
-    CHECK_PROPERTY_CHANGE(PROP_COLLISION_SOUND_URL, collisionSoundURL);
-    CHECK_PROPERTY_CHANGE(PROP_COLOR, color);
-    CHECK_PROPERTY_CHANGE(PROP_COLOR_SPREAD, colorSpread);
-    CHECK_PROPERTY_CHANGE(PROP_COLOR_START, colorStart);
-    CHECK_PROPERTY_CHANGE(PROP_COLOR_FINISH, colorFinish);
-    CHECK_PROPERTY_CHANGE(PROP_ALPHA, alpha);
-    CHECK_PROPERTY_CHANGE(PROP_ALPHA_SPREAD, alphaSpread);
-    CHECK_PROPERTY_CHANGE(PROP_ALPHA_START, alphaStart);
-    CHECK_PROPERTY_CHANGE(PROP_ALPHA_FINISH, alphaFinish);
-    CHECK_PROPERTY_CHANGE(PROP_EMITTER_SHOULD_TRAIL, emitterShouldTrail);
-    CHECK_PROPERTY_CHANGE(PROP_MODEL_URL, modelURL);
-    CHECK_PROPERTY_CHANGE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL);
-    CHECK_PROPERTY_CHANGE(PROP_VISIBLE, visible);
-    CHECK_PROPERTY_CHANGE(PROP_CAN_CAST_SHADOW, canCastShadow);
-    CHECK_PROPERTY_CHANGE(PROP_REGISTRATION_POINT, registrationPoint);
-    CHECK_PROPERTY_CHANGE(PROP_ANGULAR_VELOCITY, angularVelocity);
-    CHECK_PROPERTY_CHANGE(PROP_ANGULAR_DAMPING, angularDamping);
     CHECK_PROPERTY_CHANGE(PROP_COLLISIONLESS, collisionless);
     CHECK_PROPERTY_CHANGE(PROP_COLLISION_MASK, collisionMask);
     CHECK_PROPERTY_CHANGE(PROP_DYNAMIC, dynamic);
-    CHECK_PROPERTY_CHANGE(PROP_IS_SPOTLIGHT, isSpotlight);
-    CHECK_PROPERTY_CHANGE(PROP_INTENSITY, intensity);
-    CHECK_PROPERTY_CHANGE(PROP_FALLOFF_RADIUS, falloffRadius);
-    CHECK_PROPERTY_CHANGE(PROP_EXPONENT, exponent);
-    CHECK_PROPERTY_CHANGE(PROP_CUTOFF, cutoff);
-    CHECK_PROPERTY_CHANGE(PROP_LOCKED, locked);
-    CHECK_PROPERTY_CHANGE(PROP_TEXTURES, textures);
-    CHECK_PROPERTY_CHANGE(PROP_USER_DATA, userData);
-    CHECK_PROPERTY_CHANGE(PROP_SIMULATION_OWNER, simulationOwner);
-    CHECK_PROPERTY_CHANGE(PROP_TEXT, text);
-    CHECK_PROPERTY_CHANGE(PROP_LINE_HEIGHT, lineHeight);
-    CHECK_PROPERTY_CHANGE(PROP_TEXT_COLOR, textColor);
-    CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_COLOR, backgroundColor);
+    CHECK_PROPERTY_CHANGE(PROP_COLLISION_SOUND_URL, collisionSoundURL);
+    CHECK_PROPERTY_CHANGE(PROP_ACTION_DATA, actionData);
+
+    // Cloning
+    CHECK_PROPERTY_CHANGE(PROP_CLONEABLE, cloneable);
+    CHECK_PROPERTY_CHANGE(PROP_CLONE_LIFETIME, cloneLifetime);
+    CHECK_PROPERTY_CHANGE(PROP_CLONE_LIMIT, cloneLimit);
+    CHECK_PROPERTY_CHANGE(PROP_CLONE_DYNAMIC, cloneDynamic);
+    CHECK_PROPERTY_CHANGE(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity);
+    CHECK_PROPERTY_CHANGE(PROP_CLONE_ORIGIN_ID, cloneOriginID);
+
+    // Scripts
+    CHECK_PROPERTY_CHANGE(PROP_SCRIPT, script);
+    CHECK_PROPERTY_CHANGE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp);
+    CHECK_PROPERTY_CHANGE(PROP_SERVER_SCRIPTS, serverScripts);
+
+    // Certifiable Properties
+    CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName);
+    CHECK_PROPERTY_CHANGE(PROP_ITEM_DESCRIPTION, itemDescription);
+    CHECK_PROPERTY_CHANGE(PROP_ITEM_CATEGORIES, itemCategories);
+    CHECK_PROPERTY_CHANGE(PROP_ITEM_ARTIST, itemArtist);
+    CHECK_PROPERTY_CHANGE(PROP_ITEM_LICENSE, itemLicense);
+    CHECK_PROPERTY_CHANGE(PROP_LIMITED_RUN, limitedRun);
+    CHECK_PROPERTY_CHANGE(PROP_MARKETPLACE_ID, marketplaceID);
+    CHECK_PROPERTY_CHANGE(PROP_EDITION_NUMBER, editionNumber);
+    CHECK_PROPERTY_CHANGE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber);
+    CHECK_PROPERTY_CHANGE(PROP_CERTIFICATE_ID, certificateID);
+    CHECK_PROPERTY_CHANGE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion);
+
+    // Location data for scripts
+    CHECK_PROPERTY_CHANGE(PROP_LOCAL_POSITION, localPosition);
+    CHECK_PROPERTY_CHANGE(PROP_LOCAL_ROTATION, localRotation);
+    CHECK_PROPERTY_CHANGE(PROP_LOCAL_VELOCITY, localVelocity);
+    CHECK_PROPERTY_CHANGE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity);
+    CHECK_PROPERTY_CHANGE(PROP_LOCAL_DIMENSIONS, localDimensions);
+
+    // Common
     CHECK_PROPERTY_CHANGE(PROP_SHAPE_TYPE, shapeType);
-    CHECK_PROPERTY_CHANGE(PROP_EMITTING_PARTICLES, isEmitting);
+    CHECK_PROPERTY_CHANGE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL);
+    CHECK_PROPERTY_CHANGE(PROP_COLOR, color);
+    CHECK_PROPERTY_CHANGE(PROP_ALPHA, alpha);
+    CHECK_PROPERTY_CHANGE(PROP_TEXTURES, textures);
+
+    // Particles
     CHECK_PROPERTY_CHANGE(PROP_MAX_PARTICLES, maxParticles);
     CHECK_PROPERTY_CHANGE(PROP_LIFESPAN, lifespan);
+    CHECK_PROPERTY_CHANGE(PROP_EMITTING_PARTICLES, isEmitting);
     CHECK_PROPERTY_CHANGE(PROP_EMIT_RATE, emitRate);
     CHECK_PROPERTY_CHANGE(PROP_EMIT_SPEED, emitSpeed);
     CHECK_PROPERTY_CHANGE(PROP_SPEED_SPREAD, speedSpread);
@@ -418,73 +446,67 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
     CHECK_PROPERTY_CHANGE(PROP_RADIUS_SPREAD, radiusSpread);
     CHECK_PROPERTY_CHANGE(PROP_RADIUS_START, radiusStart);
     CHECK_PROPERTY_CHANGE(PROP_RADIUS_FINISH, radiusFinish);
-    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_URL, materialURL);
-    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_MODE, materialMappingMode);
-    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_PRIORITY, priority);
-    CHECK_PROPERTY_CHANGE(PROP_PARENT_MATERIAL_NAME, parentMaterialName);
-    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_POS, materialMappingPos);
-    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_SCALE, materialMappingScale);
-    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_ROT, materialMappingRot);
-    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_DATA, materialData);
-    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_REPEAT, materialRepeat);
-    CHECK_PROPERTY_CHANGE(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera);
+    CHECK_PROPERTY_CHANGE(PROP_COLOR_SPREAD, colorSpread);
+    CHECK_PROPERTY_CHANGE(PROP_COLOR_START, colorStart);
+    CHECK_PROPERTY_CHANGE(PROP_COLOR_FINISH, colorFinish);
+    CHECK_PROPERTY_CHANGE(PROP_ALPHA_SPREAD, alphaSpread);
+    CHECK_PROPERTY_CHANGE(PROP_ALPHA_START, alphaStart);
+    CHECK_PROPERTY_CHANGE(PROP_ALPHA_FINISH, alphaFinish);
+    CHECK_PROPERTY_CHANGE(PROP_EMITTER_SHOULD_TRAIL, emitterShouldTrail);
     CHECK_PROPERTY_CHANGE(PROP_PARTICLE_SPIN, particleSpin);
     CHECK_PROPERTY_CHANGE(PROP_SPIN_SPREAD, spinSpread);
     CHECK_PROPERTY_CHANGE(PROP_SPIN_START, spinStart);
     CHECK_PROPERTY_CHANGE(PROP_SPIN_FINISH, spinFinish);
     CHECK_PROPERTY_CHANGE(PROP_PARTICLE_ROTATE_WITH_ENTITY, rotateWithEntity);
 
-    CHECK_PROPERTY_CHANGE(PROP_IMAGE_URL, imageURL);
-    CHECK_PROPERTY_CHANGE(PROP_EMISSIVE, emissive);
-    CHECK_PROPERTY_CHANGE(PROP_KEEP_ASPECT_RATIO, keepAspectRatio);
-    CHECK_PROPERTY_CHANGE(PROP_SUB_IMAGE, subImage);
+    // Model
+    CHECK_PROPERTY_CHANGE(PROP_MODEL_URL, modelURL);
+    CHECK_PROPERTY_CHANGE(PROP_JOINT_ROTATIONS_SET, jointRotationsSet);
+    CHECK_PROPERTY_CHANGE(PROP_JOINT_ROTATIONS, jointRotations);
+    CHECK_PROPERTY_CHANGE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet);
+    CHECK_PROPERTY_CHANGE(PROP_JOINT_TRANSLATIONS, jointTranslations);
+    CHECK_PROPERTY_CHANGE(PROP_RELAY_PARENT_JOINTS, relayParentJoints);
+    changedProperties += _animation.getChangedProperties();
 
-    CHECK_PROPERTY_CHANGE(PROP_GRID_FOLLOW_CAMERA, followCamera);
-    CHECK_PROPERTY_CHANGE(PROP_MAJOR_GRID_EVERY, majorGridEvery);
-    CHECK_PROPERTY_CHANGE(PROP_MINOR_GRID_EVERY, minorGridEvery);
+    // Light
+    CHECK_PROPERTY_CHANGE(PROP_IS_SPOTLIGHT, isSpotlight);
+    CHECK_PROPERTY_CHANGE(PROP_INTENSITY, intensity);
+    CHECK_PROPERTY_CHANGE(PROP_EXPONENT, exponent);
+    CHECK_PROPERTY_CHANGE(PROP_CUTOFF, cutoff);
+    CHECK_PROPERTY_CHANGE(PROP_FALLOFF_RADIUS, falloffRadius);
 
+    // Text
+    CHECK_PROPERTY_CHANGE(PROP_TEXT, text);
+    CHECK_PROPERTY_CHANGE(PROP_LINE_HEIGHT, lineHeight);
+    CHECK_PROPERTY_CHANGE(PROP_TEXT_COLOR, textColor);
     CHECK_PROPERTY_CHANGE(PROP_TEXT_ALPHA, textAlpha);
+    CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_COLOR, backgroundColor);
     CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_ALPHA, backgroundAlpha);
+    CHECK_PROPERTY_CHANGE(PROP_BILLBOARD_MODE, billboardMode);
     CHECK_PROPERTY_CHANGE(PROP_LEFT_MARGIN, leftMargin);
     CHECK_PROPERTY_CHANGE(PROP_RIGHT_MARGIN, rightMargin);
     CHECK_PROPERTY_CHANGE(PROP_TOP_MARGIN, topMargin);
     CHECK_PROPERTY_CHANGE(PROP_BOTTOM_MARGIN, bottomMargin);
 
-    // Certifiable Properties
-    CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName);
-    CHECK_PROPERTY_CHANGE(PROP_ITEM_DESCRIPTION, itemDescription);
-    CHECK_PROPERTY_CHANGE(PROP_ITEM_CATEGORIES, itemCategories);
-    CHECK_PROPERTY_CHANGE(PROP_ITEM_ARTIST, itemArtist);
-    CHECK_PROPERTY_CHANGE(PROP_ITEM_LICENSE, itemLicense);
-    CHECK_PROPERTY_CHANGE(PROP_LIMITED_RUN, limitedRun);
-    CHECK_PROPERTY_CHANGE(PROP_MARKETPLACE_ID, marketplaceID);
-    CHECK_PROPERTY_CHANGE(PROP_EDITION_NUMBER, editionNumber);
-    CHECK_PROPERTY_CHANGE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber);
-    CHECK_PROPERTY_CHANGE(PROP_CERTIFICATE_ID, certificateID);
-    CHECK_PROPERTY_CHANGE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion);
-
-    CHECK_PROPERTY_CHANGE(PROP_NAME, name);
-
-    CHECK_PROPERTY_CHANGE(PROP_HAZE_MODE, hazeMode);
+    // Zone
+    changedProperties += _keyLight.getChangedProperties();
+    changedProperties += _ambientLight.getChangedProperties();
+    changedProperties += _skybox.getChangedProperties();
+    changedProperties += _haze.getChangedProperties();
+    changedProperties += _bloom.getChangedProperties();
+    CHECK_PROPERTY_CHANGE(PROP_FLYING_ALLOWED, flyingAllowed);
+    CHECK_PROPERTY_CHANGE(PROP_GHOSTING_ALLOWED, ghostingAllowed);
+    CHECK_PROPERTY_CHANGE(PROP_FILTER_URL, filterURL);
     CHECK_PROPERTY_CHANGE(PROP_KEY_LIGHT_MODE, keyLightMode);
     CHECK_PROPERTY_CHANGE(PROP_AMBIENT_LIGHT_MODE, ambientLightMode);
     CHECK_PROPERTY_CHANGE(PROP_SKYBOX_MODE, skyboxMode);
+    CHECK_PROPERTY_CHANGE(PROP_HAZE_MODE, hazeMode);
     CHECK_PROPERTY_CHANGE(PROP_BLOOM_MODE, bloomMode);
 
-    CHECK_PROPERTY_CHANGE(PROP_SOURCE_URL, sourceUrl);
+    // Polyvox
     CHECK_PROPERTY_CHANGE(PROP_VOXEL_VOLUME_SIZE, voxelVolumeSize);
     CHECK_PROPERTY_CHANGE(PROP_VOXEL_DATA, voxelData);
     CHECK_PROPERTY_CHANGE(PROP_VOXEL_SURFACE_STYLE, voxelSurfaceStyle);
-    CHECK_PROPERTY_CHANGE(PROP_LINE_WIDTH, lineWidth);
-    CHECK_PROPERTY_CHANGE(PROP_LINE_POINTS, linePoints);
-    CHECK_PROPERTY_CHANGE(PROP_HREF, href);
-    CHECK_PROPERTY_CHANGE(PROP_DESCRIPTION, description);
-    CHECK_PROPERTY_CHANGE(PROP_BILLBOARD_MODE, billboardMode);
-    CHECK_PROPERTY_CHANGE(PROP_ACTION_DATA, actionData);
-    CHECK_PROPERTY_CHANGE(PROP_NORMALS, normals);
-    CHECK_PROPERTY_CHANGE(PROP_STROKE_COLORS, strokeColors);
-    CHECK_PROPERTY_CHANGE(PROP_STROKE_WIDTHS, strokeWidths);
-    CHECK_PROPERTY_CHANGE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch);
     CHECK_PROPERTY_CHANGE(PROP_X_TEXTURE_URL, xTextureURL);
     CHECK_PROPERTY_CHANGE(PROP_Y_TEXTURE_URL, yTextureURL);
     CHECK_PROPERTY_CHANGE(PROP_Z_TEXTURE_URL, zTextureURL);
@@ -494,44 +516,42 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
     CHECK_PROPERTY_CHANGE(PROP_X_P_NEIGHBOR_ID, xPNeighborID);
     CHECK_PROPERTY_CHANGE(PROP_Y_P_NEIGHBOR_ID, yPNeighborID);
     CHECK_PROPERTY_CHANGE(PROP_Z_P_NEIGHBOR_ID, zPNeighborID);
-    CHECK_PROPERTY_CHANGE(PROP_PARENT_ID, parentID);
-    CHECK_PROPERTY_CHANGE(PROP_PARENT_JOINT_INDEX, parentJointIndex);
-    CHECK_PROPERTY_CHANGE(PROP_JOINT_ROTATIONS_SET, jointRotationsSet);
-    CHECK_PROPERTY_CHANGE(PROP_JOINT_ROTATIONS, jointRotations);
-    CHECK_PROPERTY_CHANGE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet);
-    CHECK_PROPERTY_CHANGE(PROP_JOINT_TRANSLATIONS, jointTranslations);
-    CHECK_PROPERTY_CHANGE(PROP_QUERY_AA_CUBE, queryAACube);
-    CHECK_PROPERTY_CHANGE(PROP_LOCAL_POSITION, localPosition);
-    CHECK_PROPERTY_CHANGE(PROP_LOCAL_ROTATION, localRotation);
-    CHECK_PROPERTY_CHANGE(PROP_LOCAL_VELOCITY, localVelocity);
-    CHECK_PROPERTY_CHANGE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity);
-    CHECK_PROPERTY_CHANGE(PROP_LOCAL_DIMENSIONS, localDimensions);
 
-    CHECK_PROPERTY_CHANGE(PROP_FLYING_ALLOWED, flyingAllowed);
-    CHECK_PROPERTY_CHANGE(PROP_GHOSTING_ALLOWED, ghostingAllowed);
-    CHECK_PROPERTY_CHANGE(PROP_FILTER_URL, filterURL);
-
-    CHECK_PROPERTY_CHANGE(PROP_ENTITY_HOST_TYPE, entityHostType);
-    CHECK_PROPERTY_CHANGE(PROP_OWNING_AVATAR_ID, owningAvatarID);
-
-    CHECK_PROPERTY_CHANGE(PROP_SHAPE, shape);
+    // Web
+    CHECK_PROPERTY_CHANGE(PROP_SOURCE_URL, sourceUrl);
     CHECK_PROPERTY_CHANGE(PROP_DPI, dpi);
-    CHECK_PROPERTY_CHANGE(PROP_RELAY_PARENT_JOINTS, relayParentJoints);
 
-    CHECK_PROPERTY_CHANGE(PROP_CLONEABLE, cloneable);
-    CHECK_PROPERTY_CHANGE(PROP_CLONE_LIFETIME, cloneLifetime);
-    CHECK_PROPERTY_CHANGE(PROP_CLONE_LIMIT, cloneLimit);
-    CHECK_PROPERTY_CHANGE(PROP_CLONE_DYNAMIC, cloneDynamic);
-    CHECK_PROPERTY_CHANGE(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity);
-    CHECK_PROPERTY_CHANGE(PROP_CLONE_ORIGIN_ID, cloneOriginID);
+    // Polyline
+    CHECK_PROPERTY_CHANGE(PROP_LINE_POINTS, linePoints);
+    CHECK_PROPERTY_CHANGE(PROP_STROKE_WIDTHS, strokeWidths);
+    CHECK_PROPERTY_CHANGE(PROP_STROKE_NORMALS, normals);
+    CHECK_PROPERTY_CHANGE(PROP_STROKE_COLORS, strokeColors);
+    CHECK_PROPERTY_CHANGE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch);
 
-    changedProperties += _animation.getChangedProperties();
-    changedProperties += _keyLight.getChangedProperties();
-    changedProperties += _ambientLight.getChangedProperties();
-    changedProperties += _skybox.getChangedProperties();
-    changedProperties += _haze.getChangedProperties();
-    changedProperties += _bloom.getChangedProperties();
-    changedProperties += _grab.getChangedProperties();
+    // Shape
+    CHECK_PROPERTY_CHANGE(PROP_SHAPE, shape);
+
+    // Material
+    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_URL, materialURL);
+    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_MODE, materialMappingMode);
+    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_PRIORITY, priority);
+    CHECK_PROPERTY_CHANGE(PROP_PARENT_MATERIAL_NAME, parentMaterialName);
+    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_POS, materialMappingPos);
+    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_SCALE, materialMappingScale);
+    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_ROT, materialMappingRot);
+    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_DATA, materialData);
+    CHECK_PROPERTY_CHANGE(PROP_MATERIAL_REPEAT, materialRepeat);
+
+    // Image
+    CHECK_PROPERTY_CHANGE(PROP_IMAGE_URL, imageURL);
+    CHECK_PROPERTY_CHANGE(PROP_EMISSIVE, emissive);
+    CHECK_PROPERTY_CHANGE(PROP_KEEP_ASPECT_RATIO, keepAspectRatio);
+    CHECK_PROPERTY_CHANGE(PROP_SUB_IMAGE, subImage);
+
+    // Grid
+    CHECK_PROPERTY_CHANGE(PROP_GRID_FOLLOW_CAMERA, followCamera);
+    CHECK_PROPERTY_CHANGE(PROP_MAJOR_GRID_EVERY, majorGridEvery);
+    CHECK_PROPERTY_CHANGE(PROP_MINOR_GRID_EVERY, minorGridEvery);
 
     return changedProperties;
 }
@@ -626,16 +646,14 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
  *     mass in the application of physics.
  *
  * @property {boolean} collisionless=false - Whether or not the entity should collide with items per its 
- *     <code>collisionMask<code> property. If <code>true</code> then the entity does not collide.
- * @property {boolean} ignoreForCollisions=false - Synonym for <code>collisionless</code>.
+ *     <code>collisionMask<code> property. If <code>true</code> then the entity does not collide. A synonym is <code>ignoreForCollisions</code>.
  * @property {Entities.CollisionMask} collisionMask=31 - What types of items the entity should collide with.
  * @property {string} collidesWith="static,dynamic,kinematic,myAvatar,otherAvatar," - Synonym for <code>collisionMask</code>,
  *     in text format.
  * @property {string} collisionSoundURL="" - The sound to play when the entity experiences a collision. Valid file formats are
  *     as per the {@link SoundCache} object.
  * @property {boolean} dynamic=false - Whether or not the entity should be affected by collisions. If <code>true</code> then 
- *     the entity's movement is affected by collisions.
- * @property {boolean} collisionsWillMove=false - Synonym for <code>dynamic</code>.
+ *     the entity's movement is affected by collisions. A synonym is <code>collisionsWillMove</code>.
  *
  * @property {string} href="" - A "hifi://" metaverse address that a user is taken to when they click on the entity.
  * @property {string} description="" - A description of the <code>href</code> property value.
@@ -681,8 +699,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
  *     is typically not used in scripts directly; rather, functions that manipulate an entity's actions update it.
  *     The size of this property increases with the number of actions. Because this property value has to fit within a High 
  *     Fidelity datagram packet there is a limit to the number of actions that an entity can have, and edits which would result 
- *     in overflow are rejected.
- *     <em>Read-only.</em>
+ *     in overflow are rejected. <em>Read-only.</em>
  * @property {Entities.RenderInfo} renderInfo - Information on the cost of rendering the entity. Currently information is only 
  *     provided for <code>Model</code> entities. <em>Read-only.</em>
  *
@@ -769,16 +786,15 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
  */
 
 /**jsdoc
- * The <code>"Line"</code> {@link Entities.EntityType|EntityType} draws thin, straight lines between a sequence of two or more 
- * points.
+ * The <code>"Line"</code> {@link Entities.EntityType|EntityType} draws thin, straight lines between a sequence of two or more
+ * points.  Deprecated: Use PolyLines instead.
  * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}.
  * @typedef {object} Entities.EntityProperties-Line
- * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. Must be sufficient to contain all the 
+ * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. Must be sufficient to contain all the
  *     <code>linePoints</code>.
  * @property {Vec3[]} linePoints=[]] - The sequence of points to draw lines between. The values are relative to the entity's
- *     position. A maximum of 70 points can be specified. The property's value is set only if all the <code>linePoints</code> 
+ *     position. A maximum of 70 points can be specified. The property's value is set only if all the <code>linePoints</code>
  *     lie within the entity's <code>dimensions</code>.
- * @property {number} lineWidth=2 - <em>Currently not used.</em>
  * @property {Color} color=255,255,255 - The color of the line.
  * @example <caption>Draw lines in a "V".</caption>
  * var entity = Entities.addEntity({
@@ -879,22 +895,22 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
  *
  * @property {Entities.AnimationProperties} animation - An animation to play on the model.
  *
- * @property {Quat[]} jointRotations=[]] - Joint rotations applied to the model; <code>[]</code> if none are applied or the 
+ * @property {Quat[]} jointRotations=[] - Joint rotations applied to the model; <code>[]</code> if none are applied or the 
  *     model hasn't loaded. The array indexes are per {@link Entities.getJointIndex|getJointIndex}. Rotations are relative to 
  *     each joint's parent.<br />
  *     Joint rotations can be set by {@link Entities.setLocalJointRotation|setLocalJointRotation} and similar functions, or by
  *     setting the value of this property. If you set a joint rotation using this property you also need to set the 
  *     corresponding <code>jointRotationsSet</code> value to <code>true</code>.
- * @property {boolean[]} jointRotationsSet=[]] - <code>true</code> values for joints that have had rotations applied, 
+ * @property {boolean[]} jointRotationsSet=[] - <code>true</code> values for joints that have had rotations applied, 
  *     <code>false</code> otherwise; <code>[]</code> if none are applied or the model hasn't loaded. The array indexes are per 
  *     {@link Entities.getJointIndex|getJointIndex}.
- * @property {Vec3[]} jointTranslations=[]] - Joint translations applied to the model; <code>[]</code> if none are applied or 
+ * @property {Vec3[]} jointTranslations=[] - Joint translations applied to the model; <code>[]</code> if none are applied or 
  *     the model hasn't loaded. The array indexes are per {@link Entities.getJointIndex|getJointIndex}. Rotations are relative 
  *     to each joint's parent.<br />
  *     Joint translations can be set by {@link Entities.setLocalJointTranslation|setLocalJointTranslation} and similar 
  *     functions, or by setting the value of this property. If you set a joint translation using this property you also need to 
  *     set the corresponding <code>jointTranslationsSet</code> value to <code>true</code>.
- * @property {boolean[]} jointTranslationsSet=[]] - <code>true</code> values for joints that have had translations applied, 
+ * @property {boolean[]} jointTranslationsSet=[] - <code>true</code> values for joints that have had translations applied, 
  *     <code>false</code> otherwise; <code>[]</code> if none are applied or the model hasn't loaded. The array indexes are per 
  *     {@link Entities.getJointIndex|getJointIndex}.
  * @property {boolean} relayParentJoints=false - If <code>true</code> and the entity is parented to an avatar, then the 
@@ -1022,16 +1038,15 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
  * @typedef {object} Entities.EntityProperties-PolyLine
  * @property {Vec3} dimensions=1,1,1 - The dimensions of the entity, i.e., the size of the bounding box that contains the 
  *     lines drawn.
- * @property {Vec3[]} linePoints=[]] - The sequence of points to draw lines between. The values are relative to the entity's
+ * @property {Vec3[]} linePoints=[] - The sequence of points to draw lines between. The values are relative to the entity's
  *     position. A maximum of 70 points can be specified. Must be specified in order for the entity to render.
- * @property {Vec3[]} normals=[]] - The normal vectors for the line's surface at the <code>linePoints</code>. The values are 
+ * @property {Vec3[]} normals=[] - The normal vectors for the line's surface at the <code>linePoints</code>. The values are 
  *     relative to the entity's orientation. Must be specified in order for the entity to render.
- * @property {number[]} strokeWidths=[]] - The widths, in m, of the line at the <code>linePoints</code>. Must be specified in 
+ * @property {number[]} strokeWidths=[] - The widths, in m, of the line at the <code>linePoints</code>. Must be specified in 
  *     order for the entity to render.
- * @property {number} lineWidth=2 - <em>Currently not used.</code>
- * @property {Vec3[]} strokeColors=[]] - <em>Currently not used.</em>
- * @property {Color} color=255,255,255 - The base color of the line, which is multiplied with the color of the texture for
- *     rendering.
+ * @property {Vec3[]} strokeColors=[] - The base colors of each point, which are multiplied with the color of the texture, going from 0-1.
+ *     If strokeColors.length < the number of points, <code>color</code> is used for the remaining points.
+ * @property {Color} color=255,255,255 - Used as the color for each point if <code>strokeColors</code> is too short.
  * @property {string} textures="" - The URL of a JPG or PNG texture to use for the lines. If you want transparency, use PNG
  *     format.
  * @property {boolean} isUVModeStretch=true - If <code>true</code>, the texture is stretched to fill the whole line, otherwise 
@@ -1357,7 +1372,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
         created.setTimeSpec(Qt::OffsetFromUTC);
         COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_ALWAYS(created, created.toString(Qt::ISODate));
     }
-
     if ((!skipDefaults || _lifetime != defaultEntityProperties._lifetime) && !strictSemantics) {
         if (!psuedoPropertyFlagsActive || psueudoPropertyFlags.test(EntityPsuedoPropertyFlag::Age)) {
             COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(age, getAge()); // gettable, but not settable
@@ -1366,46 +1380,69 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
             COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(ageAsText, formatSecondsElapsed(getAge())); // gettable, but not settable
         }
     }
-
     if (!psuedoPropertyFlagsActive || psueudoPropertyFlags.test(EntityPsuedoPropertyFlag::LastEdited)) {
         properties.setProperty("lastEdited", convertScriptValue(engine, _lastEdited));
     }
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LAST_EDITED_BY, lastEditedBy);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_POSITION, position);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DIMENSIONS, dimensions);
     if (!skipDefaults) {
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DIMENSIONS, naturalDimensions); // gettable, but not settable
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_POSITION, naturalPosition);
     }
+
+    // Core properties
+    //COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SIMULATION_OWNER, simulationOwner); // not exposed yet
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE, visible);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCKED, locked);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_USER_DATA, userData);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_HREF, href);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DESCRIPTION, description);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_POSITION, position);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DIMENSIONS, dimensions);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ROTATION, rotation);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_REGISTRATION_POINT, registrationPoint);
+    //COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CREATED, created); // handled above
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LAST_EDITED_BY, lastEditedBy);
+    COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ENTITY_HOST_TYPE, entityHostType, getEntityHostTypeAsString());
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_OWNING_AVATAR_ID, owningAvatarID);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_ID, parentID);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_JOINT_INDEX, parentJointIndex);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_QUERY_AA_CUBE, queryAACube);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CAN_CAST_SHADOW, canCastShadow);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera);
+    _grab.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties);
+
+    // Physics
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DENSITY, density);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VELOCITY, velocity);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_VELOCITY, angularVelocity);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_GRAVITY, gravity);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ACCELERATION, acceleration);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DAMPING, damping);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_DAMPING, angularDamping);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RESTITUTION, restitution);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FRICTION, friction);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DENSITY, density);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIFETIME, lifetime);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT, script);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SERVER_SCRIPTS, serverScripts);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_REGISTRATION_POINT, registrationPoint);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_VELOCITY, angularVelocity);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_DAMPING, angularDamping);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE, visible);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CAN_CAST_SHADOW, canCastShadow);  // Relevant to Shape and Model entities only.
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISIONLESS, collisionless);
     COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_COLLISIONLESS, collisionless, ignoreForCollisions, getCollisionless()); // legacy support
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_MASK, collisionMask);
     COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_COLLISION_MASK, collisionMask, collidesWith, getCollisionMaskAsString());
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DYNAMIC, dynamic);
     COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_DYNAMIC, dynamic, collisionsWillMove, getDynamic()); // legacy support
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_HREF, href);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DESCRIPTION, description);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_SOUND_URL, collisionSoundURL);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ACTION_DATA, actionData);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCKED, locked);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_USER_DATA, userData);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera);
+
+    // Cloning
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONEABLE, cloneable);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_LIFETIME, cloneLifetime);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_LIMIT, cloneLimit);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_DYNAMIC, cloneDynamic);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_ORIGIN_ID, cloneOriginID);
+
+    // Scripts
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT, script);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SERVER_SCRIPTS, serverScripts);
 
     // Certifiable Properties
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_NAME, itemName);
@@ -1420,12 +1457,20 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CERTIFICATE_ID, certificateID);
     COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion);
 
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_SOUND_URL, collisionSoundURL);
+    // Local props for scripts
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_POSITION, localPosition);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ROTATION, localRotation);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_VELOCITY, localVelocity);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity);
+    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_DIMENSIONS, localDimensions);
 
     // Particles only
     if (_type == EntityTypes::ParticleEffect) {
         COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString());
+        COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha);
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures);
+
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MAX_PARTICLES, maxParticles);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIFESPAN, lifespan);
 
@@ -1450,17 +1495,14 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_START, radiusStart);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_FINISH, radiusFinish);
 
-        COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
         COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_SPREAD, colorSpread, u8vec3Color);
         COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_START, colorStart, vec3Color);
         COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_FINISH, colorFinish, vec3Color);
 
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_SPREAD, alphaSpread);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_START, alphaStart);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_FINISH, alphaFinish);
 
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EMITTER_SHOULD_TRAIL, emitterShouldTrail);
 
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARTICLE_SPIN, particleSpin);
@@ -1472,11 +1514,12 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
 
     // Models only
     if (_type == EntityTypes::Model) {
-        COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MODEL_URL, modelURL);
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL);
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures);
         COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString());
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL);
+        COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures);
+
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MODEL_URL, modelURL);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_ROTATIONS_SET, jointRotationsSet);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_ROTATIONS, jointRotations);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet);
@@ -1496,15 +1539,15 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
     }
 
     if (_type == EntityTypes::Box || _type == EntityTypes::Sphere || _type == EntityTypes::Shape) {
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SHAPE, shape);
         COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha);
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SHAPE, shape);
     }
 
     // Lights only
     if (_type == EntityTypes::Light) {
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_SPOTLIGHT, isSpotlight);
         COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_SPOTLIGHT, isSpotlight);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_INTENSITY, intensity);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EXPONENT, exponent);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CUTOFF, cutoff);
@@ -1528,6 +1571,9 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
 
     // Zones only
     if (_type == EntityTypes::Zone) {
+        COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString());
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL);
+
         if (!psuedoPropertyFlagsButDesiredEmpty) {
             _keyLight.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties);
             _ambientLight.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties);
@@ -1535,8 +1581,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
             _haze.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties);
             _bloom.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties);
         }
-        COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString());
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL);
 
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FLYING_ALLOWED, flyingAllowed);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_GHOSTING_ALLOWED, ghostingAllowed);
@@ -1573,22 +1617,22 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_Z_P_NEIGHBOR_ID, zPNeighborID);
     }
 
-    // Lines & PolyLines
+    // Lines
     if (_type == EntityTypes::Line) {
         COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_WIDTH, lineWidth);
+
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints);
     }
 
+    // Polylines
     if (_type == EntityTypes::PolyLine) {
         COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_WIDTH, lineWidth);
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints);
-
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NORMALS, normals);
-        COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_STROKE_COLORS, strokeColors, qVectorVec3Color);
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_WIDTHS, strokeWidths);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures);
+
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints);
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_WIDTHS, strokeWidths);
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_NORMALS, normals);
+        COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_STROKE_COLORS, strokeColors, qVectorVec3Color);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch);
     }
 
@@ -1607,15 +1651,15 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
 
     // Image only
     if (_type == EntityTypes::Image) {
+        COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
+        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha);
+
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IMAGE_URL, imageURL);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EMISSIVE, emissive);
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_KEEP_ASPECT_RATIO, keepAspectRatio);
         COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_BILLBOARD_MODE, billboardMode, getBillboardModeAsString());
         COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SUB_IMAGE, subImage);
 
-        COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color);
-        COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha);
-
         // Handle conversions to old 'textures' property from "imageURL"
         if (((!psuedoPropertyFlagsButDesiredEmpty && _desiredProperties.isEmpty()) || _desiredProperties.getHasProperty(PROP_IMAGE_URL)) &&
                 (!skipDefaults || defaultEntityProperties._imageURL != _imageURL)) {
@@ -1664,29 +1708,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
         COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(originalTextures, textureNamesStr); // gettable, but not settable
     }
 
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_ID, parentID);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_JOINT_INDEX, parentJointIndex);
-
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_QUERY_AA_CUBE, queryAACube);
-
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_POSITION, localPosition);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ROTATION, localRotation);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_VELOCITY, localVelocity);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_DIMENSIONS, localDimensions);
-
-    COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ENTITY_HOST_TYPE, entityHostType, getEntityHostTypeAsString());  // Gettable but not settable except at entity creation
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_OWNING_AVATAR_ID, owningAvatarID);                                      // Gettable but not settable
-
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONEABLE, cloneable);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_LIFETIME, cloneLifetime);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_LIMIT, cloneLimit);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_DYNAMIC, cloneDynamic);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity);
-    COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_ORIGIN_ID, cloneOriginID);
-
-    _grab.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties);
-
     // Rendering info
     if (!skipDefaults && !strictSemantics &&
         (!psuedoPropertyFlagsActive || psueudoPropertyFlags.test(EntityPsuedoPropertyFlag::RenderInfo))) {
@@ -1732,9 +1753,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
         properties.setProperty("isFacingAvatar", convertScriptValue(engine, getBillboardMode() == BillboardMode::FULL));
     }
 
-    // FIXME - I don't think these properties are supported any more
-    //COPY_PROPERTY_TO_QSCRIPTVALUE(localRenderAlpha);
-
     return properties;
 }
 
@@ -1744,57 +1762,100 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool
         setType(typeScriptValue.toVariant().toString());
     }
 
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(lastEditedBy, QUuid, setLastEditedBy);
+    if (!honorReadOnly) {
+        // this is used by the json reader to set things that we don't want javascript to able to affect.
+        COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(created, QDateTime, setCreated, [this]() {
+            auto result = QDateTime::fromMSecsSinceEpoch(_created / 1000, Qt::UTC); // usec per msec
+            return result;
+        });
+        // TODO: expose this to QScriptValue for JSON saves?
+        //COPY_PROPERTY_FROM_QSCRIPTVALUE(simulationOwner, ???, setSimulatorPriority);
+    }
+
+    // Core
+    // simluationOwner above
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(locked, bool, setLocked);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(userData, QString, setUserData);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(href, QString, setHref);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(description, QString, setDescription);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(position, vec3, setPosition);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(dimensions, vec3, setDimensions);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(rotation, quat, setRotation);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, vec3, setRegistrationPoint);
+    // created is read only
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(lastEditedBy, QUuid, setLastEditedBy);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(entityHostType, EntityHostType);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(owningAvatarID, QUuid, setOwningAvatarID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(parentID, QUuid, setParentID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(parentJointIndex, quint16, setParentJointIndex);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(queryAACube, AACube, setQueryAACube); // TODO: should scripts be able to set this?
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(isVisibleInSecondaryCamera, bool, setIsVisibleInSecondaryCamera);
+    _grab.copyFromScriptValue(object, _defaultSettings);
+
+    // Physics
     COPY_PROPERTY_FROM_QSCRIPTVALUE(density, float, setDensity);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(velocity, vec3, setVelocity);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, vec3, setAngularVelocity);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(gravity, vec3, setGravity);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(acceleration, vec3, setAcceleration);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(damping, float, setDamping);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(restitution, float, setRestitution);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(friction, float, setFriction);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(lifetime, float, setLifetime);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(script, QString, setScript);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(scriptTimestamp, quint64, setScriptTimestamp);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(serverScripts, QString, setServerScripts);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, vec3, setRegistrationPoint);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, vec3, setAngularVelocity);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(color, u8vec3Color, setColor);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, u8vec3Color, setColorSpread);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, vec3Color, setColorStart);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, vec3Color, setColorFinish);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(alpha, float, setAlpha);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaSpread, float, setAlphaSpread);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaStart, float, setAlphaStart);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaFinish, float, setAlphaFinish);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(emitterShouldTrail, bool, setEmitterShouldTrail);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(modelURL, QString, setModelURL);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(compoundShapeURL, QString, setCompoundShapeURL);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(localRenderAlpha, float, setLocalRenderAlpha);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionless, bool, setCollisionless);
     COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(ignoreForCollisions, bool, setCollisionless, getCollisionless); // legacy support
     COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionMask, uint16_t, setCollisionMask);
     COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(collidesWith, CollisionMask);
     COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(collisionsWillMove, bool, setDynamic, getDynamic); // legacy support
     COPY_PROPERTY_FROM_QSCRIPTVALUE(dynamic, bool, setDynamic);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(isSpotlight, bool, setIsSpotlight);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(intensity, float, setIntensity);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(falloffRadius, float, setFalloffRadius);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(exponent, float, setExponent);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(cutoff, float, setCutoff);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(locked, bool, setLocked);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(textures, QString, setTextures);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(userData, QString, setUserData);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(text, QString, setText);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(lineHeight, float, setLineHeight);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, u8vec3Color, setTextColor);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, u8vec3Color, setBackgroundColor);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionSoundURL, QString, setCollisionSoundURL);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(actionData, QByteArray, setActionData); // TODO: should scripts be able to set this?
+
+    // Cloning
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneable, bool, setCloneable);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneLifetime, float, setCloneLifetime);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneLimit, float, setCloneLimit);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneDynamic, bool, setCloneDynamic);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneAvatarEntity, bool, setCloneAvatarEntity);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneOriginID, QUuid, setCloneOriginID);
+
+    // Scripts
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(script, QString, setScript);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(scriptTimestamp, quint64, setScriptTimestamp);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(serverScripts, QString, setServerScripts);
+
+    // Certifiable Properties
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemDescription, QString, setItemDescription);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemCategories, QString, setItemCategories);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemArtist, QString, setItemArtist);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemLicense, QString, setItemLicense);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(limitedRun, quint32, setLimitedRun);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(editionNumber, quint32, setEditionNumber);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(entityInstanceNumber, quint32, setEntityInstanceNumber);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(certificateID, QString, setCertificateID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(staticCertificateVersion, quint32, setStaticCertificateVersion);
+
+    // Script location data
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, vec3, setLocalPosition);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(localRotation, quat, setLocalRotation);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, vec3, setLocalVelocity);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, vec3, setLocalAngularVelocity);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, vec3, setLocalDimensions);
+
+    // Common
     COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(shapeType, ShapeType);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(compoundShapeURL, QString, setCompoundShapeURL);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(color, u8vec3Color, setColor);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(alpha, float, setAlpha);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(textures, QString, setTextures);
+
+    // Particles
     COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, quint32, setMaxParticles);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(isEmitting, bool, setIsEmitting);
@@ -1814,7 +1875,92 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool
     COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusSpread, float, setRadiusSpread);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusFinish, float, setRadiusFinish);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, u8vec3Color, setColorSpread);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, vec3Color, setColorStart);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, vec3Color, setColorFinish);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaSpread, float, setAlphaSpread);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaStart, float, setAlphaStart);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaFinish, float, setAlphaFinish);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(emitterShouldTrail, bool, setEmitterShouldTrail);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(particleSpin, float, setParticleSpin);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(spinSpread, float, setSpinSpread);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(spinStart, float, setSpinStart);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(spinFinish, float, setSpinFinish);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(rotateWithEntity, bool, setRotateWithEntity);
+
+    // Model
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(modelURL, QString, setModelURL);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotationsSet, qVectorBool, setJointRotationsSet);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotations, qVectorQuat, setJointRotations);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(jointTranslationsSet, qVectorBool, setJointTranslationsSet);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(jointTranslations, qVectorVec3, setJointTranslations);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(relayParentJoints, bool, setRelayParentJoints);
+    _animation.copyFromScriptValue(object, _defaultSettings);
+
+    // Light
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(isSpotlight, bool, setIsSpotlight);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(intensity, float, setIntensity);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(exponent, float, setExponent);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(cutoff, float, setCutoff);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(falloffRadius, float, setFalloffRadius);
+
+    // Text
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(text, QString, setText);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(lineHeight, float, setLineHeight);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, u8vec3Color, setTextColor);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(textAlpha, float, setTextAlpha);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, u8vec3Color, setBackgroundColor);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundAlpha, float, setBackgroundAlpha);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(billboardMode, BillboardMode);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(leftMargin, float, setLeftMargin);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(rightMargin, float, setRightMargin);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(topMargin, float, setTopMargin);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(bottomMargin, float, setBottomMargin);
+
+    // Zone
+    _keyLight.copyFromScriptValue(object, _defaultSettings);
+    _ambientLight.copyFromScriptValue(object, _defaultSettings);
+    _skybox.copyFromScriptValue(object, _defaultSettings);
+    _haze.copyFromScriptValue(object, _defaultSettings);
+    _bloom.copyFromScriptValue(object, _defaultSettings);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(flyingAllowed, bool, setFlyingAllowed);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(ghostingAllowed, bool, setGhostingAllowed);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(filterURL, QString, setFilterURL);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(keyLightMode, KeyLightMode);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(ambientLightMode, AmbientLightMode);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(skyboxMode, SkyboxMode);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(hazeMode, HazeMode);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(bloomMode, BloomMode);
+
+    // Polyvox
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, vec3, setVoxelVolumeSize);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelData, QByteArray, setVoxelData);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelSurfaceStyle, uint16_t, setVoxelSurfaceStyle);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(xTextureURL, QString, setXTextureURL);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(yTextureURL, QString, setYTextureURL);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(zTextureURL, QString, setZTextureURL);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(xNNeighborID, EntityItemID, setXNNeighborID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(yNNeighborID, EntityItemID, setYNNeighborID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(zNNeighborID, EntityItemID, setZNNeighborID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(xPNeighborID, EntityItemID, setXPNeighborID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(yPNeighborID, EntityItemID, setYPNeighborID);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(zPNeighborID, EntityItemID, setZPNeighborID);
+
+    // Web
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(sourceUrl, QString, setSourceUrl);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(dpi, uint16_t, setDPI);
+
+    // Polyline
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(linePoints, qVectorVec3, setLinePoints);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeWidths, qVectorFloat, setStrokeWidths);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(normals, qVectorVec3, setNormals);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeColors, qVectorVec3, setStrokeColors);
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(isUVModeStretch, bool, setIsUVModeStretch);
+
+    // Shape
+    COPY_PROPERTY_FROM_QSCRIPTVALUE(shape, QString, setShape);
+
+    // Material
     COPY_PROPERTY_FROM_QSCRIPTVALUE(materialURL, QString, setMaterialURL);
     COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(materialMappingMode, MaterialMappingMode);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(priority, quint16, setPriority);
@@ -1824,128 +1970,18 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool
     COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingRot, float, setMaterialMappingRot);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(materialData, QString, setMaterialData);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(materialRepeat, bool, setMaterialRepeat);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(isVisibleInSecondaryCamera, bool, setIsVisibleInSecondaryCamera);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(particleSpin, float, setParticleSpin);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(spinSpread, float, setSpinSpread);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(spinStart, float, setSpinStart);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(spinFinish, float, setSpinFinish);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(rotateWithEntity, bool, setRotateWithEntity);
-
-    // Certifiable Properties
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemDescription, QString, setItemDescription);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemCategories, QString, setItemCategories);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemArtist, QString, setItemArtist);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(itemLicense, QString, setItemLicense);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(limitedRun, quint32, setLimitedRun);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(editionNumber, quint32, setEditionNumber);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(entityInstanceNumber, quint32, setEntityInstanceNumber);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(certificateID, QString, setCertificateID);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(staticCertificateVersion, quint32, setStaticCertificateVersion);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionSoundURL, QString, setCollisionSoundURL);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(hazeMode, HazeMode);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(keyLightMode, KeyLightMode);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(ambientLightMode, AmbientLightMode);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(skyboxMode, SkyboxMode);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(bloomMode, BloomMode);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(sourceUrl, QString, setSourceUrl);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, vec3, setVoxelVolumeSize);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelData, QByteArray, setVoxelData);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelSurfaceStyle, uint16_t, setVoxelSurfaceStyle);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(lineWidth, float, setLineWidth);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(linePoints, qVectorVec3, setLinePoints);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(href, QString, setHref);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(description, QString, setDescription);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(billboardMode, BillboardMode);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(actionData, QByteArray, setActionData);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(normals, qVectorVec3, setNormals);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeColors, qVectorVec3, setStrokeColors);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeWidths, qVectorFloat, setStrokeWidths);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(isUVModeStretch, bool, setIsUVModeStretch);
 
+    // Image
     COPY_PROPERTY_FROM_QSCRIPTVALUE(imageURL, QString, setImageURL);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(emissive, bool, setEmissive);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(keepAspectRatio, bool, setKeepAspectRatio);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(subImage, QRect, setSubImage);
 
+    // Grid
     COPY_PROPERTY_FROM_QSCRIPTVALUE(followCamera, bool, setFollowCamera);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(majorGridEvery, uint32_t, setMajorGridEvery);
     COPY_PROPERTY_FROM_QSCRIPTVALUE(minorGridEvery, float, setMinorGridEvery);
 
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(textAlpha, float, setTextAlpha);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundAlpha, float, setBackgroundAlpha);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(leftMargin, float, setLeftMargin);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(rightMargin, float, setRightMargin);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(topMargin, float, setTopMargin);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(bottomMargin, float, setBottomMargin);
-
-    if (!honorReadOnly) {
-        // this is used by the json reader to set things that we don't want javascript to able to affect.
-        COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(created, QDateTime, setCreated, [this]() {
-            auto result = QDateTime::fromMSecsSinceEpoch(_created / 1000, Qt::UTC); // usec per msec
-            return result;
-        });
-        // TODO: expose this to QScriptValue for JSON saves?
-        //COPY_PROPERTY_FROM_QSCRIPTVALUE(simulationOwner, ???, setSimulatorPriority);
-    }
-
-    _animation.copyFromScriptValue(object, _defaultSettings);
-    _keyLight.copyFromScriptValue(object, _defaultSettings);
-    _ambientLight.copyFromScriptValue(object, _defaultSettings);
-    _skybox.copyFromScriptValue(object, _defaultSettings);
-    _haze.copyFromScriptValue(object, _defaultSettings);
-    _bloom.copyFromScriptValue(object, _defaultSettings);
-    _grab.copyFromScriptValue(object, _defaultSettings);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(xTextureURL, QString, setXTextureURL);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(yTextureURL, QString, setYTextureURL);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(zTextureURL, QString, setZTextureURL);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(xNNeighborID, EntityItemID, setXNNeighborID);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(yNNeighborID, EntityItemID, setYNNeighborID);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(zNNeighborID, EntityItemID, setZNNeighborID);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(xPNeighborID, EntityItemID, setXPNeighborID);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(yPNeighborID, EntityItemID, setYPNeighborID);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(zPNeighborID, EntityItemID, setZPNeighborID);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(parentID, QUuid, setParentID);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(parentJointIndex, quint16, setParentJointIndex);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(queryAACube, AACube, setQueryAACube);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, vec3, setLocalPosition);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(localRotation, quat, setLocalRotation);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, vec3, setLocalVelocity);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, vec3, setLocalAngularVelocity);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, vec3, setLocalDimensions);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotationsSet, qVectorBool, setJointRotationsSet);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotations, qVectorQuat, setJointRotations);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(jointTranslationsSet, qVectorBool, setJointTranslationsSet);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(jointTranslations, qVectorVec3, setJointTranslations);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(shape, QString, setShape);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(flyingAllowed, bool, setFlyingAllowed);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(ghostingAllowed, bool, setGhostingAllowed);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(filterURL, QString, setFilterURL);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(entityHostType, EntityHostType);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(owningAvatarID, QUuid, setOwningAvatarID);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(dpi, uint16_t, setDPI);
-
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneable, bool, setCloneable);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneLifetime, float, setCloneLifetime);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneLimit, float, setCloneLimit);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneDynamic, bool, setCloneDynamic);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneAvatarEntity, bool, setCloneAvatarEntity);
-    COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneOriginID, QUuid, setCloneOriginID);
-
     // Handle conversions from old 'textures' property to "imageURL"
     {
         QScriptValue V = object.property("textures");
@@ -1991,53 +2027,87 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool
 }
 
 void EntityItemProperties::merge(const EntityItemProperties& other) {
-    COPY_PROPERTY_IF_CHANGED(lastEditedBy);
+    // Core
+    COPY_PROPERTY_IF_CHANGED(simulationOwner);
+    COPY_PROPERTY_IF_CHANGED(visible);
+    COPY_PROPERTY_IF_CHANGED(name);
+    COPY_PROPERTY_IF_CHANGED(locked);
+    COPY_PROPERTY_IF_CHANGED(userData);
+    COPY_PROPERTY_IF_CHANGED(href);
+    COPY_PROPERTY_IF_CHANGED(description);
     COPY_PROPERTY_IF_CHANGED(position);
     COPY_PROPERTY_IF_CHANGED(dimensions);
     COPY_PROPERTY_IF_CHANGED(rotation);
+    COPY_PROPERTY_IF_CHANGED(registrationPoint);
+    COPY_PROPERTY_IF_CHANGED(created);
+    COPY_PROPERTY_IF_CHANGED(lastEditedBy);
+    COPY_PROPERTY_IF_CHANGED(entityHostType);
+    COPY_PROPERTY_IF_CHANGED(owningAvatarID);
+    COPY_PROPERTY_IF_CHANGED(parentID);
+    COPY_PROPERTY_IF_CHANGED(parentJointIndex);
+    COPY_PROPERTY_IF_CHANGED(queryAACube);
+    COPY_PROPERTY_IF_CHANGED(canCastShadow);
+    COPY_PROPERTY_IF_CHANGED(isVisibleInSecondaryCamera);
+    _grab.merge(other._grab);
+
+    // Physics
     COPY_PROPERTY_IF_CHANGED(density);
     COPY_PROPERTY_IF_CHANGED(velocity);
+    COPY_PROPERTY_IF_CHANGED(angularVelocity);
     COPY_PROPERTY_IF_CHANGED(gravity);
     COPY_PROPERTY_IF_CHANGED(acceleration);
     COPY_PROPERTY_IF_CHANGED(damping);
+    COPY_PROPERTY_IF_CHANGED(angularDamping);
     COPY_PROPERTY_IF_CHANGED(restitution);
     COPY_PROPERTY_IF_CHANGED(friction);
     COPY_PROPERTY_IF_CHANGED(lifetime);
-    COPY_PROPERTY_IF_CHANGED(script);
-    COPY_PROPERTY_IF_CHANGED(scriptTimestamp);
-    COPY_PROPERTY_IF_CHANGED(registrationPoint);
-    COPY_PROPERTY_IF_CHANGED(angularVelocity);
-    COPY_PROPERTY_IF_CHANGED(angularDamping);
-    COPY_PROPERTY_IF_CHANGED(visible);
-    COPY_PROPERTY_IF_CHANGED(canCastShadow);
-    COPY_PROPERTY_IF_CHANGED(color);
-    COPY_PROPERTY_IF_CHANGED(colorSpread);
-    COPY_PROPERTY_IF_CHANGED(colorStart);
-    COPY_PROPERTY_IF_CHANGED(colorFinish);
-    COPY_PROPERTY_IF_CHANGED(alpha);
-    COPY_PROPERTY_IF_CHANGED(alphaSpread);
-    COPY_PROPERTY_IF_CHANGED(alphaStart);
-    COPY_PROPERTY_IF_CHANGED(alphaFinish);
-    COPY_PROPERTY_IF_CHANGED(emitterShouldTrail);
-    COPY_PROPERTY_IF_CHANGED(modelURL);
-    COPY_PROPERTY_IF_CHANGED(compoundShapeURL);
-    COPY_PROPERTY_IF_CHANGED(localRenderAlpha);
     COPY_PROPERTY_IF_CHANGED(collisionless);
     COPY_PROPERTY_IF_CHANGED(collisionMask);
     COPY_PROPERTY_IF_CHANGED(dynamic);
-    COPY_PROPERTY_IF_CHANGED(isSpotlight);
-    COPY_PROPERTY_IF_CHANGED(intensity);
-    COPY_PROPERTY_IF_CHANGED(falloffRadius);
-    COPY_PROPERTY_IF_CHANGED(exponent);
-    COPY_PROPERTY_IF_CHANGED(cutoff);
-    COPY_PROPERTY_IF_CHANGED(locked);
-    COPY_PROPERTY_IF_CHANGED(textures);
-    COPY_PROPERTY_IF_CHANGED(userData);
-    COPY_PROPERTY_IF_CHANGED(text);
-    COPY_PROPERTY_IF_CHANGED(lineHeight);
-    COPY_PROPERTY_IF_CHANGED(textColor);
-    COPY_PROPERTY_IF_CHANGED(backgroundColor);
+    COPY_PROPERTY_IF_CHANGED(collisionSoundURL);
+    COPY_PROPERTY_IF_CHANGED(actionData);
+
+    // Cloning
+    COPY_PROPERTY_IF_CHANGED(cloneable);
+    COPY_PROPERTY_IF_CHANGED(cloneLifetime);
+    COPY_PROPERTY_IF_CHANGED(cloneLimit);
+    COPY_PROPERTY_IF_CHANGED(cloneDynamic);
+    COPY_PROPERTY_IF_CHANGED(cloneAvatarEntity);
+    COPY_PROPERTY_IF_CHANGED(cloneOriginID);
+
+    // Scripts
+    COPY_PROPERTY_IF_CHANGED(script);
+    COPY_PROPERTY_IF_CHANGED(scriptTimestamp);
+    COPY_PROPERTY_IF_CHANGED(serverScripts);
+
+    // Certifiable Properties
+    COPY_PROPERTY_IF_CHANGED(itemName);
+    COPY_PROPERTY_IF_CHANGED(itemDescription);
+    COPY_PROPERTY_IF_CHANGED(itemCategories);
+    COPY_PROPERTY_IF_CHANGED(itemArtist);
+    COPY_PROPERTY_IF_CHANGED(itemLicense);
+    COPY_PROPERTY_IF_CHANGED(limitedRun);
+    COPY_PROPERTY_IF_CHANGED(marketplaceID);
+    COPY_PROPERTY_IF_CHANGED(editionNumber);
+    COPY_PROPERTY_IF_CHANGED(entityInstanceNumber);
+    COPY_PROPERTY_IF_CHANGED(certificateID);
+    COPY_PROPERTY_IF_CHANGED(staticCertificateVersion);
+
+    // Local props for scripts
+    COPY_PROPERTY_IF_CHANGED(localPosition);
+    COPY_PROPERTY_IF_CHANGED(localRotation);
+    COPY_PROPERTY_IF_CHANGED(localVelocity);
+    COPY_PROPERTY_IF_CHANGED(localAngularVelocity);
+    COPY_PROPERTY_IF_CHANGED(localDimensions);
+
+    // Common
     COPY_PROPERTY_IF_CHANGED(shapeType);
+    COPY_PROPERTY_IF_CHANGED(compoundShapeURL);
+    COPY_PROPERTY_IF_CHANGED(color);
+    COPY_PROPERTY_IF_CHANGED(alpha);
+    COPY_PROPERTY_IF_CHANGED(textures);
+
+    // Particles
     COPY_PROPERTY_IF_CHANGED(maxParticles);
     COPY_PROPERTY_IF_CHANGED(lifespan);
     COPY_PROPERTY_IF_CHANGED(isEmitting);
@@ -2057,117 +2127,112 @@ void EntityItemProperties::merge(const EntityItemProperties& other) {
     COPY_PROPERTY_IF_CHANGED(radiusSpread);
     COPY_PROPERTY_IF_CHANGED(radiusStart);
     COPY_PROPERTY_IF_CHANGED(radiusFinish);
+    COPY_PROPERTY_IF_CHANGED(colorSpread);
+    COPY_PROPERTY_IF_CHANGED(colorStart);
+    COPY_PROPERTY_IF_CHANGED(colorFinish);
+    COPY_PROPERTY_IF_CHANGED(alphaSpread);
+    COPY_PROPERTY_IF_CHANGED(alphaStart);
+    COPY_PROPERTY_IF_CHANGED(alphaFinish);
+    COPY_PROPERTY_IF_CHANGED(emitterShouldTrail);
     COPY_PROPERTY_IF_CHANGED(particleSpin);
     COPY_PROPERTY_IF_CHANGED(spinSpread);
     COPY_PROPERTY_IF_CHANGED(spinStart);
     COPY_PROPERTY_IF_CHANGED(spinFinish);
     COPY_PROPERTY_IF_CHANGED(rotateWithEntity);
 
-    COPY_PROPERTY_IF_CHANGED(imageURL);
-    COPY_PROPERTY_IF_CHANGED(emissive);
-    COPY_PROPERTY_IF_CHANGED(keepAspectRatio);
-    COPY_PROPERTY_IF_CHANGED(subImage);
+    // Model
+    COPY_PROPERTY_IF_CHANGED(modelURL);
+    COPY_PROPERTY_IF_CHANGED(jointRotationsSet);
+    COPY_PROPERTY_IF_CHANGED(jointRotations);
+    COPY_PROPERTY_IF_CHANGED(jointTranslationsSet);
+    COPY_PROPERTY_IF_CHANGED(jointTranslations);
+    COPY_PROPERTY_IF_CHANGED(relayParentJoints);
+    _animation.merge(other._animation);
 
-    COPY_PROPERTY_IF_CHANGED(followCamera);
-    COPY_PROPERTY_IF_CHANGED(majorGridEvery);
-    COPY_PROPERTY_IF_CHANGED(minorGridEvery);
+    // Light
+    COPY_PROPERTY_IF_CHANGED(isSpotlight);
+    COPY_PROPERTY_IF_CHANGED(intensity);
+    COPY_PROPERTY_IF_CHANGED(exponent);
+    COPY_PROPERTY_IF_CHANGED(cutoff);
+    COPY_PROPERTY_IF_CHANGED(falloffRadius);
 
+    // Text
+    COPY_PROPERTY_IF_CHANGED(text);
+    COPY_PROPERTY_IF_CHANGED(lineHeight);
+    COPY_PROPERTY_IF_CHANGED(textColor);
     COPY_PROPERTY_IF_CHANGED(textAlpha);
+    COPY_PROPERTY_IF_CHANGED(backgroundColor);
     COPY_PROPERTY_IF_CHANGED(backgroundAlpha);
+    COPY_PROPERTY_IF_CHANGED(billboardMode);
     COPY_PROPERTY_IF_CHANGED(leftMargin);
     COPY_PROPERTY_IF_CHANGED(rightMargin);
     COPY_PROPERTY_IF_CHANGED(topMargin);
     COPY_PROPERTY_IF_CHANGED(bottomMargin);
 
-    // Certifiable Properties
-    COPY_PROPERTY_IF_CHANGED(itemName);
-    COPY_PROPERTY_IF_CHANGED(itemDescription);
-    COPY_PROPERTY_IF_CHANGED(itemCategories);
-    COPY_PROPERTY_IF_CHANGED(itemArtist);
-    COPY_PROPERTY_IF_CHANGED(itemLicense);
-    COPY_PROPERTY_IF_CHANGED(limitedRun);
-    COPY_PROPERTY_IF_CHANGED(marketplaceID);
-    COPY_PROPERTY_IF_CHANGED(editionNumber);
-    COPY_PROPERTY_IF_CHANGED(entityInstanceNumber);
-    COPY_PROPERTY_IF_CHANGED(certificateID);
-    COPY_PROPERTY_IF_CHANGED(staticCertificateVersion);
-
-    COPY_PROPERTY_IF_CHANGED(name);
-    COPY_PROPERTY_IF_CHANGED(collisionSoundURL);
-
-    COPY_PROPERTY_IF_CHANGED(hazeMode);
-    COPY_PROPERTY_IF_CHANGED(keyLightMode);
-    COPY_PROPERTY_IF_CHANGED(ambientLightMode);
-    COPY_PROPERTY_IF_CHANGED(skyboxMode);
-    COPY_PROPERTY_IF_CHANGED(bloomMode);
-
-    COPY_PROPERTY_IF_CHANGED(sourceUrl);
-    COPY_PROPERTY_IF_CHANGED(voxelVolumeSize);
-    COPY_PROPERTY_IF_CHANGED(voxelData);
-    COPY_PROPERTY_IF_CHANGED(voxelSurfaceStyle);
-    COPY_PROPERTY_IF_CHANGED(lineWidth);
-    COPY_PROPERTY_IF_CHANGED(linePoints);
-    COPY_PROPERTY_IF_CHANGED(href);
-    COPY_PROPERTY_IF_CHANGED(description);
-    COPY_PROPERTY_IF_CHANGED(billboardMode);
-    COPY_PROPERTY_IF_CHANGED(actionData);
-    COPY_PROPERTY_IF_CHANGED(normals);
-    COPY_PROPERTY_IF_CHANGED(strokeColors);
-    COPY_PROPERTY_IF_CHANGED(strokeWidths);
-    COPY_PROPERTY_IF_CHANGED(isUVModeStretch);
-    COPY_PROPERTY_IF_CHANGED(created);
-
-    _animation.merge(other._animation);
+    // Zone
     _keyLight.merge(other._keyLight);
     _ambientLight.merge(other._ambientLight);
     _skybox.merge(other._skybox);
     _haze.merge(other._haze);
     _bloom.merge(other._bloom);
-    _grab.merge(other._grab);
+    COPY_PROPERTY_IF_CHANGED(flyingAllowed);
+    COPY_PROPERTY_IF_CHANGED(ghostingAllowed);
+    COPY_PROPERTY_IF_CHANGED(filterURL);
+    COPY_PROPERTY_IF_CHANGED(keyLightMode);
+    COPY_PROPERTY_IF_CHANGED(ambientLightMode);
+    COPY_PROPERTY_IF_CHANGED(skyboxMode);
+    COPY_PROPERTY_IF_CHANGED(hazeMode);
+    COPY_PROPERTY_IF_CHANGED(bloomMode);
 
+    // Polyvox
+    COPY_PROPERTY_IF_CHANGED(voxelVolumeSize);
+    COPY_PROPERTY_IF_CHANGED(voxelData);
+    COPY_PROPERTY_IF_CHANGED(voxelSurfaceStyle);
     COPY_PROPERTY_IF_CHANGED(xTextureURL);
     COPY_PROPERTY_IF_CHANGED(yTextureURL);
     COPY_PROPERTY_IF_CHANGED(zTextureURL);
-
     COPY_PROPERTY_IF_CHANGED(xNNeighborID);
     COPY_PROPERTY_IF_CHANGED(yNNeighborID);
     COPY_PROPERTY_IF_CHANGED(zNNeighborID);
-
     COPY_PROPERTY_IF_CHANGED(xPNeighborID);
     COPY_PROPERTY_IF_CHANGED(yPNeighborID);
     COPY_PROPERTY_IF_CHANGED(zPNeighborID);
 
-    COPY_PROPERTY_IF_CHANGED(parentID);
-    COPY_PROPERTY_IF_CHANGED(parentJointIndex);
-    COPY_PROPERTY_IF_CHANGED(queryAACube);
-
-    COPY_PROPERTY_IF_CHANGED(localPosition);
-    COPY_PROPERTY_IF_CHANGED(localRotation);
-    COPY_PROPERTY_IF_CHANGED(localVelocity);
-    COPY_PROPERTY_IF_CHANGED(localAngularVelocity);
-    COPY_PROPERTY_IF_CHANGED(localDimensions);
-
-    COPY_PROPERTY_IF_CHANGED(jointRotationsSet);
-    COPY_PROPERTY_IF_CHANGED(jointRotations);
-    COPY_PROPERTY_IF_CHANGED(jointTranslationsSet);
-    COPY_PROPERTY_IF_CHANGED(jointTranslations);
-    COPY_PROPERTY_IF_CHANGED(shape);
-
-    COPY_PROPERTY_IF_CHANGED(flyingAllowed);
-    COPY_PROPERTY_IF_CHANGED(ghostingAllowed);
-    COPY_PROPERTY_IF_CHANGED(filterURL);
-
-    COPY_PROPERTY_IF_CHANGED(entityHostType);
-    COPY_PROPERTY_IF_CHANGED(owningAvatarID);
-
+    // Web
+    COPY_PROPERTY_IF_CHANGED(sourceUrl);
     COPY_PROPERTY_IF_CHANGED(dpi);
 
-    COPY_PROPERTY_IF_CHANGED(cloneable);
-    COPY_PROPERTY_IF_CHANGED(cloneLifetime);
-    COPY_PROPERTY_IF_CHANGED(cloneLimit);
-    COPY_PROPERTY_IF_CHANGED(cloneDynamic);
-    COPY_PROPERTY_IF_CHANGED(cloneAvatarEntity);
-    COPY_PROPERTY_IF_CHANGED(cloneOriginID);
+    // Polyline
+    COPY_PROPERTY_IF_CHANGED(linePoints);
+    COPY_PROPERTY_IF_CHANGED(strokeWidths);
+    COPY_PROPERTY_IF_CHANGED(normals);
+    COPY_PROPERTY_IF_CHANGED(strokeColors);
+    COPY_PROPERTY_IF_CHANGED(isUVModeStretch);
+
+    // Shape
+    COPY_PROPERTY_IF_CHANGED(shape);
+
+    // Material
+    COPY_PROPERTY_IF_CHANGED(materialURL);
+    COPY_PROPERTY_IF_CHANGED(materialMappingMode);
+    COPY_PROPERTY_IF_CHANGED(priority);
+    COPY_PROPERTY_IF_CHANGED(parentMaterialName);
+    COPY_PROPERTY_IF_CHANGED(materialMappingPos);
+    COPY_PROPERTY_IF_CHANGED(materialMappingScale);
+    COPY_PROPERTY_IF_CHANGED(materialMappingRot);
+    COPY_PROPERTY_IF_CHANGED(materialData);
+    COPY_PROPERTY_IF_CHANGED(materialRepeat);
+
+    // Image
+    COPY_PROPERTY_IF_CHANGED(imageURL);
+    COPY_PROPERTY_IF_CHANGED(emissive);
+    COPY_PROPERTY_IF_CHANGED(keepAspectRatio);
+    COPY_PROPERTY_IF_CHANGED(subImage);
+
+    // Grid
+    COPY_PROPERTY_IF_CHANGED(followCamera);
+    COPY_PROPERTY_IF_CHANGED(majorGridEvery);
+    COPY_PROPERTY_IF_CHANGED(minorGridEvery);
 
     _lastEdited = usecTimestampNow();
 }
@@ -2206,63 +2271,118 @@ QScriptValue EntityItemProperties::entityPropertyFlagsToScriptValue(QScriptEngin
 }
 
 static QHash<QString, EntityPropertyList> _propertyStringsToEnums;
+static QHash<EntityPropertyList, QString> _enumsToPropertyStrings;
 
 void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue& object, EntityPropertyFlags& flags) {
 
     static std::once_flag initMap;
 
     std::call_once(initMap, []() {
+        // Core
+        ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner);
         ADD_PROPERTY_TO_MAP(PROP_VISIBLE, Visible, visible, bool);
-        ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool);
+        ADD_PROPERTY_TO_MAP(PROP_NAME, Name, name, QString);
+        ADD_PROPERTY_TO_MAP(PROP_LOCKED, Locked, locked, bool);
+        ADD_PROPERTY_TO_MAP(PROP_USER_DATA, UserData, userData, QString);
+        ADD_PROPERTY_TO_MAP(PROP_HREF, Href, href, QString);
+        ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, Description, description, QString);
         ADD_PROPERTY_TO_MAP(PROP_POSITION, Position, position, vec3);
         ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, Dimensions, dimensions, vec3);
         ADD_PROPERTY_TO_MAP(PROP_ROTATION, Rotation, rotation, quat);
+        ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, vec3);
+        //ADD_PROPERTY_TO_MAP(PROP_CREATED, Created, created, quint64);                               // not yet handled
+        //ADD_PROPERTY_TO_MAP(PROP_LAST_EDITED_BY, LastEditedBy, lastEditedBy, QUuid);                // not yet handled
+        ADD_PROPERTY_TO_MAP(PROP_ENTITY_HOST_TYPE, EntityHostType, entityHostType, entity::HostType);
+        ADD_PROPERTY_TO_MAP(PROP_OWNING_AVATAR_ID, OwningAvatarID, owningAvatarID, QUuid);
+        ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, ParentID, parentID, QUuid);
+        ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, ParentJointIndex, parentJointIndex, uint16_t);
+        //ADD_PROPERTY_TO_MAP(PROP_QUERY_AA_CUBE, QueryAACube, queryAACube, AACube);                  // not yet handled
+        ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool);
+        ADD_PROPERTY_TO_MAP(PROP_VISIBLE_IN_SECONDARY_CAMERA, IsVisibleInSecondaryCamera, isVisibleInSecondaryCamera, bool);
+        { // Grab
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_GRABBABLE, Grab, grab, Grabbable, grabbable);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_KINEMATIC, Grab, grab, GrabKinematic, grabKinematic);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_FOLLOWS_CONTROLLER, Grab, grab, GrabFollowsController, grabFollowsController);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_TRIGGERABLE, Grab, grab, Triggerable, triggerable);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE, Grab, grab, Equippable, equippable);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_DELEGATE_TO_PARENT, Grab, grab, GrabDelegateToParent, grabDelegateToParent);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_LEFT_EQUIPPABLE_POSITION_OFFSET, Grab, grab,
+                                      EquippableLeftPosition, equippableLeftPosition);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_LEFT_EQUIPPABLE_ROTATION_OFFSET, Grab, grab,
+                                      EquippableLeftRotation, equippableLeftRotation);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_RIGHT_EQUIPPABLE_POSITION_OFFSET, Grab, grab,
+                                      EquippableRightPosition, equippableRightPosition);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_RIGHT_EQUIPPABLE_ROTATION_OFFSET, Grab, grab,
+                                      EquippableRightRotation, equippableRightRotation);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_URL, Grab, grab,
+                                      EquippableIndicatorURL, equippableIndicatorURL);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_SCALE, Grab, grab,
+                                      EquippableIndicatorScale, equippableIndicatorScale);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_OFFSET, Grab, grab,
+                                      EquippableIndicatorOffset, equippableIndicatorOffset);
+        }
+
+        // Physics
         ADD_PROPERTY_TO_MAP(PROP_DENSITY, Density, density, float);
         ADD_PROPERTY_TO_MAP(PROP_VELOCITY, Velocity, velocity, vec3);
+        ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, vec3);
         ADD_PROPERTY_TO_MAP(PROP_GRAVITY, Gravity, gravity, vec3);
         ADD_PROPERTY_TO_MAP(PROP_ACCELERATION, Acceleration, acceleration, vec3);
         ADD_PROPERTY_TO_MAP(PROP_DAMPING, Damping, damping, float);
+        ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float);
         ADD_PROPERTY_TO_MAP(PROP_RESTITUTION, Restitution, restitution, float);
         ADD_PROPERTY_TO_MAP(PROP_FRICTION, Friction, friction, float);
         ADD_PROPERTY_TO_MAP(PROP_LIFETIME, Lifetime, lifetime, float);
-        ADD_PROPERTY_TO_MAP(PROP_SCRIPT, Script, script, QString);
-        ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64);
-        ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString);
-        ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString);
-        ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, u8vec3Color);
-        ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color);
-        ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, vec3Color);
-        ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3Color);
-        ADD_PROPERTY_TO_MAP(PROP_ALPHA, Alpha, alpha, float);
-        ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float);
-        ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, AlphaStart, alphaStart, float);
-        ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float);
-        ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool);
-        ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, ModelURL, modelURL, QString);
-        ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString);
-        ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, vec3);
-        ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, vec3);
-        ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float);
         ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, Collisionless, collisionless, bool);
         ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, unused, ignoreForCollisions, unused); // legacy support
         ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collisionMask, unused);
         ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collidesWith, unused);
         ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, collisionsWillMove, unused); // legacy support
         ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, dynamic, unused);
-        ADD_PROPERTY_TO_MAP(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool);
-        ADD_PROPERTY_TO_MAP(PROP_INTENSITY, Intensity, intensity, float);
-        ADD_PROPERTY_TO_MAP(PROP_FALLOFF_RADIUS, FalloffRadius, falloffRadius, float);
-        ADD_PROPERTY_TO_MAP(PROP_EXPONENT, Exponent, exponent, float);
-        ADD_PROPERTY_TO_MAP(PROP_CUTOFF, Cutoff, cutoff, float);
-        ADD_PROPERTY_TO_MAP(PROP_LOCKED, Locked, locked, bool);
-        ADD_PROPERTY_TO_MAP(PROP_TEXTURES, Textures, textures, QString);
-        ADD_PROPERTY_TO_MAP(PROP_USER_DATA, UserData, userData, QString);
-        ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner);
-        ADD_PROPERTY_TO_MAP(PROP_TEXT, Text, text, QString);
-        ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, LineHeight, lineHeight, float);
-        ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, u8vec3Color);
-        ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3Color);
+        ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString);
+        ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, ActionData, actionData, QByteArray);
+
+        // Cloning
+        ADD_PROPERTY_TO_MAP(PROP_CLONEABLE, Cloneable, cloneable, bool);
+        ADD_PROPERTY_TO_MAP(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float);
+        ADD_PROPERTY_TO_MAP(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float);
+        ADD_PROPERTY_TO_MAP(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool);
+        ADD_PROPERTY_TO_MAP(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool);
+        ADD_PROPERTY_TO_MAP(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid);
+
+        // Scripts
+        ADD_PROPERTY_TO_MAP(PROP_SCRIPT, Script, script, QString);
+        ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64);
+        ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString);
+
+        // Certifiable Properties
+        ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString);
+        ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString);
+        ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString);
+        ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString);
+        ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString);
+        ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32);
+        ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString);
+        ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32);
+        ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32);
+        ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString);
+        ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32);
+
+        // Local script props
+        ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, vec3);
+        ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat);
+        ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, vec3);
+        ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, vec3);
+        ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, vec3);
+
+        // Common
         ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType);
+        ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString);
+        ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, u8vec3Color);
+        ADD_PROPERTY_TO_MAP(PROP_ALPHA, Alpha, alpha, float);
+        ADD_PROPERTY_TO_MAP(PROP_TEXTURES, Textures, textures, QString);
+
+        // Particles
         ADD_PROPERTY_TO_MAP(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32);
         ADD_PROPERTY_TO_MAP(PROP_LIFESPAN, Lifespan, lifespan, float);
         ADD_PROPERTY_TO_MAP(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool);
@@ -2282,58 +2402,108 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue
         ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float);
         ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, RadiusStart, radiusStart, float);
         ADD_PROPERTY_TO_MAP(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float);
-
-        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_URL, MaterialURL, materialURL, QString);
-        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode);
-        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, Priority, priority, quint16);
-        ADD_PROPERTY_TO_MAP(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString);
-        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, vec2);
-        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, vec2);
-        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float);
-        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, MaterialData, materialData, QString);
-        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_REPEAT, MaterialRepeat, materialRepeat, bool);
-
-        ADD_PROPERTY_TO_MAP(PROP_VISIBLE_IN_SECONDARY_CAMERA, IsVisibleInSecondaryCamera, isVisibleInSecondaryCamera, bool);
-
+        ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color);
+        ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, vec3Color);
+        ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3Color);
+        ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float);
+        ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, AlphaStart, alphaStart, float);
+        ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float);
+        ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool);
         ADD_PROPERTY_TO_MAP(PROP_PARTICLE_SPIN, ParticleSpin, particleSpin, float);
         ADD_PROPERTY_TO_MAP(PROP_SPIN_SPREAD, SpinSpread, spinSpread, float);
         ADD_PROPERTY_TO_MAP(PROP_SPIN_START, SpinStart, spinStart, float);
         ADD_PROPERTY_TO_MAP(PROP_SPIN_FINISH, SpinFinish, spinFinish, float);
         ADD_PROPERTY_TO_MAP(PROP_PARTICLE_ROTATE_WITH_ENTITY, RotateWithEntity, rotateWithEntity, float);
 
-        // Certifiable Properties
-        ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString);
-        ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString);
-        ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString);
-        ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString);
-        ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString);
-        ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32);
-        ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString);
-        ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32);
-        ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32);
-        ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString);
-        ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32);
+        // Model
+        ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, ModelURL, modelURL, QString);
+        ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector<bool>);
+        ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector<quat>);
+        ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector<bool>);
+        ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector<vec3>);
+        ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool);
+        { // Animation
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_URL, Animation, animation, URL, url);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_ALLOW_TRANSLATION, Animation, animation, AllowTranslation, allowTranslation);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, Animation, animation, FPS, fps);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, Animation, animation, Running, running);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold);
+        }
 
-        ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, u8vec3Color);
-        ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float);
-        ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, vec3);
-        ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLightCastShadows, keyLightCastShadows, bool);
+        // Light
+        ADD_PROPERTY_TO_MAP(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool);
+        ADD_PROPERTY_TO_MAP(PROP_INTENSITY, Intensity, intensity, float);
+        ADD_PROPERTY_TO_MAP(PROP_EXPONENT, Exponent, exponent, float);
+        ADD_PROPERTY_TO_MAP(PROP_CUTOFF, Cutoff, cutoff, float);
+        ADD_PROPERTY_TO_MAP(PROP_FALLOFF_RADIUS, FalloffRadius, falloffRadius, float);
 
+        // Text
+        ADD_PROPERTY_TO_MAP(PROP_TEXT, Text, text, QString);
+        ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, LineHeight, lineHeight, float);
+        ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, u8vec3Color);
+        ADD_PROPERTY_TO_MAP(PROP_TEXT_ALPHA, TextAlpha, textAlpha, float);
+        ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3Color);
+        ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_ALPHA, BackgroundAlpha, backgroundAlpha, float);
+        ADD_PROPERTY_TO_MAP(PROP_BILLBOARD_MODE, BillboardMode, billboardMode, BillboardMode);
+        ADD_PROPERTY_TO_MAP(PROP_LEFT_MARGIN, LeftMargin, leftMargin, float);
+        ADD_PROPERTY_TO_MAP(PROP_RIGHT_MARGIN, RightMargin, rightMargin, float);
+        ADD_PROPERTY_TO_MAP(PROP_TOP_MARGIN, TopMargin, topMargin, float);
+        ADD_PROPERTY_TO_MAP(PROP_BOTTOM_MARGIN, BottomMargin, bottomMargin, float);
+
+        // Zone
+        { // Keylight
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLight, keyLight, Color, color);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLight, keyLight, Intensity, intensity);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLight, keylight, Direction, direction);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLight, keyLight, CastShadows, castShadows);
+        }
+        { // Ambient light
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_INTENSITY, AmbientLight, ambientLight, Intensity, intensity);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_URL, AmbientLight, ambientLight, URL, url);
+        }
+        { // Skybox
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, Skybox, skybox, URL, url);
+        }
+        { // Haze
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_RANGE, Haze, haze, HazeRange, hazeRange);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_COLOR, Haze, haze, HazeGlareColor, hazeGlareColor);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ENABLE_GLARE, Haze, haze, HazeEnableGlare, hazeEnableGlare);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_ANGLE, Haze, haze, HazeGlareAngle, hazeGlareAngle);
+
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ALTITUDE_EFFECT, Haze, haze, HazeAltitudeEffect, hazeAltitudeEfect);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_CEILING, Haze, haze, HazeCeiling, hazeCeiling);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BASE_REF, Haze, haze, HazeBaseRef, hazeBaseRef);
+
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BACKGROUND_BLEND, Haze, haze, HazeBackgroundBlend, hazeBackgroundBlend);
+
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ATTENUATE_KEYLIGHT, Haze, haze, HazeAttenuateKeyLight, hazeAttenuateKeyLight);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_RANGE, Haze, haze, HazeKeyLightRange, hazeKeyLightRange);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_ALTITUDE, Haze, haze, HazeKeyLightAltitude, hazeKeyLightAltitude);
+        }
+        { // Bloom
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_INTENSITY, Bloom, bloom, BloomIntensity, bloomIntensity);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_THRESHOLD, Bloom, bloom, BloomThreshold, bloomThreshold);
+            ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_SIZE, Bloom, bloom, BloomSize, bloomSize);
+        }
+        ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool);
+        ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool);
+        ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, FilterURL, filterURL, QString);
+        ADD_PROPERTY_TO_MAP(PROP_KEY_LIGHT_MODE, KeyLightMode, keyLightMode, uint32_t);
+        ADD_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_MODE, AmbientLightMode, ambientLightMode, uint32_t);
+        ADD_PROPERTY_TO_MAP(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, uint32_t);
+        ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t);
+        ADD_PROPERTY_TO_MAP(PROP_BLOOM_MODE, BloomMode, bloomMode, uint32_t);
+
+        // Polyvox
         ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, vec3);
         ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray);
         ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t);
-        ADD_PROPERTY_TO_MAP(PROP_NAME, Name, name, QString);
-        ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString);
-        ADD_PROPERTY_TO_MAP(PROP_LINE_WIDTH, LineWidth, lineWidth, float);
-        ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, LinePoints, linePoints, QVector<vec3>);
-        ADD_PROPERTY_TO_MAP(PROP_HREF, Href, href, QString);
-        ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, Description, description, QString);
-        ADD_PROPERTY_TO_MAP(PROP_BILLBOARD_MODE, BillboardMode, billboardMode, BillboardMode);
-        ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, ActionData, actionData, QByteArray);
-        ADD_PROPERTY_TO_MAP(PROP_NORMALS, Normals, normals, QVector<vec3>);
-        ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector<vec3>);
-        ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector<float>);
-        ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, QVector<float>);
         ADD_PROPERTY_TO_MAP(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString);
         ADD_PROPERTY_TO_MAP(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString);
         ADD_PROPERTY_TO_MAP(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString);
@@ -2344,132 +2514,54 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue
         ADD_PROPERTY_TO_MAP(PROP_Y_P_NEIGHBOR_ID, YPNeighborID, yPNeighborID, EntityItemID);
         ADD_PROPERTY_TO_MAP(PROP_Z_P_NEIGHBOR_ID, ZPNeighborID, zPNeighborID, EntityItemID);
 
-        ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, ParentID, parentID, QUuid);
-        ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, ParentJointIndex, parentJointIndex, uint16_t);
-
-        ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, vec3);
-        ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat);
-        ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, vec3);
-        ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, vec3);
-        ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, vec3);
-
-        ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector<bool>);
-        ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector<quat>);
-        ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector<bool>);
-        ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector<vec3>);
-        ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool);
-
-        ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString);
-
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_URL, Animation, animation, URL, url);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, Animation, animation, FPS, fps);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, Animation, animation, Running, running);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_ALLOW_TRANSLATION, Animation, animation, AllowTranslation, allowTranslation);
-
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, Skybox, skybox, URL, url);
-
-        ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool);
-        ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool);
-        ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, FilterURL, filterURL, QString);
-
-        ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t);
-
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_RANGE, Haze, haze, HazeRange, hazeRange);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_COLOR, Haze, haze, HazeGlareColor, hazeGlareColor);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ENABLE_GLARE, Haze, haze, HazeEnableGlare, hazeEnableGlare);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_ANGLE, Haze, haze, HazeGlareAngle, hazeGlareAngle);
-
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ALTITUDE_EFFECT, Haze, haze, HazeAltitudeEffect, hazeAltitudeEfect);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_CEILING, Haze, haze, HazeCeiling, hazeCeiling);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BASE_REF, Haze, haze, HazeBaseRef, hazeBaseRef);
-
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BACKGROUND_BLEND, Haze, haze, HazeBackgroundBlend, hazeBackgroundBlend);
-
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ATTENUATE_KEYLIGHT, Haze, haze, HazeAttenuateKeyLight, hazeAttenuateKeyLight);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_RANGE, Haze, haze, HazeKeyLightRange, hazeKeyLightRange);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_ALTITUDE, Haze, haze, HazeKeyLightAltitude, hazeKeyLightAltitude);
-
-        ADD_PROPERTY_TO_MAP(PROP_BLOOM_MODE, BloomMode, bloomMode, uint32_t);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_INTENSITY, Bloom, bloom, BloomIntensity, bloomIntensity);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_THRESHOLD, Bloom, bloom, BloomThreshold, bloomThreshold);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_SIZE, Bloom, bloom, BloomSize, bloomSize);
-
-        ADD_PROPERTY_TO_MAP(PROP_KEY_LIGHT_MODE, KeyLightMode, keyLightMode, uint32_t);
-        ADD_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_MODE, AmbientLightMode, ambientLightMode, uint32_t);
-        ADD_PROPERTY_TO_MAP(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, uint32_t);
-
+        // Web
+        ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString);
         ADD_PROPERTY_TO_MAP(PROP_DPI, DPI, dpi, uint16_t);
 
-        ADD_PROPERTY_TO_MAP(PROP_CLONEABLE, Cloneable, cloneable, bool);
-        ADD_PROPERTY_TO_MAP(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float);
-        ADD_PROPERTY_TO_MAP(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float);
-        ADD_PROPERTY_TO_MAP(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool);
-        ADD_PROPERTY_TO_MAP(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool);
-        ADD_PROPERTY_TO_MAP(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid);
+        // Polyline
+        ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, LinePoints, linePoints, QVector<vec3>);
+        ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector<float>);
+        ADD_PROPERTY_TO_MAP(PROP_STROKE_NORMALS, Normals, normals, QVector<vec3>);
+        ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector<vec3>);
+        ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, QVector<float>);
 
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_GRABBABLE, Grab, grab, Grabbable, grabbable);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_KINEMATIC, Grab, grab, GrabKinematic, grabKinematic);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_FOLLOWS_CONTROLLER, Grab, grab, GrabFollowsController, grabFollowsController);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_TRIGGERABLE, Grab, grab, Triggerable, triggerable);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE, Grab, grab, Equippable, equippable);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_DELEGATE_TO_PARENT, Grab, grab, GrabDelegateToParent, grabDelegateToParent);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_LEFT_EQUIPPABLE_POSITION_OFFSET, Grab, grab,
-                                  EquippableLeftPosition, equippableLeftPosition);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_LEFT_EQUIPPABLE_ROTATION_OFFSET, Grab, grab,
-                                  EquippableLeftRotation, equippableLeftRotation);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_RIGHT_EQUIPPABLE_POSITION_OFFSET, Grab, grab,
-                                  EquippableRightPosition, equippableRightPosition);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_RIGHT_EQUIPPABLE_ROTATION_OFFSET, Grab, grab,
-                                  EquippableRightRotation, equippableRightRotation);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_URL, Grab, grab,
-                                  EquippableIndicatorURL, equippableIndicatorURL);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_SCALE, Grab, grab,
-                                  EquippableIndicatorScale, equippableIndicatorScale);
-        ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_OFFSET, Grab, grab,
-                                  EquippableIndicatorOffset, equippableIndicatorOffset);
+        // Shape
+        ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString);
 
+        // Material
+        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_URL, MaterialURL, materialURL, QString);
+        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode);
+        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, Priority, priority, quint16);
+        ADD_PROPERTY_TO_MAP(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString);
+        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, vec2);
+        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, vec2);
+        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float);
+        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, MaterialData, materialData, QString);
+        ADD_PROPERTY_TO_MAP(PROP_MATERIAL_REPEAT, MaterialRepeat, materialRepeat, bool);
+
+        // Image
         ADD_PROPERTY_TO_MAP(PROP_IMAGE_URL, ImageURL, imageURL, QString);
         ADD_PROPERTY_TO_MAP(PROP_EMISSIVE, Emissive, emissive, bool);
         ADD_PROPERTY_TO_MAP(PROP_KEEP_ASPECT_RATIO, KeepAspectRatio, keepAspectRatio, bool);
         ADD_PROPERTY_TO_MAP(PROP_SUB_IMAGE, SubImage, subImage, QRect);
 
+        // Grid
         ADD_PROPERTY_TO_MAP(PROP_GRID_FOLLOW_CAMERA, FollowCamera, followCamera, bool);
         ADD_PROPERTY_TO_MAP(PROP_MAJOR_GRID_EVERY, MajorGridEvery, majorGridEvery, uint32_t);
         ADD_PROPERTY_TO_MAP(PROP_MINOR_GRID_EVERY, MinorGridEvery, minorGridEvery, float);
-
-        ADD_PROPERTY_TO_MAP(PROP_TEXT_ALPHA, TextAlpha, textAlpha, float);
-        ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_ALPHA, BackgroundAlpha, backgroundAlpha, float);
-        ADD_PROPERTY_TO_MAP(PROP_LEFT_MARGIN, LeftMargin, leftMargin, float);
-        ADD_PROPERTY_TO_MAP(PROP_RIGHT_MARGIN, RightMargin, rightMargin, float);
-        ADD_PROPERTY_TO_MAP(PROP_TOP_MARGIN, TopMargin, topMargin, float);
-        ADD_PROPERTY_TO_MAP(PROP_BOTTOM_MARGIN, BottomMargin, bottomMargin, float);
-
-        ADD_PROPERTY_TO_MAP(PROP_OWNING_AVATAR_ID, OwningAvatarID, owningAvatarID, QUuid);
-
-        // FIXME - these are not yet handled
-        //ADD_PROPERTY_TO_MAP(PROP_CREATED, Created, created, quint64);
-
     });
 
     if (object.isString()) {
-        // TODO: figure out how to do this without a double lookup in the map
-        if (_propertyStringsToEnums.contains(object.toString())) {
-            flags << _propertyStringsToEnums[object.toString()];
+        auto enumIter = _propertyStringsToEnums.find(object.toString());
+        if (enumIter != _propertyStringsToEnums.end()) {
+            flags << enumIter.value();
         }
     } else if (object.isArray()) {
         quint32 length = object.property("length").toInt32();
         for (quint32 i = 0; i < length; i++) {
-            QString propertyName = object.property(i).toString();
-            // TODO: figure out how to do this without a double lookup in the map
-            if (_propertyStringsToEnums.contains(propertyName)) {
-                flags << _propertyStringsToEnums[propertyName];
+            auto enumIter = _propertyStringsToEnums.find(object.property(i).toString());
+            if (enumIter != _propertyStringsToEnums.end()) {
+                flags << enumIter.value();
             }
         }
     }
@@ -2575,84 +2667,81 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
             //      PROP_PAGED_PROPERTY,
             //      PROP_CUSTOM_PROPERTIES_INCLUDED,
 
+
             APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, properties._simulationOwner.toByteArray());
-            APPEND_ENTITY_PROPERTY(PROP_POSITION, properties.getPosition());
-            APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, properties.getDimensions());
-            APPEND_ENTITY_PROPERTY(PROP_ROTATION, properties.getRotation());
-            APPEND_ENTITY_PROPERTY(PROP_DENSITY, properties.getDensity());
-            APPEND_ENTITY_PROPERTY(PROP_VELOCITY, properties.getVelocity());
-            APPEND_ENTITY_PROPERTY(PROP_GRAVITY, properties.getGravity());
-            APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, properties.getAcceleration());
-            APPEND_ENTITY_PROPERTY(PROP_DAMPING, properties.getDamping());
-            APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, properties.getRestitution());
-            APPEND_ENTITY_PROPERTY(PROP_FRICTION, properties.getFriction());
-            APPEND_ENTITY_PROPERTY(PROP_LIFETIME, properties.getLifetime());
-            APPEND_ENTITY_PROPERTY(PROP_SCRIPT, properties.getScript());
-            APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, properties.getScriptTimestamp());
-            APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, properties.getServerScripts());
-            APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, properties.getRegistrationPoint());
-            APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, properties.getAngularVelocity());
-            APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, properties.getAngularDamping());
             APPEND_ENTITY_PROPERTY(PROP_VISIBLE, properties.getVisible());
-            APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, properties.getCanCastShadow());
-            APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, properties.getCollisionless());
-            APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, properties.getCollisionMask());
-            APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, properties.getDynamic());
+            APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName());
             APPEND_ENTITY_PROPERTY(PROP_LOCKED, properties.getLocked());
             APPEND_ENTITY_PROPERTY(PROP_USER_DATA, properties.getUserData());
             APPEND_ENTITY_PROPERTY(PROP_HREF, properties.getHref());
             APPEND_ENTITY_PROPERTY(PROP_DESCRIPTION, properties.getDescription());
+            APPEND_ENTITY_PROPERTY(PROP_POSITION, properties.getPosition());
+            APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, properties.getDimensions());
+            APPEND_ENTITY_PROPERTY(PROP_ROTATION, properties.getRotation());
+            APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, properties.getRegistrationPoint());
+            // FIXME: deal with these
+            // APPEND_ENTITY_PROPERTY(PROP_CREATED, properties.getCreated());
+            // APPEND_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, properties.getLastEditedBy());
+            // APPEND_ENTITY_PROPERTY(PROP_ENTITY_HOST_TYPE, (uint32_t)properties.getEntityHostType());
+            // APPEND_ENTITY_PROPERTY(PROP_OWNING_AVATAR_ID, properties.getOwningAvatarID());
             APPEND_ENTITY_PROPERTY(PROP_PARENT_ID, properties.getParentID());
             APPEND_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, properties.getParentJointIndex());
             APPEND_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, properties.getQueryAACube());
+            APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, properties.getCanCastShadow());
+            // APPEND_ENTITY_PROPERTY(PROP_VISIBLE_IN_SECONDARY_CAMERA, properties.getIsVisibleInSecondaryCamera()); // Not sent over the wire
+            _staticGrab.setProperties(properties);
+            _staticGrab.appendToEditPacket(packetData, requestedProperties, propertyFlags,
+                                           propertiesDidntFit, propertyCount, appendState);
 
-            if (properties.getType() == EntityTypes::Web) {
-                APPEND_ENTITY_PROPERTY(PROP_SOURCE_URL, properties.getSourceUrl());
-                APPEND_ENTITY_PROPERTY(PROP_DPI, properties.getDPI());
-            }
+            // Physics
+            APPEND_ENTITY_PROPERTY(PROP_DENSITY, properties.getDensity());
+            APPEND_ENTITY_PROPERTY(PROP_VELOCITY, properties.getVelocity());
+            APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, properties.getAngularVelocity());
+            APPEND_ENTITY_PROPERTY(PROP_GRAVITY, properties.getGravity());
+            APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, properties.getAcceleration());
+            APPEND_ENTITY_PROPERTY(PROP_DAMPING, properties.getDamping());
+            APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, properties.getAngularDamping());
+            APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, properties.getRestitution());
+            APPEND_ENTITY_PROPERTY(PROP_FRICTION, properties.getFriction());
+            APPEND_ENTITY_PROPERTY(PROP_LIFETIME, properties.getLifetime());
+            APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, properties.getCollisionless());
+            APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, properties.getCollisionMask());
+            APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, properties.getDynamic());
+            APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL());
+            APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, properties.getActionData());
 
-            if (properties.getType() == EntityTypes::Text) {
-                APPEND_ENTITY_PROPERTY(PROP_TEXT, properties.getText());
-                APPEND_ENTITY_PROPERTY(PROP_LINE_HEIGHT, properties.getLineHeight());
-                APPEND_ENTITY_PROPERTY(PROP_TEXT_COLOR, properties.getTextColor());
-                APPEND_ENTITY_PROPERTY(PROP_TEXT_ALPHA, properties.getTextAlpha());
-                APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, properties.getBackgroundColor());
-                APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_ALPHA, properties.getBackgroundAlpha());
-                APPEND_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, (uint32_t)properties.getBillboardMode());
-                APPEND_ENTITY_PROPERTY(PROP_LEFT_MARGIN, properties.getLeftMargin());
-                APPEND_ENTITY_PROPERTY(PROP_RIGHT_MARGIN, properties.getRightMargin());
-                APPEND_ENTITY_PROPERTY(PROP_TOP_MARGIN, properties.getTopMargin());
-                APPEND_ENTITY_PROPERTY(PROP_BOTTOM_MARGIN, properties.getBottomMargin());
-            }
+            // Cloning
+            APPEND_ENTITY_PROPERTY(PROP_CLONEABLE, properties.getCloneable());
+            APPEND_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, properties.getCloneLifetime());
+            APPEND_ENTITY_PROPERTY(PROP_CLONE_LIMIT, properties.getCloneLimit());
+            APPEND_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, properties.getCloneDynamic());
+            APPEND_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, properties.getCloneAvatarEntity());
+            APPEND_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, properties.getCloneOriginID());
 
-            if (properties.getType() == EntityTypes::Model) {
-                APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
-                APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL());
-                APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL());
-                APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures());
-                APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType()));
+            // Scripts
+            APPEND_ENTITY_PROPERTY(PROP_SCRIPT, properties.getScript());
+            APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, properties.getScriptTimestamp());
+            APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, properties.getServerScripts());
 
-                APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, properties.getJointRotationsSet());
-                APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, properties.getJointRotations());
-                APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, properties.getJointTranslationsSet());
-                APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, properties.getJointTranslations());
-                APPEND_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, properties.getRelayParentJoints());
-
-                _staticAnimation.setProperties(properties);
-                _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState);
-            }
-
-            if (properties.getType() == EntityTypes::Light) {
-                APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight());
-                APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
-                APPEND_ENTITY_PROPERTY(PROP_INTENSITY, properties.getIntensity());
-                APPEND_ENTITY_PROPERTY(PROP_EXPONENT, properties.getExponent());
-                APPEND_ENTITY_PROPERTY(PROP_CUTOFF, properties.getCutoff());
-                APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, properties.getFalloffRadius());
-            }
+            // Certifiable Properties
+            APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, properties.getItemName());
+            APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, properties.getItemDescription());
+            APPEND_ENTITY_PROPERTY(PROP_ITEM_CATEGORIES, properties.getItemCategories());
+            APPEND_ENTITY_PROPERTY(PROP_ITEM_ARTIST, properties.getItemArtist());
+            APPEND_ENTITY_PROPERTY(PROP_ITEM_LICENSE, properties.getItemLicense());
+            APPEND_ENTITY_PROPERTY(PROP_LIMITED_RUN, properties.getLimitedRun());
+            APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID());
+            APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, properties.getEditionNumber());
+            APPEND_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, properties.getEntityInstanceNumber());
+            APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, properties.getCertificateID());
+            APPEND_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, properties.getStaticCertificateVersion());
 
             if (properties.getType() == EntityTypes::ParticleEffect) {
                 APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType()));
+                APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
+                APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha());
+                APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures());
+
                 APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles());
                 APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, properties.getLifespan());
 
@@ -2677,17 +2766,14 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
                 APPEND_ENTITY_PROPERTY(PROP_RADIUS_START, properties.getRadiusStart());
                 APPEND_ENTITY_PROPERTY(PROP_RADIUS_FINISH, properties.getRadiusFinish());
 
-                APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
                 APPEND_ENTITY_PROPERTY(PROP_COLOR_SPREAD, properties.getColorSpread());
                 APPEND_ENTITY_PROPERTY(PROP_COLOR_START, properties.getColorStart());
                 APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, properties.getColorFinish());
 
-                APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha());
                 APPEND_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, properties.getAlphaSpread());
                 APPEND_ENTITY_PROPERTY(PROP_ALPHA_START, properties.getAlphaStart());
                 APPEND_ENTITY_PROPERTY(PROP_ALPHA_FINISH, properties.getAlphaFinish());
 
-                APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures());
                 APPEND_ENTITY_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, properties.getEmitterShouldTrail());
 
                 APPEND_ENTITY_PROPERTY(PROP_PARTICLE_SPIN, properties.getParticleSpin());
@@ -2697,7 +2783,50 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
                 APPEND_ENTITY_PROPERTY(PROP_PARTICLE_ROTATE_WITH_ENTITY, properties.getRotateWithEntity())
             }
 
+            if (properties.getType() == EntityTypes::Model) {
+                APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType()));
+                APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL());
+                APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
+                APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures());
+
+                APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL());
+                APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, properties.getJointRotationsSet());
+                APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, properties.getJointRotations());
+                APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, properties.getJointTranslationsSet());
+                APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, properties.getJointTranslations());
+                APPEND_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, properties.getRelayParentJoints());
+
+                _staticAnimation.setProperties(properties);
+                _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState);
+            }
+
+            if (properties.getType() == EntityTypes::Light) {
+                APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
+                APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight());
+                APPEND_ENTITY_PROPERTY(PROP_INTENSITY, properties.getIntensity());
+                APPEND_ENTITY_PROPERTY(PROP_EXPONENT, properties.getExponent());
+                APPEND_ENTITY_PROPERTY(PROP_CUTOFF, properties.getCutoff());
+                APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, properties.getFalloffRadius());
+            }
+
+            if (properties.getType() == EntityTypes::Text) {
+                APPEND_ENTITY_PROPERTY(PROP_TEXT, properties.getText());
+                APPEND_ENTITY_PROPERTY(PROP_LINE_HEIGHT, properties.getLineHeight());
+                APPEND_ENTITY_PROPERTY(PROP_TEXT_COLOR, properties.getTextColor());
+                APPEND_ENTITY_PROPERTY(PROP_TEXT_ALPHA, properties.getTextAlpha());
+                APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, properties.getBackgroundColor());
+                APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_ALPHA, properties.getBackgroundAlpha());
+                APPEND_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, (uint32_t)properties.getBillboardMode());
+                APPEND_ENTITY_PROPERTY(PROP_LEFT_MARGIN, properties.getLeftMargin());
+                APPEND_ENTITY_PROPERTY(PROP_RIGHT_MARGIN, properties.getRightMargin());
+                APPEND_ENTITY_PROPERTY(PROP_TOP_MARGIN, properties.getTopMargin());
+                APPEND_ENTITY_PROPERTY(PROP_BOTTOM_MARGIN, properties.getBottomMargin());
+            }
+
             if (properties.getType() == EntityTypes::Zone) {
+                APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)properties.getShapeType());
+                APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL());
+
                 _staticKeyLight.setProperties(properties);
                 _staticKeyLight.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState);
 
@@ -2713,9 +2842,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
                 _staticBloom.setProperties(properties);
                 _staticBloom.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState);
 
-                APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)properties.getShapeType());
-                APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL());
-
                 APPEND_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, properties.getFlyingAllowed());
                 APPEND_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, properties.getGhostingAllowed());
                 APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, properties.getFilterURL());
@@ -2742,30 +2868,36 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
                 APPEND_ENTITY_PROPERTY(PROP_Z_P_NEIGHBOR_ID, properties.getZPNeighborID());
             }
 
+            if (properties.getType() == EntityTypes::Web) {
+                APPEND_ENTITY_PROPERTY(PROP_SOURCE_URL, properties.getSourceUrl());
+                APPEND_ENTITY_PROPERTY(PROP_DPI, properties.getDPI());
+            }
+
             if (properties.getType() == EntityTypes::Line) {
                 APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
-                APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth());
+
                 APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints());
             }
 
             if (properties.getType() == EntityTypes::PolyLine) {
                 APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
-                APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth());
-                APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints());
-                APPEND_ENTITY_PROPERTY(PROP_NORMALS, properties.getPackedNormals());
-                APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, properties.getPackedStrokeColors());
-                APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, properties.getStrokeWidths());
                 APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures());
+
+                APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints());
+                APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, properties.getStrokeWidths());
+                APPEND_ENTITY_PROPERTY(PROP_STROKE_NORMALS, properties.getPackedNormals());
+                APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, properties.getPackedStrokeColors());
                 APPEND_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, properties.getIsUVModeStretch());
             }
+
             // NOTE: Spheres and Boxes are just special cases of Shape, and they need to include their PROP_SHAPE
             // when encoding/decoding edits because otherwise they can't polymorph to other shape types
             if (properties.getType() == EntityTypes::Shape ||
                 properties.getType() == EntityTypes::Box ||
                 properties.getType() == EntityTypes::Sphere) {
-                APPEND_ENTITY_PROPERTY(PROP_SHAPE, properties.getShape());
                 APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
                 APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha());
+                APPEND_ENTITY_PROPERTY(PROP_SHAPE, properties.getShape());
             }
 
             // Materials
@@ -2783,14 +2915,14 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
 
             // Image
             if (properties.getType() == EntityTypes::Image) {
+                APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
+                APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha());
+
                 APPEND_ENTITY_PROPERTY(PROP_IMAGE_URL, properties.getImageURL());
                 APPEND_ENTITY_PROPERTY(PROP_EMISSIVE, properties.getEmissive());
                 APPEND_ENTITY_PROPERTY(PROP_KEEP_ASPECT_RATIO, properties.getKeepAspectRatio());
                 APPEND_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, (uint32_t)properties.getBillboardMode());
                 APPEND_ENTITY_PROPERTY(PROP_SUB_IMAGE, properties.getSubImage());
-
-                APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor());
-                APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha());
             }
 
             // Grid
@@ -2802,33 +2934,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
                 APPEND_ENTITY_PROPERTY(PROP_MAJOR_GRID_EVERY, properties.getMajorGridEvery());
                 APPEND_ENTITY_PROPERTY(PROP_MINOR_GRID_EVERY, properties.getMinorGridEvery());
             }
-
-            APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName());
-            APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL());
-            APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, properties.getActionData());
-
-            // Certifiable Properties
-            APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, properties.getItemName());
-            APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, properties.getItemDescription());
-            APPEND_ENTITY_PROPERTY(PROP_ITEM_CATEGORIES, properties.getItemCategories());
-            APPEND_ENTITY_PROPERTY(PROP_ITEM_ARTIST, properties.getItemArtist());
-            APPEND_ENTITY_PROPERTY(PROP_ITEM_LICENSE, properties.getItemLicense());
-            APPEND_ENTITY_PROPERTY(PROP_LIMITED_RUN, properties.getLimitedRun());
-            APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID());
-            APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, properties.getEditionNumber());
-            APPEND_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, properties.getEntityInstanceNumber());
-            APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, properties.getCertificateID());
-            APPEND_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, properties.getStaticCertificateVersion());
-
-            APPEND_ENTITY_PROPERTY(PROP_CLONEABLE, properties.getCloneable());
-            APPEND_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, properties.getCloneLifetime());
-            APPEND_ENTITY_PROPERTY(PROP_CLONE_LIMIT, properties.getCloneLimit());
-            APPEND_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, properties.getCloneDynamic());
-            APPEND_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, properties.getCloneAvatarEntity());
-
-            _staticGrab.setProperties(properties);
-            _staticGrab.appendToEditPacket(packetData, requestedProperties, propertyFlags,
-                                           propertiesDidntFit, propertyCount, appendState);
         }
 
         if (propertyCount > 0) {
@@ -3008,82 +3113,77 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
     processedBytes += propertyFlags.getEncodedLength();
 
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SIMULATION_OWNER, QByteArray, setSimulationOwner);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POSITION, vec3, setPosition);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DIMENSIONS, vec3, setDimensions);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ROTATION, quat, setRotation);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DENSITY, float, setDensity);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY, vec3, setVelocity);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, vec3, setGravity);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, vec3, setAcceleration);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DAMPING, float, setDamping);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RESTITUTION, float, setRestitution);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FRICTION, float, setFriction);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFETIME, float, setLifetime);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT, QString, setScript);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, vec3, setRegistrationPoint);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, vec3, setAngularVelocity);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping);
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VISIBLE, bool, setVisible);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISIONLESS, bool, setCollisionless);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_MASK, uint16_t, setCollisionMask);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DYNAMIC, bool, setDynamic);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName);
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LOCKED, bool, setLocked);
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_USER_DATA, QString, setUserData);
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_HREF, QString, setHref);
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DESCRIPTION, QString, setDescription);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POSITION, vec3, setPosition);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DIMENSIONS, vec3, setDimensions);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ROTATION, quat, setRotation);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, vec3, setRegistrationPoint);
+    // FIXME: deal with these
+    // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CREATED, quint64, setCreated);
+    // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LAST_EDITED_BY, QUuid, setLastEditedBy);
+    // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ENTITY_HOST_TYPE, entity::HostType, setEntityHostType);
+    // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_OWNING_AVATAR_ID, QUuid, setOwningAvatarID);
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARENT_ID, QUuid, setParentID);
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARENT_JOINT_INDEX, quint16, setParentJointIndex);
     READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_QUERY_AA_CUBE, AACube, setQueryAACube);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow);
+    // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VISIBLE_IN_SECONDARY_CAMERA, bool, setIsVisibleInSecondaryCamera); // Not sent over the wire
+    properties.getGrab().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
 
-    if (properties.getType() == EntityTypes::Web) {
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SOURCE_URL, QString, setSourceUrl);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DPI, uint16_t, setDPI);
-    }
+    // Physics
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DENSITY, float, setDensity);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY, vec3, setVelocity);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, vec3, setAngularVelocity);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, vec3, setGravity);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, vec3, setAcceleration);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DAMPING, float, setDamping);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RESTITUTION, float, setRestitution);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FRICTION, float, setFriction);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFETIME, float, setLifetime);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISIONLESS, bool, setCollisionless);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_MASK, uint16_t, setCollisionMask);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DYNAMIC, bool, setDynamic);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACTION_DATA, QByteArray, setActionData);
 
-    if (properties.getType() == EntityTypes::Text) {
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT, QString, setText);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_HEIGHT, float, setLineHeight);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, u8vec3Color, setTextColor);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_ALPHA, float, setTextAlpha);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, u8vec3Color, setBackgroundColor);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_ALPHA, float, setBackgroundAlpha);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BILLBOARD_MODE, BillboardMode, setBillboardMode);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LEFT_MARGIN, float, setLeftMargin);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RIGHT_MARGIN, float, setRightMargin);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TOP_MARGIN, float, setTopMargin);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BOTTOM_MARGIN, float, setBottomMargin);
-    }
+    // Cloning
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONEABLE, bool, setCloneable);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_LIFETIME, float, setCloneLifetime);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_LIMIT, float, setCloneLimit);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_DYNAMIC, bool, setCloneDynamic);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_AVATAR_ENTITY, bool, setCloneAvatarEntity);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_ORIGIN_ID, QUuid, setCloneOriginID);
 
-    if (properties.getType() == EntityTypes::Model) {
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MODEL_URL, QString, setModelURL);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType);
+    // Scripts
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT, QString, setScript);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts);
 
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS_SET, QVector<bool>, setJointRotationsSet);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector<quat>, setJointRotations);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector<bool>, setJointTranslationsSet);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector<vec3>, setJointTranslations);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RELAY_PARENT_JOINTS, bool, setRelayParentJoints);
-
-        properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
-    }
-
-    if (properties.getType() == EntityTypes::Light) {
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_INTENSITY, float, setIntensity);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CUTOFF, float, setCutoff);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FALLOFF_RADIUS, float, setFalloffRadius);
-    }
+    // Certifiable Properties
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_NAME, QString, setItemName);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_DESCRIPTION, QString, setItemDescription);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_CATEGORIES, QString, setItemCategories);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_ARTIST, QString, setItemArtist);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_LICENSE, QString, setItemLicense);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIMITED_RUN, quint32, setLimitedRun);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EDITION_NUMBER, quint32, setEditionNumber);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ENTITY_INSTANCE_NUMBER, quint32, setEntityInstanceNumber);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CERTIFICATE_ID, QString, setCertificateID);
+    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STATIC_CERTIFICATE_VERSION, quint32, setStaticCertificateVersion);
 
     if (properties.getType() == EntityTypes::ParticleEffect) {
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures);
+
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, quint32, setMaxParticles);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFESPAN, float, setLifespan);
 
@@ -3108,17 +3208,14 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_START, float, setRadiusStart);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_FINISH, float, setRadiusFinish);
 
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, u8vec3Color, setColorSpread);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, vec3Color, setColorStart);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, vec3Color, setColorFinish);
 
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_SPREAD, float, setAlphaSpread);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_START, float, setAlphaStart);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_FINISH, float, setAlphaFinish);
 
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMITTER_SHOULD_TRAIL, bool, setEmitterShouldTrail);
 
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_SPIN, float, setParticleSpin);
@@ -3128,16 +3225,56 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_ROTATE_WITH_ENTITY, bool, setRotateWithEntity);
     }
 
+    if (properties.getType() == EntityTypes::Model) {
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures);
+
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MODEL_URL, QString, setModelURL);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS_SET, QVector<bool>, setJointRotationsSet);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector<quat>, setJointRotations);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector<bool>, setJointTranslationsSet);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector<vec3>, setJointTranslations);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RELAY_PARENT_JOINTS, bool, setRelayParentJoints);
+
+        properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
+    }
+
+    if (properties.getType() == EntityTypes::Light) {
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
+
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_INTENSITY, float, setIntensity);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CUTOFF, float, setCutoff);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FALLOFF_RADIUS, float, setFalloffRadius);
+    }
+
+    if (properties.getType() == EntityTypes::Text) {
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT, QString, setText);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_HEIGHT, float, setLineHeight);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, u8vec3Color, setTextColor);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_ALPHA, float, setTextAlpha);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, u8vec3Color, setBackgroundColor);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_ALPHA, float, setBackgroundAlpha);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BILLBOARD_MODE, BillboardMode, setBillboardMode);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LEFT_MARGIN, float, setLeftMargin);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RIGHT_MARGIN, float, setRightMargin);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TOP_MARGIN, float, setTopMargin);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BOTTOM_MARGIN, float, setBottomMargin);
+    }
+
     if (properties.getType() == EntityTypes::Zone) {
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
+
         properties.getKeyLight().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
         properties.getAmbientLight().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
         properties.getSkybox().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
         properties.getHaze().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
         properties.getBloom().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
 
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
-
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FLYING_ALLOWED, bool, setFlyingAllowed);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GHOSTING_ALLOWED, bool, setGhostingAllowed);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FILTER_URL, QString, setFilterURL);
@@ -3164,21 +3301,25 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_Z_P_NEIGHBOR_ID, EntityItemID, setZPNeighborID);
     }
 
+    if (properties.getType() == EntityTypes::Web) {
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SOURCE_URL, QString, setSourceUrl);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DPI, uint16_t, setDPI);
+    }
+
     if (properties.getType() == EntityTypes::Line) {
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth);
+
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector<vec3>, setLinePoints);
     }
 
-
     if (properties.getType() == EntityTypes::PolyLine) {
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector<vec3>, setLinePoints);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QByteArray, setPackedNormals);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_COLORS, QByteArray, setPackedStrokeColors);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_WIDTHS, QVector<float>, setStrokeWidths);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures);
+
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector<vec3>, setLinePoints);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_WIDTHS, QVector<float>, setStrokeWidths);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_NORMALS, QByteArray, setPackedNormals);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_COLORS, QByteArray, setPackedStrokeColors);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch);
     }
 
@@ -3187,9 +3328,9 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
     if (properties.getType() == EntityTypes::Shape ||
         properties.getType() == EntityTypes::Box ||
         properties.getType() == EntityTypes::Sphere) {
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape);
     }
 
     // Materials
@@ -3207,14 +3348,14 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
 
     // Image
     if (properties.getType() == EntityTypes::Image) {
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
+        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha);
+
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IMAGE_URL, QString, setImageURL);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMISSIVE, bool, setEmissive);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEEP_ASPECT_RATIO, bool, setKeepAspectRatio);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BILLBOARD_MODE, BillboardMode, setBillboardMode);
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SUB_IMAGE, QRect, setSubImage);
-
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor);
-        READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha);
     }
 
     // Grid
@@ -3227,31 +3368,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
         READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MINOR_GRID_EVERY, float, setMinorGridEvery);
     }
 
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACTION_DATA, QByteArray, setActionData);
-
-    // Certifiable Properties
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_NAME, QString, setItemName);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_DESCRIPTION, QString, setItemDescription);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_CATEGORIES, QString, setItemCategories);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_ARTIST, QString, setItemArtist);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_LICENSE, QString, setItemLicense);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIMITED_RUN, quint32, setLimitedRun);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EDITION_NUMBER, quint32, setEditionNumber);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ENTITY_INSTANCE_NUMBER, quint32, setEntityInstanceNumber);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CERTIFICATE_ID, QString, setCertificateID);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STATIC_CERTIFICATE_VERSION, quint32, setStaticCertificateVersion);
-
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONEABLE, bool, setCloneable);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_LIFETIME, float, setCloneLifetime);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_LIMIT, float, setCloneLimit);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_DYNAMIC, bool, setCloneDynamic);
-    READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_AVATAR_ENTITY, bool, setCloneAvatarEntity);
-
-    properties.getGrab().decodeFromEditPacket(propertyFlags, dataAt, processedBytes);
-
     return valid;
 }
 
@@ -3376,94 +3492,58 @@ bool EntityItemProperties::decodeCloneEntityMessage(const QByteArray& buffer, in
 }
 
 void EntityItemProperties::markAllChanged() {
-    _lastEditedByChanged = true;
+    // Core
     _simulationOwnerChanged = true;
+    _visibleChanged = true;
+    _nameChanged = true;
+    _lockedChanged = true;
+    _userDataChanged = true;
+    _hrefChanged = true;
+    _descriptionChanged = true;
     _positionChanged = true;
     _dimensionsChanged = true;
     _rotationChanged = true;
+    _registrationPointChanged = true;
+    _createdChanged = true;
+    _lastEditedByChanged = true;
+    _entityHostTypeChanged = true;
+    _owningAvatarIDChanged = true;
+    _parentIDChanged = true;
+    _parentJointIndexChanged = true;
+    _queryAACubeChanged = true;
+    _canCastShadowChanged = true;
+    _isVisibleInSecondaryCameraChanged = true;
+    _grab.markAllChanged();
+
+    // Physics
     _densityChanged = true;
     _velocityChanged = true;
+    _angularVelocityChanged = true;
     _gravityChanged = true;
     _accelerationChanged = true;
     _dampingChanged = true;
+    _angularDampingChanged = true;
     _restitutionChanged = true;
     _frictionChanged = true;
     _lifetimeChanged = true;
-    _userDataChanged = true;
-    _scriptChanged = true;
-    _scriptTimestampChanged = true;
-    _serverScriptsChanged = true;
-    _collisionSoundURLChanged = true;
-    _registrationPointChanged = true;
-    _angularVelocityChanged = true;
-    _angularDampingChanged = true;
-    _nameChanged = true;
-    _visibleChanged = true;
-    _canCastShadowChanged = true;
-    _colorChanged = true;
-    _alphaChanged = true;
-    _modelURLChanged = true;
-    _compoundShapeURLChanged = true;
-    _localRenderAlphaChanged = true;
-    _isSpotlightChanged = true;
     _collisionlessChanged = true;
     _collisionMaskChanged = true;
     _dynamicChanged = true;
+    _collisionSoundURLChanged = true;
+    _actionDataChanged = true;
 
-    _intensityChanged = true;
-    _falloffRadiusChanged = true;
-    _exponentChanged = true;
-    _cutoffChanged = true;
-    _lockedChanged = true;
-    _texturesChanged = true;
+    // Cloning
+    _cloneableChanged = true;
+    _cloneLifetimeChanged = true;
+    _cloneLimitChanged = true;
+    _cloneDynamicChanged = true;
+    _cloneAvatarEntityChanged = true;
+    _cloneOriginIDChanged = true;
 
-    _textChanged = true;
-    _lineHeightChanged = true;
-    _textColorChanged = true;
-    _backgroundColorChanged = true;
-    _shapeTypeChanged = true;
-
-    _isEmittingChanged = true;
-    _emitterShouldTrailChanged = true;
-    _maxParticlesChanged = true;
-    _lifespanChanged = true;
-    _emitRateChanged = true;
-    _emitSpeedChanged = true;
-    _speedSpreadChanged = true;
-    _emitOrientationChanged = true;
-    _emitDimensionsChanged = true;
-    _emitRadiusStartChanged = true;
-    _polarStartChanged = true;
-    _polarFinishChanged = true;
-    _azimuthStartChanged = true;
-    _azimuthFinishChanged = true;
-    _emitAccelerationChanged = true;
-    _accelerationSpreadChanged = true;
-    _particleRadiusChanged = true;
-    _radiusSpreadChanged = true;
-    _colorSpreadChanged = true;
-    _alphaSpreadChanged = true;
-    _radiusStartChanged = true;
-    _radiusFinishChanged = true;
-    _colorStartChanged = true;
-    _colorFinishChanged = true;
-    _alphaStartChanged = true;
-    _alphaFinishChanged = true;
-    _particleSpinChanged = true;
-    _spinStartChanged = true;
-    _spinFinishChanged = true;
-    _spinSpreadChanged = true;
-    _rotateWithEntityChanged = true;
-
-    _materialURLChanged = true;
-    _materialMappingModeChanged = true;
-    _priorityChanged = true;
-    _parentMaterialNameChanged = true;
-    _materialMappingPosChanged = true;
-    _materialMappingScaleChanged = true;
-    _materialMappingRotChanged = true;
-    _materialDataChanged = true;
-    _materialRepeatChanged = true;
+    // Scripts
+    _scriptChanged = true;
+    _scriptTimestampChanged = true;
+    _serverScriptsChanged = true;
 
     // Certifiable Properties
     _itemNameChanged = true;
@@ -3478,98 +3558,139 @@ void EntityItemProperties::markAllChanged() {
     _certificateIDChanged = true;
     _staticCertificateVersionChanged = true;
 
-    _keyLight.markAllChanged();
-    _ambientLight.markAllChanged();
-    _skybox.markAllChanged();
+    // Common
+    _shapeTypeChanged = true;
+    _colorChanged = true;
+    _alphaChanged = true;
+    _texturesChanged = true;
+    _compoundShapeURLChanged = true;
 
-    _keyLightModeChanged = true;
-    _skyboxModeChanged = true;
-    _ambientLightModeChanged = true;
-    _hazeModeChanged = true;
-    _bloomModeChanged = true;
-
-    _animation.markAllChanged();
-    _skybox.markAllChanged();
-    _haze.markAllChanged();
-    _bloom.markAllChanged();
-    _grab.markAllChanged();
-
-    _sourceUrlChanged = true;
-    _voxelVolumeSizeChanged = true;
-    _voxelDataChanged = true;
-    _voxelSurfaceStyleChanged = true;
-
-    _lineWidthChanged = true;
-    _linePointsChanged = true;
-
-    _hrefChanged = true;
-    _descriptionChanged = true;
-    _billboardModeChanged = true;
-    _actionDataChanged = true;
-
-    _normalsChanged = true;
-    _strokeColorsChanged = true;
-    _strokeWidthsChanged = true;
-    _isUVModeStretchChanged = true;
-
-    _xTextureURLChanged = true;
-    _yTextureURLChanged = true;
-    _zTextureURLChanged = true;
-
-    _xNNeighborIDChanged = true;
-    _yNNeighborIDChanged = true;
-    _zNNeighborIDChanged = true;
-
-    _xPNeighborIDChanged = true;
-    _yPNeighborIDChanged = true;
-    _zPNeighborIDChanged = true;
-
-    _parentIDChanged = true;
-    _parentJointIndexChanged = true;
+    // Particles
+    _maxParticlesChanged = true;
+    _lifespanChanged = true;
+    _isEmittingChanged = true;
+    _emitRateChanged = true;
+    _emitSpeedChanged = true;
+    _speedSpreadChanged = true;
+    _emitOrientationChanged = true;
+    _emitDimensionsChanged = true;
+    _emitRadiusStartChanged = true;
+    _polarStartChanged = true;
+    _polarFinishChanged = true;
+    _azimuthStartChanged = true;
+    _azimuthFinishChanged = true;
+    _emitAccelerationChanged = true;
+    _accelerationSpreadChanged = true;
+    _particleRadiusChanged = true;
+    _radiusSpreadChanged = true;
+    _radiusStartChanged = true;
+    _radiusFinishChanged = true;
+    _colorSpreadChanged = true;
+    _colorStartChanged = true;
+    _colorFinishChanged = true;
+    _alphaSpreadChanged = true;
+    _alphaStartChanged = true;
+    _alphaFinishChanged = true;
+    _emitterShouldTrailChanged = true;
+    _particleSpinChanged = true;
+    _spinStartChanged = true;
+    _spinFinishChanged = true;
+    _spinSpreadChanged = true;
+    _rotateWithEntityChanged = true;
 
+    // Model
+    _modelURLChanged = true;
     _jointRotationsSetChanged = true;
     _jointRotationsChanged = true;
     _jointTranslationsSetChanged = true;
     _jointTranslationsChanged = true;
+    _relayParentJointsChanged = true;
+    _animation.markAllChanged();
 
-    _queryAACubeChanged = true;
+    // Light
+    _isSpotlightChanged = true;
+    _intensityChanged = true;
+    _exponentChanged = true;
+    _cutoffChanged = true;
+    _falloffRadiusChanged = true;
 
-    _shapeChanged = true;
+    // Text
+    _textChanged = true;
+    _lineHeightChanged = true;
+    _textColorChanged = true;
+    _textAlphaChanged = true;
+    _backgroundColorChanged = true;
+    _backgroundAlphaChanged = true;
+    _billboardModeChanged = true;
+    _leftMarginChanged = true;
+    _rightMarginChanged = true;
+    _topMarginChanged = true;
+    _bottomMarginChanged = true;
 
+    // Zone
+    _keyLight.markAllChanged();
+    _ambientLight.markAllChanged();
+    _skybox.markAllChanged();
+    _haze.markAllChanged();
+    _bloom.markAllChanged();
     _flyingAllowedChanged = true;
     _ghostingAllowedChanged = true;
     _filterURLChanged = true;
+    _keyLightModeChanged = true;
+    _ambientLightModeChanged = true;
+    _skyboxModeChanged = true;
+    _hazeModeChanged = true;
+    _bloomModeChanged = true;
 
-    _entityHostTypeChanged = true;
-    _owningAvatarIDChanged = true;
+    // Polyvox
+    _voxelVolumeSizeChanged = true;
+    _voxelDataChanged = true;
+    _voxelSurfaceStyleChanged = true;
+    _xTextureURLChanged = true;
+    _yTextureURLChanged = true;
+    _zTextureURLChanged = true;
+    _xNNeighborIDChanged = true;
+    _yNNeighborIDChanged = true;
+    _zNNeighborIDChanged = true;
+    _xPNeighborIDChanged = true;
+    _yPNeighborIDChanged = true;
+    _zPNeighborIDChanged = true;
 
+    // Web
+    _sourceUrlChanged = true;
     _dpiChanged = true;
-    _relayParentJointsChanged = true;
 
-    _cloneableChanged = true;
-    _cloneLifetimeChanged = true;
-    _cloneLimitChanged = true;
-    _cloneDynamicChanged = true;
-    _cloneAvatarEntityChanged = true;
-    _cloneOriginIDChanged = true;
+    // Polyline
+    _linePointsChanged = true;
+    _strokeWidthsChanged = true;
+    _normalsChanged = true;
+    _strokeColorsChanged = true;
+    _isUVModeStretchChanged = true;
 
-    _isVisibleInSecondaryCameraChanged = true;
+    // Shape
+    _shapeChanged = true;
 
+    // Material
+    _materialURLChanged = true;
+    _materialMappingModeChanged = true;
+    _priorityChanged = true;
+    _parentMaterialNameChanged = true;
+    _materialMappingPosChanged = true;
+    _materialMappingScaleChanged = true;
+    _materialMappingRotChanged = true;
+    _materialDataChanged = true;
+    _materialRepeatChanged = true;
+
+    // Image
     _imageURLChanged = true;
     _emissiveChanged = true;
     _keepAspectRatioChanged = true;
     _subImageChanged = true;
 
+    // Grid
     _followCameraChanged = true;
     _majorGridEveryChanged = true;
     _minorGridEveryChanged = true;
-
-    _textAlphaChanged = true;
-    _backgroundAlphaChanged = true;
-    _leftMarginChanged = true;
-    _rightMarginChanged = true;
-    _topMarginChanged = true;
-    _bottomMarginChanged = true;
 }
 
 // The minimum bounding box for the entity.
@@ -3700,30 +3821,81 @@ uint8_t EntityItemProperties::computeSimulationBidPriority() const {
 
 QList<QString> EntityItemProperties::listChangedProperties() {
     QList<QString> out;
+
+    // Core
+    if (simulationOwnerChanged()) {
+        out += "simulationOwner";
+    }
+    if (visibleChanged()) {
+        out += "visible";
+    }
+    if (nameChanged()) {
+        out += "name";
+    }
+    if (lockedChanged()) {
+        out += "locked";
+    }
+    if (userDataChanged()) {
+        out += "userData";
+    }
+    if (hrefChanged()) {
+        out += "href";
+    }
+    if (descriptionChanged()) {
+        out += "description";
+    }
     if (containsPositionChange()) {
         out += "position";
     }
     if (dimensionsChanged()) {
         out += "dimensions";
     }
-    if (velocityChanged()) {
-        out += "velocity";
+    if (rotationChanged()) {
+        out += "rotation";
     }
-    if (nameChanged()) {
-        out += "name";
+    if (registrationPointChanged()) {
+        out += "registrationPoint";
     }
-    if (visibleChanged()) {
-        out += "visible";
+    // FIXME: handle these
+    //if (createdChanged()) {
+    //    out += "created";
+    //}
+    //if (lastEditedByChanged()) {
+    //    out += "lastEditedBy";
+    //}
+    if (entityHostTypeChanged()) {
+        out += "entityHostType";
+    }
+    if (owningAvatarIDChanged()) {
+        out += "owningAvatarID";
+    }
+    if (parentIDChanged()) {
+        out += "parentID";
+    }
+    if (parentJointIndexChanged()) {
+        out += "parentJointIndex";
+    }
+    if (queryAACubeChanged()) {
+        out += "queryAACube";
     }
     if (canCastShadowChanged()) {
         out += "canCastShadow";
     }
-    if (rotationChanged()) {
-        out += "rotation";
+    if (isVisibleInSecondaryCameraChanged()) {
+        out += "isVisibleInSecondaryCamera";
     }
+    getGrab().listChangedProperties(out);
+
+    // Physics
     if (densityChanged()) {
         out += "density";
     }
+    if (velocityChanged()) {
+        out += "velocity";
+    }
+    if (angularVelocityChanged()) {
+        out += "angularVelocity";
+    }
     if (gravityChanged()) {
         out += "gravity";
     }
@@ -3733,6 +3905,9 @@ QList<QString> EntityItemProperties::listChangedProperties() {
     if (dampingChanged()) {
         out += "damping";
     }
+    if (angularDampingChanged()) {
+        out += "angularDamping";
+    }
     if (restitutionChanged()) {
         out += "restitution";
     }
@@ -3742,60 +3917,6 @@ QList<QString> EntityItemProperties::listChangedProperties() {
     if (lifetimeChanged()) {
         out += "lifetime";
     }
-    if (scriptChanged()) {
-        out += "script";
-    }
-    if (scriptTimestampChanged()) {
-        out += "scriptTimestamp";
-    }
-    if (serverScriptsChanged()) {
-        out += "serverScripts";
-    }
-    if (collisionSoundURLChanged()) {
-        out += "collisionSoundURL";
-    }
-    if (colorChanged()) {
-        out += "color";
-    }
-    if (colorSpreadChanged()) {
-        out += "colorSpread";
-    }
-    if (colorStartChanged()) {
-        out += "colorStart";
-    }
-    if (colorFinishChanged()) {
-        out += "colorFinish";
-    }
-    if (alphaChanged()) {
-        out += "alpha";
-    }
-    if (alphaSpreadChanged()) {
-        out += "alphaSpread";
-    }
-    if (alphaStartChanged()) {
-        out += "alphaStart";
-    }
-    if (alphaFinishChanged()) {
-        out += "alphaFinish";
-    }
-    if (emitterShouldTrailChanged()) {
-        out += "emitterShouldTrail";
-    }
-    if (modelURLChanged()) {
-        out += "modelURL";
-    }
-    if (compoundShapeURLChanged()) {
-        out += "compoundShapeURL";
-    }
-    if (registrationPointChanged()) {
-        out += "registrationPoint";
-    }
-    if (angularVelocityChanged()) {
-        out += "angularVelocity";
-    }
-    if (angularDampingChanged()) {
-        out += "angularDamping";
-    }
     if (collisionlessChanged()) {
         out += "collisionless";
     }
@@ -3805,48 +3926,97 @@ QList<QString> EntityItemProperties::listChangedProperties() {
     if (dynamicChanged()) {
         out += "dynamic";
     }
-    if (isSpotlightChanged()) {
-        out += "isSpotlight";
+    if (collisionSoundURLChanged()) {
+        out += "collisionSoundURL";
     }
-    if (intensityChanged()) {
-        out += "intensity";
+    if (actionDataChanged()) {
+        out += "actionData";
     }
-    if (falloffRadiusChanged()) {
-        out += "falloffRadius";
+
+    // Cloning
+    if (cloneableChanged()) {
+        out += "cloneable";
     }
-    if (exponentChanged()) {
-        out += "exponent";
+    if (cloneLifetimeChanged()) {
+        out += "cloneLifetime";
     }
-    if (cutoffChanged()) {
-        out += "cutoff";
+    if (cloneLimitChanged()) {
+        out += "cloneLimit";
     }
-    if (lockedChanged()) {
-        out += "locked";
+    if (cloneDynamicChanged()) {
+        out += "cloneDynamic";
+    }
+    if (cloneAvatarEntityChanged()) {
+        out += "cloneAvatarEntity";
+    }
+    if (cloneOriginIDChanged()) {
+        out += "cloneOriginID";
+    }
+
+    // Scripts
+    if (scriptChanged()) {
+        out += "script";
+    }
+    if (scriptTimestampChanged()) {
+        out += "scriptTimestamp";
+    }
+    if (serverScriptsChanged()) {
+        out += "serverScripts";
+    }
+
+    // Certifiable Properties
+    if (itemNameChanged()) {
+        out += "itemName";
+    }
+    if (itemDescriptionChanged()) {
+        out += "itemDescription";
+    }
+    if (itemCategoriesChanged()) {
+        out += "itemCategories";
+    }
+    if (itemArtistChanged()) {
+        out += "itemArtist";
+    }
+    if (itemLicenseChanged()) {
+        out += "itemLicense";
+    }
+    if (limitedRunChanged()) {
+        out += "limitedRun";
+    }
+    if (marketplaceIDChanged()) {
+        out += "marketplaceID";
+    }
+    if (editionNumberChanged()) {
+        out += "editionNumber";
+    }
+    if (entityInstanceNumberChanged()) {
+        out += "entityInstanceNumber";
+    }
+    if (certificateIDChanged()) {
+        out += "certificateID";
+    }
+    if (staticCertificateVersionChanged()) {
+        out += "staticCertificateVersion";
+    }
+
+    // Common
+    if (shapeTypeChanged()) {
+        out += "shapeType";
+    }
+    if (compoundShapeURLChanged()) {
+        out += "compoundShapeURL";
+    }
+    if (colorChanged()) {
+        out += "color";
+    }
+    if (alphaChanged()) {
+        out += "alpha";
     }
     if (texturesChanged()) {
         out += "textures";
     }
-    if (userDataChanged()) {
-        out += "userData";
-    }
-    if (simulationOwnerChanged()) {
-        out += "simulationOwner";
-    }
-    if (textChanged()) {
-        out += "text";
-    }
-    if (lineHeightChanged()) {
-        out += "lineHeight";
-    }
-    if (textColorChanged()) {
-        out += "textColor";
-    }
-    if (backgroundColorChanged()) {
-        out += "backgroundColor";
-    }
-    if (shapeTypeChanged()) {
-        out += "shapeType";
-    }
+
+    // Particles
     if (maxParticlesChanged()) {
         out += "maxParticles";
     }
@@ -3904,6 +4074,27 @@ QList<QString> EntityItemProperties::listChangedProperties() {
     if (radiusFinishChanged()) {
         out += "radiusFinish";
     }
+    if (colorSpreadChanged()) {
+        out += "colorSpread";
+    }
+    if (colorStartChanged()) {
+        out += "colorStart";
+    }
+    if (colorFinishChanged()) {
+        out += "colorFinish";
+    }
+    if (alphaSpreadChanged()) {
+        out += "alphaSpread";
+    }
+    if (alphaStartChanged()) {
+        out += "alphaStart";
+    }
+    if (alphaFinishChanged()) {
+        out += "alphaFinish";
+    }
+    if (emitterShouldTrailChanged()) {
+        out += "emitterShouldTrail";
+    }
     if (particleSpinChanged()) {
         out += "particleSpin";
     }
@@ -3919,77 +4110,94 @@ QList<QString> EntityItemProperties::listChangedProperties() {
     if (rotateWithEntityChanged()) {
         out += "rotateWithEntity";
     }
-    if (materialURLChanged()) {
-        out += "materialURL";
+
+    // Model
+    if (modelURLChanged()) {
+        out += "modelURL";
     }
-    if (materialMappingModeChanged()) {
-        out += "materialMappingMode";
+    if (jointRotationsSetChanged()) {
+        out += "jointRotationsSet";
     }
-    if (priorityChanged()) {
-        out += "priority";
+    if (jointRotationsChanged()) {
+        out += "jointRotations";
     }
-    if (parentMaterialNameChanged()) {
-        out += "parentMaterialName";
+    if (jointTranslationsSetChanged()) {
+        out += "jointTranslationsSet";
     }
-    if (materialMappingPosChanged()) {
-        out += "materialMappingPos";
+    if (jointTranslationsChanged()) {
+        out += "jointTranslations";
     }
-    if (materialMappingScaleChanged()) {
-        out += "materialMappingScale";
+    if (relayParentJointsChanged()) {
+        out += "relayParentJoints";
     }
-    if (materialMappingRotChanged()) {
-        out += "materialMappingRot";
+    getAnimation().listChangedProperties(out);
+
+    // Light
+    if (isSpotlightChanged()) {
+        out += "isSpotlight";
     }
-    if (materialDataChanged()) {
-        out += "materialData";
+    if (intensityChanged()) {
+        out += "intensity";
     }
-    if (materialRepeatChanged()) {
-        out += "materialRepeat";
+    if (exponentChanged()) {
+        out += "exponent";
     }
-    if (isVisibleInSecondaryCameraChanged()) {
-        out += "isVisibleInSecondaryCamera";
+    if (cutoffChanged()) {
+        out += "cutoff";
+    }
+    if (falloffRadiusChanged()) {
+        out += "falloffRadius";
     }
 
-    // Certifiable Properties
-    if (itemNameChanged()) {
-        out += "itemName";
+    // Text
+    if (textChanged()) {
+        out += "text";
     }
-    if (itemDescriptionChanged()) {
-        out += "itemDescription";
+    if (lineHeightChanged()) {
+        out += "lineHeight";
     }
-    if (itemCategoriesChanged()) {
-        out += "itemCategories";
+    if (textColorChanged()) {
+        out += "textColor";
     }
-    if (itemArtistChanged()) {
-        out += "itemArtist";
+    if (textAlphaChanged()) {
+        out += "textAlpha";
     }
-    if (itemLicenseChanged()) {
-        out += "itemLicense";
+    if (backgroundColorChanged()) {
+        out += "backgroundColor";
     }
-    if (limitedRunChanged()) {
-        out += "limitedRun";
+    if (backgroundAlphaChanged()) {
+        out += "backgroundAlpha";
     }
-    if (marketplaceIDChanged()) {
-        out += "marketplaceID";
+    if (billboardModeChanged()) {
+        out += "billboardMode";
     }
-    if (editionNumberChanged()) {
-        out += "editionNumber";
+    if (leftMarginChanged()) {
+        out += "leftMargin";
     }
-    if (entityInstanceNumberChanged()) {
-        out += "entityInstanceNumber";
+    if (rightMarginChanged()) {
+        out += "rightMargin";
     }
-    if (certificateIDChanged()) {
-        out += "certificateID";
+    if (topMarginChanged()) {
+        out += "topMargin";
     }
-    if (staticCertificateVersionChanged()) {
-        out += "staticCertificateVersion";
+    if (bottomMarginChanged()) {
+        out += "bottomMargin";
     }
 
-    if (hazeModeChanged()) {
-        out += "hazeMode";
+    // Zone
+    getKeyLight().listChangedProperties(out);
+    getAmbientLight().listChangedProperties(out);
+    getSkybox().listChangedProperties(out);
+    getHaze().listChangedProperties(out);
+    getBloom().listChangedProperties(out);
+    if (flyingAllowedChanged()) {
+        out += "flyingAllowed";
     }
-    if (bloomModeChanged()) {
-        out += "bloomMode";
+    if (ghostingAllowedChanged()) {
+        out += "ghostingAllowed";
+    }
+    if (filterURLChanged()) {
+        out += "filterURL";
     }
     if (keyLightModeChanged()) {
         out += "keyLightMode";
@@ -4000,7 +4208,14 @@ QList<QString> EntityItemProperties::listChangedProperties() {
     if (skyboxModeChanged()) {
         out += "skyboxMode";
     }
+    if (hazeModeChanged()) {
+        out += "hazeMode";
+    }
+    if (bloomModeChanged()) {
+        out += "bloomMode";
+    }
 
+    // Polyvox
     if (voxelVolumeSizeChanged()) {
         out += "voxelVolumeSize";
     }
@@ -4010,15 +4225,6 @@ QList<QString> EntityItemProperties::listChangedProperties() {
     if (voxelSurfaceStyleChanged()) {
         out += "voxelSurfaceStyle";
     }
-    if (hrefChanged()) {
-        out += "href";
-    }
-    if (descriptionChanged()) {
-        out += "description";
-    }
-    if (actionDataChanged()) {
-        out += "actionData";
-    }
     if (xTextureURLChanged()) {
         out += "xTextureURL";
     }
@@ -4046,82 +4252,67 @@ QList<QString> EntityItemProperties::listChangedProperties() {
     if (zPNeighborIDChanged()) {
         out += "zPNeighborID";
     }
-    if (parentIDChanged()) {
-        out += "parentID";
-    }
-    if (parentJointIndexChanged()) {
-        out += "parentJointIndex";
-    }
-    if (jointRotationsSetChanged()) {
-        out += "jointRotationsSet";
-    }
-    if (jointRotationsChanged()) {
-        out += "jointRotations";
-    }
-    if (jointTranslationsSetChanged()) {
-        out += "jointTranslationsSet";
-    }
-    if (jointTranslationsChanged()) {
-        out += "jointTranslations";
-    }
-    if (relayParentJointsChanged()) {
-        out += "relayParentJoints";
-    }
-    if (queryAACubeChanged()) {
-        out += "queryAACube";
-    }
 
-    if (entityHostTypeChanged()) {
-        out += "entityHostType";
-    }
-    if (owningAvatarIDChanged()) {
-        out += "owningAvatarID";
-    }
-
-    if (flyingAllowedChanged()) {
-        out += "flyingAllowed";
-    }
-    if (ghostingAllowedChanged()) {
-        out += "ghostingAllowed";
-    }
-    if (filterURLChanged()) {
-        out += "filterURL";
+    // Web
+    if (sourceUrlChanged()) {
+        out += "sourceUrl";
     }
     if (dpiChanged()) {
         out += "dpi";
     }
 
-    if (shapeChanged()) {
-        out += "shape";
+    // Polyline
+    if (linePointsChanged()) {
+        out += "linePoints";
+    }
+    if (strokeWidthsChanged()) {
+        out += "strokeWidths";
+    }
+    if (normalsChanged()) {
+        out += "normals";
     }
-
     if (strokeColorsChanged()) {
         out += "strokeColors";
     }
-
     if (isUVModeStretchChanged()) {
         out += "isUVModeStretch";
     }
 
-    if (cloneableChanged()) {
-        out += "cloneable";
-    }
-    if (cloneLifetimeChanged()) {
-        out += "cloneLifetime";
-    }
-    if (cloneLimitChanged()) {
-        out += "cloneLimit";
-    }
-    if (cloneDynamicChanged()) {
-        out += "cloneDynamic";
-    }
-    if (cloneAvatarEntityChanged()) {
-        out += "cloneAvatarEntity";
-    }
-    if (cloneOriginIDChanged()) {
-        out += "cloneOriginID";
+    // Shape
+    if (shapeChanged()) {
+        out += "shape";
     }
 
+    // Material
+    if (materialURLChanged()) {
+        out += "materialURL";
+    }
+    if (materialMappingModeChanged()) {
+        out += "materialMappingMode";
+    }
+    if (priorityChanged()) {
+        out += "priority";
+    }
+    if (parentMaterialNameChanged()) {
+        out += "parentMaterialName";
+    }
+    if (materialMappingPosChanged()) {
+        out += "materialMappingPos";
+    }
+    if (materialMappingScaleChanged()) {
+        out += "materialMappingScale";
+    }
+    if (materialMappingRotChanged()) {
+        out += "materialMappingRot";
+    }
+    if (materialDataChanged()) {
+        out += "materialData";
+    }
+    if (materialRepeatChanged()) {
+        out += "materialRepeat";
+    }
+
+    // Image
     if (imageURLChanged()) {
         out += "imageURL";
     }
@@ -4135,10 +4326,7 @@ QList<QString> EntityItemProperties::listChangedProperties() {
         out += "subImage";
     }
 
-    if (billboardModeChanged()) {
-        out += "billboardMode";
-    }
-
+    // Grid
     if (followCameraChanged()) {
         out += "followCamera";
     }
@@ -4149,33 +4337,6 @@ QList<QString> EntityItemProperties::listChangedProperties() {
         out += "minorGridEvery";
     }
 
-    if (textAlphaChanged()) {
-        out += "textAlpha";
-    }
-    if (backgroundAlphaChanged()) {
-        out += "backgroundAlpha";
-    }
-    if (leftMarginChanged()) {
-        out += "leftMargin";
-    }
-    if (rightMarginChanged()) {
-        out += "rightMargin";
-    }
-    if (topMarginChanged()) {
-        out += "topMargin";
-    }
-    if (bottomMarginChanged()) {
-        out += "bottomMargin";
-    }
-
-    getAnimation().listChangedProperties(out);
-    getKeyLight().listChangedProperties(out);
-    getAmbientLight().listChangedProperties(out);
-    getSkybox().listChangedProperties(out);
-    getHaze().listChangedProperties(out);
-    getBloom().listChangedProperties(out);
-    getGrab().listChangedProperties(out);
-
     return out;
 }
 
@@ -4366,3 +4527,18 @@ void EntityItemProperties::convertToCloneProperties(const EntityItemID& entityID
     setCloneDynamic(ENTITY_ITEM_DEFAULT_CLONE_DYNAMIC);
     setCloneAvatarEntity(ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY);
 }
+
+QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f) {
+    QString result = "[ ";
+
+    for (int i = 0; i < PROP_AFTER_LAST_ITEM; i++) {
+        auto prop = EntityPropertyList(i);
+        if (f.getHasProperty(prop)) {
+            result = result + _enumsToPropertyStrings[prop] + " ";
+        }
+    }
+
+    result += "]";
+    dbg.nospace() << result;
+    return dbg;
+}
diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h
index 05235f20ef..b741bb8ca4 100644
--- a/libraries/entities/src/EntityItemProperties.h
+++ b/libraries/entities/src/EntityItemProperties.h
@@ -129,6 +129,7 @@ public:
     // bool _fooChanged { false };
 
     // Core Properties
+    DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner, SimulationOwner());
     DEFINE_PROPERTY(PROP_VISIBLE, Visible, visible, bool, ENTITY_ITEM_DEFAULT_VISIBLE);
     DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString, ENTITY_ITEM_DEFAULT_NAME);
     DEFINE_PROPERTY(PROP_LOCKED, Locked, locked, bool, ENTITY_ITEM_DEFAULT_LOCKED);
@@ -164,7 +165,6 @@ public:
     DEFINE_PROPERTY(PROP_COLLISIONLESS, Collisionless, collisionless, bool, ENTITY_ITEM_DEFAULT_COLLISIONLESS);
     DEFINE_PROPERTY(PROP_COLLISION_MASK, CollisionMask, collisionMask, uint16_t, ENTITY_COLLISION_MASK_DEFAULT);
     DEFINE_PROPERTY(PROP_DYNAMIC, Dynamic, dynamic, bool, ENTITY_ITEM_DEFAULT_DYNAMIC);
-    DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner, SimulationOwner());
     DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL);
     DEFINE_PROPERTY_REF(PROP_ACTION_DATA, ActionData, actionData, QByteArray, QByteArray());
 
@@ -181,8 +181,34 @@ public:
     DEFINE_PROPERTY(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64, ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP);
     DEFINE_PROPERTY_REF(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString, ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS);
 
-    // Particles
+    // Certifiable Properties - related to Proof of Purchase certificates
+    DEFINE_PROPERTY_REF(PROP_ITEM_NAME, ItemName, itemName, QString, ENTITY_ITEM_DEFAULT_ITEM_NAME);
+    DEFINE_PROPERTY_REF(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString, ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION);
+    DEFINE_PROPERTY_REF(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString, ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES);
+    DEFINE_PROPERTY_REF(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString, ENTITY_ITEM_DEFAULT_ITEM_ARTIST);
+    DEFINE_PROPERTY_REF(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString, ENTITY_ITEM_DEFAULT_ITEM_LICENSE);
+    DEFINE_PROPERTY_REF(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32, ENTITY_ITEM_DEFAULT_LIMITED_RUN);
+    DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID);
+    DEFINE_PROPERTY_REF(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32, ENTITY_ITEM_DEFAULT_EDITION_NUMBER);
+    DEFINE_PROPERTY_REF(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32, ENTITY_ITEM_DEFAULT_ENTITY_INSTANCE_NUMBER);
+    DEFINE_PROPERTY_REF(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString, ENTITY_ITEM_DEFAULT_CERTIFICATE_ID);
+    DEFINE_PROPERTY_REF(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32, ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION);
+
+    // these are used when bouncing location data into and out of scripts
+    DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
+    DEFINE_PROPERTY_REF(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat, ENTITY_ITEM_DEFAULT_ROTATION);
+    DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
+    DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
+    DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
+
+    // Common
     DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType, SHAPE_TYPE_NONE);
+    DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString, "");
+    DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, u8vec3Color, particle::DEFAULT_COLOR);
+    DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, particle::DEFAULT_ALPHA);
+    DEFINE_PROPERTY_REF(PROP_TEXTURES, Textures, textures, QString, "");
+
+    // Particles
     DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32, particle::DEFAULT_MAX_PARTICLES);
     DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float, particle::DEFAULT_LIFESPAN);
     DEFINE_PROPERTY(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool, true);
@@ -192,25 +218,22 @@ public:
     DEFINE_PROPERTY_REF(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat, particle::DEFAULT_EMIT_ORIENTATION);
     DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, glm::vec3, particle::DEFAULT_EMIT_DIMENSIONS);
     DEFINE_PROPERTY(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float, particle::DEFAULT_EMIT_RADIUS_START);
-    DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3, particle::DEFAULT_EMIT_ACCELERATION);
-    DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3, particle::DEFAULT_ACCELERATION_SPREAD);
     DEFINE_PROPERTY(PROP_POLAR_START, PolarStart, polarStart, float, particle::DEFAULT_POLAR_START);
     DEFINE_PROPERTY(PROP_POLAR_FINISH, PolarFinish, polarFinish, float, particle::DEFAULT_POLAR_FINISH);
     DEFINE_PROPERTY(PROP_AZIMUTH_START, AzimuthStart, azimuthStart, float, particle::DEFAULT_AZIMUTH_START);
     DEFINE_PROPERTY(PROP_AZIMUTH_FINISH, AzimuthFinish, azimuthFinish, float, particle::DEFAULT_AZIMUTH_FINISH);
+    DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3, particle::DEFAULT_EMIT_ACCELERATION);
+    DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3, particle::DEFAULT_ACCELERATION_SPREAD);
     DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float, particle::DEFAULT_PARTICLE_RADIUS);
     DEFINE_PROPERTY(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float, particle::DEFAULT_RADIUS_SPREAD);
     DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float, particle::DEFAULT_RADIUS_START);
     DEFINE_PROPERTY(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float, particle::DEFAULT_RADIUS_FINISH);
-    DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, u8vec3Color, particle::DEFAULT_COLOR);
     DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color, particle::DEFAULT_COLOR_SPREAD);
     DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED);
     DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED);
-    DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, particle::DEFAULT_ALPHA);
     DEFINE_PROPERTY(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float, particle::DEFAULT_ALPHA_SPREAD);
     DEFINE_PROPERTY(PROP_ALPHA_START, AlphaStart, alphaStart, float, particle::DEFAULT_ALPHA_START);
     DEFINE_PROPERTY(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float, particle::DEFAULT_ALPHA_FINISH);
-    DEFINE_PROPERTY_REF(PROP_TEXTURES, Textures, textures, QString, "");
     DEFINE_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool, particle::DEFAULT_EMITTER_SHOULD_TRAIL);
     DEFINE_PROPERTY(PROP_PARTICLE_SPIN, ParticleSpin, particleSpin, float, particle::DEFAULT_PARTICLE_SPIN);
     DEFINE_PROPERTY(PROP_SPIN_SPREAD, SpinSpread, spinSpread, float, particle::DEFAULT_SPIN_SPREAD);
@@ -220,7 +243,6 @@ public:
 
     // Model
     DEFINE_PROPERTY_REF(PROP_MODEL_URL, ModelURL, modelURL, QString, "");
-    DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString, "");
     DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector<bool>, QVector<bool>());
     DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector<glm::quat>, QVector<glm::quat>());
     DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector<bool>, QVector<bool>());
@@ -281,14 +303,11 @@ public:
     DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString, "");
     DEFINE_PROPERTY_REF(PROP_DPI, DPI, dpi, uint16_t, ENTITY_ITEM_DEFAULT_DPI);
 
-    // Line
-    DEFINE_PROPERTY(PROP_LINE_WIDTH, LineWidth, lineWidth, float, LineEntityItem::DEFAULT_LINE_WIDTH);
-    DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
-
     // Polyline
-    DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
-    DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
+    DEFINE_PROPERTY_REF(PROP_LINE_POINTS, LinePoints, linePoints, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
     DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector<float>, QVector<float>());
+    DEFINE_PROPERTY(PROP_STROKE_NORMALS, Normals, normals, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
+    DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
     DEFINE_PROPERTY(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, bool, true);
 
     // Shape
@@ -316,26 +335,6 @@ public:
     DEFINE_PROPERTY(PROP_MAJOR_GRID_EVERY, MajorGridEvery, majorGridEvery, uint32_t, GridEntityItem::DEFAULT_MAJOR_GRID_EVERY);
     DEFINE_PROPERTY(PROP_MINOR_GRID_EVERY, MinorGridEvery, minorGridEvery, float, GridEntityItem::DEFAULT_MINOR_GRID_EVERY);
 
-    // Certifiable Properties - related to Proof of Purchase certificates
-    DEFINE_PROPERTY_REF(PROP_ITEM_NAME, ItemName, itemName, QString, ENTITY_ITEM_DEFAULT_ITEM_NAME);
-    DEFINE_PROPERTY_REF(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString, ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION);
-    DEFINE_PROPERTY_REF(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString, ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES);
-    DEFINE_PROPERTY_REF(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString, ENTITY_ITEM_DEFAULT_ITEM_ARTIST);
-    DEFINE_PROPERTY_REF(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString, ENTITY_ITEM_DEFAULT_ITEM_LICENSE);
-    DEFINE_PROPERTY_REF(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32, ENTITY_ITEM_DEFAULT_LIMITED_RUN);
-    DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID);
-    DEFINE_PROPERTY_REF(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32, ENTITY_ITEM_DEFAULT_EDITION_NUMBER);
-    DEFINE_PROPERTY_REF(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32, ENTITY_ITEM_DEFAULT_ENTITY_INSTANCE_NUMBER);
-    DEFINE_PROPERTY_REF(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString, ENTITY_ITEM_DEFAULT_CERTIFICATE_ID);
-    DEFINE_PROPERTY_REF(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32, ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION);
-
-    // these are used when bouncing location data into and out of scripts
-    DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
-    DEFINE_PROPERTY_REF(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat, ENTITY_ITEM_DEFAULT_ROTATION);
-    DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
-    DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
-    DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
-
     static QString getComponentModeAsString(uint32_t mode);
 
     std::array<ComponentPair, COMPONENT_MODE_ITEM_COUNT>::const_iterator findComponent(const QString& mode);
@@ -350,9 +349,6 @@ public:
     bool containsPositionChange() const { return _positionChanged; }
     bool containsDimensionsChange() const { return _dimensionsChanged; }
 
-    float getLocalRenderAlpha() const { return _localRenderAlpha; }
-    void setLocalRenderAlpha(float value) { _localRenderAlpha = value; _localRenderAlphaChanged = true; }
-
     static OctreeElement::AppendState encodeEntityEditPacket(PacketType command, EntityItemID id, const EntityItemProperties& properties,
                                        QByteArray& buffer, EntityPropertyFlags requestedProperties, EntityPropertyFlags& didntFitProperties);
 
@@ -363,8 +359,6 @@ public:
     static bool decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes,
                                        EntityItemID& entityID, EntityItemProperties& properties);
 
-    bool localRenderAlphaChanged() const { return _localRenderAlphaChanged; }
-
     void clearID() { _id = UNKNOWN_ENTITY_ID; _idSet = false; }
     void markAllChanged();
 
@@ -455,8 +449,6 @@ private:
     EntityTypes::EntityType _type;
     void setType(const QString& typeName) { _type = EntityTypes::getEntityTypeFromName(typeName); }
 
-    float _localRenderAlpha;
-    bool _localRenderAlphaChanged;
     bool _defaultSettings;
     bool _dimensionsInitialized = true; // Only false if creating an entity locally with no dimensions properties
 
@@ -490,6 +482,8 @@ void EntityPropertyFlagsFromScriptValue(const QScriptValue& object, EntityProper
 inline void EntityItemProperties::setPosition(const glm::vec3& value)
                     { _position = glm::clamp(value, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; }
 
+QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f);
+
 inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) {
     debug << "EntityItemProperties[" << "\n";
 
diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h
index 6c39e90c91..3c4577ba2f 100644
--- a/libraries/entities/src/EntityItemPropertiesDefaults.h
+++ b/libraries/entities/src/EntityItemPropertiesDefaults.h
@@ -44,7 +44,6 @@ const QString ENTITY_ITEM_DEFAULT_CERTIFICATE_ID = QString("");
 const quint32 ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION = 0;
 
 const float ENTITY_ITEM_DEFAULT_ALPHA = 1.0f;
-const float ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA = 1.0f;
 const bool ENTITY_ITEM_DEFAULT_VISIBLE = true;
 const bool ENTITY_ITEM_DEFAULT_VISIBLE_IN_SECONDARY_CAMERA = true;
 const bool ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW { true };
diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h
index c963c66187..76723526db 100644
--- a/libraries/entities/src/EntityItemPropertiesMacros.h
+++ b/libraries/entities/src/EntityItemPropertiesMacros.h
@@ -411,10 +411,12 @@ inline QRect QRect_convertFromScriptValue(const QScriptValue& v, bool& isValid)
         static T _static##N; 
 
 #define ADD_PROPERTY_TO_MAP(P, N, n, T) \
-        _propertyStringsToEnums[#n] = P;
+        _propertyStringsToEnums[#n] = P; \
+        _enumsToPropertyStrings[P] = #n;
 
 #define ADD_GROUP_PROPERTY_TO_MAP(P, G, g, N, n) \
-        _propertyStringsToEnums[#g "." #n] = P;
+        _propertyStringsToEnums[#g "." #n] = P; \
+        _enumsToPropertyStrings[P] = #g "." #n;
 
 #define DEFINE_CORE(N, n, T, V) \
     public: \
diff --git a/libraries/entities/src/EntityPropertyFlags.cpp b/libraries/entities/src/EntityPropertyFlags.cpp
deleted file mode 100644
index 1f88c03c87..0000000000
--- a/libraries/entities/src/EntityPropertyFlags.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-
-#include "EntityPropertyFlags.h"
-
-
-QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f) {
-    QString result = "[ ";
-
-    result = f.getHasProperty(PROP_PAGED_PROPERTY) ? result + "pagedProperty " : result;
-    result = f.getHasProperty(PROP_CUSTOM_PROPERTIES_INCLUDED) ? result + "customPropertiesIncluded " : result;
-    result = f.getHasProperty(PROP_VISIBLE) ? result + "visible " : result;
-    result = f.getHasProperty(PROP_CAN_CAST_SHADOW) ? result + "canCastShadow " : result;
-    result = f.getHasProperty(PROP_POSITION) ? result + "position " : result;
-    result = f.getHasProperty(PROP_DIMENSIONS) ? result + "dimensions " : result;
-    result = f.getHasProperty(PROP_ROTATION) ? result + "rotation " : result;
-    result = f.getHasProperty(PROP_DENSITY) ? result + "density " : result;
-    result = f.getHasProperty(PROP_VELOCITY) ? result + "velocity " : result;
-    result = f.getHasProperty(PROP_GRAVITY) ? result + "gravity " : result;
-    result = f.getHasProperty(PROP_DAMPING) ? result + "damping " : result;
-    result = f.getHasProperty(PROP_LIFETIME) ? result + "lifetime " : result;
-    result = f.getHasProperty(PROP_SCRIPT) ? result + "script " : result;
-    result = f.getHasProperty(PROP_COLOR) ? result + "color " : result;
-    result = f.getHasProperty(PROP_MODEL_URL) ? result + "modelUrl " : result;
-    result = f.getHasProperty(PROP_ANIMATION_URL) ? result + "animationUrl " : result;
-    result = f.getHasProperty(PROP_ANIMATION_FPS) ? result + "animationFps " : result;
-    result = f.getHasProperty(PROP_ANIMATION_FRAME_INDEX) ? result + "animationFrameIndex " : result;
-    result = f.getHasProperty(PROP_ANIMATION_PLAYING) ? result + "animationPlaying " : result;
-    result = f.getHasProperty(PROP_ANIMATION_ALLOW_TRANSLATION) ? result + "animationAllowTranslation " : result;
-    result = f.getHasProperty(PROP_RELAY_PARENT_JOINTS) ? result + "relayParentJoints " : result;
-    result = f.getHasProperty(PROP_REGISTRATION_POINT) ? result + "registrationPoint " : result;
-    result = f.getHasProperty(PROP_ANGULAR_VELOCITY) ? result + "angularVelocity " : result;
-    result = f.getHasProperty(PROP_ANGULAR_DAMPING) ? result + "angularDamping " : result;
-    result = f.getHasProperty(PROP_COLLISIONLESS) ? result + "collisionless " : result;
-    result = f.getHasProperty(PROP_DYNAMIC) ? result + "dynamic " : result;
-    result = f.getHasProperty(PROP_IS_SPOTLIGHT) ? result + "isSpotlight " : result;
-    result = f.getHasProperty(PROP_DIFFUSE_COLOR) ? result + "diffuseColor " : result;
-    result = f.getHasProperty(PROP_AMBIENT_COLOR_UNUSED) ? result + "ambientColorUnused " : result;
-    result = f.getHasProperty(PROP_SPECULAR_COLOR_UNUSED) ? result + "specularColorUnused " : result;
-    result = f.getHasProperty(PROP_INTENSITY) ? result + "intensity " : result;
-    result = f.getHasProperty(PROP_LINEAR_ATTENUATION_UNUSED) ? result + "linearAttenuationUnused " : result;
-    result = f.getHasProperty(PROP_QUADRATIC_ATTENUATION_UNUSED) ? result + "quadraticAttenuationUnused " : result;
-    result = f.getHasProperty(PROP_EXPONENT) ? result + "exponent " : result;
-    result = f.getHasProperty(PROP_CUTOFF) ? result + "cutoff " : result;
-    result = f.getHasProperty(PROP_LOCKED) ? result + "locked " : result;
-    result = f.getHasProperty(PROP_TEXTURES) ? result + "textures " : result;
-    result = f.getHasProperty(PROP_ANIMATION_SETTINGS_UNUSED) ? result + "animationSettingsUnused " : result;
-    result = f.getHasProperty(PROP_USER_DATA) ? result + "userData " : result;
-    result = f.getHasProperty(PROP_SHAPE_TYPE) ? result + "shapeType " : result;
-    result = f.getHasProperty(PROP_MAX_PARTICLES) ? result + "maxParticles " : result;
-    result = f.getHasProperty(PROP_LIFESPAN) ? result + "lifespan " : result;
-    result = f.getHasProperty(PROP_EMIT_RATE) ? result + "emitRate " : result;
-    result = f.getHasProperty(PROP_EMIT_SPEED) ? result + "emitSpeed " : result;
-    result = f.getHasProperty(PROP_EMIT_STRENGTH) ? result + "emitStrength " : result;
-    result = f.getHasProperty(PROP_EMIT_ACCELERATION) ? result + "emitAcceleration " : result;
-    result = f.getHasProperty(PROP_PARTICLE_RADIUS) ? result + "particleRadius " : result;
-    result = f.getHasProperty(PROP_COMPOUND_SHAPE_URL) ? result + "compoundShapeUrl " : result;
-    result = f.getHasProperty(PROP_MARKETPLACE_ID) ? result + "marketplaceID " : result;
-    result = f.getHasProperty(PROP_ACCELERATION) ? result + "acceleration " : result;
-    result = f.getHasProperty(PROP_SIMULATION_OWNER) ? result + "simulationOwner " : result;
-    result = f.getHasProperty(PROP_NAME) ? result + "name " : result;
-    result = f.getHasProperty(PROP_COLLISION_SOUND_URL) ? result + "collisionSoundUrl " : result;
-    result = f.getHasProperty(PROP_RESTITUTION) ? result + "restitution " : result;
-    result = f.getHasProperty(PROP_FRICTION) ? result + "friction " : result;
-    result = f.getHasProperty(PROP_VOXEL_VOLUME_SIZE) ? result + "voxelVolumeSize " : result;
-    result = f.getHasProperty(PROP_VOXEL_DATA) ? result + "voxelData " : result;
-    result = f.getHasProperty(PROP_VOXEL_SURFACE_STYLE) ? result + "voxelSurfaceStyle " : result;
-    result = f.getHasProperty(PROP_LINE_WIDTH) ? result + "lineWidth " : result;
-    result = f.getHasProperty(PROP_LINE_POINTS) ? result + "linePoints " : result;
-    result = f.getHasProperty(PROP_HREF) ? result + "href " : result;
-    result = f.getHasProperty(PROP_DESCRIPTION) ? result + "description " : result;
-    result = f.getHasProperty(PROP_BILLBOARD_MODE) ? result + "billboardMode " : result;
-    result = f.getHasProperty(PROP_SCRIPT_TIMESTAMP) ? result + "scriptTimestamp " : result;
-    result = f.getHasProperty(PROP_ACTION_DATA) ? result + "actionData " : result;
-    result = f.getHasProperty(PROP_X_TEXTURE_URL) ? result + "xTextureUrl " : result;
-    result = f.getHasProperty(PROP_Y_TEXTURE_URL) ? result + "yTextureUrl " : result;
-    result = f.getHasProperty(PROP_Z_TEXTURE_URL) ? result + "zTextureUrl " : result;
-    result = f.getHasProperty(PROP_NORMALS) ? result + "normals " : result;
-    result = f.getHasProperty(PROP_STROKE_COLORS) ? result + "strokeColors " : result;
-    result = f.getHasProperty(PROP_STROKE_WIDTHS) ? result + "strokeWidths " : result;
-    result = f.getHasProperty(PROP_IS_UV_MODE_STRETCH) ? result + "isUvModeStretch " : result;
-    result = f.getHasProperty(PROP_SPEED_SPREAD) ? result + "speedSpread " : result;
-    result = f.getHasProperty(PROP_ACCELERATION_SPREAD) ? result + "accelerationSpread " : result;
-    result = f.getHasProperty(PROP_X_N_NEIGHBOR_ID) ? result + "xNNeighborID " : result;
-    result = f.getHasProperty(PROP_Y_N_NEIGHBOR_ID) ? result + "yNNeighborID " : result;
-    result = f.getHasProperty(PROP_Z_N_NEIGHBOR_ID) ? result + "zNNeighborID " : result;
-    result = f.getHasProperty(PROP_X_P_NEIGHBOR_ID) ? result + "xPNeighborID " : result;
-    result = f.getHasProperty(PROP_Y_P_NEIGHBOR_ID) ? result + "yPNeighborID " : result;
-    result = f.getHasProperty(PROP_Z_P_NEIGHBOR_ID) ? result + "zPNeighborID " : result;
-    result = f.getHasProperty(PROP_RADIUS_SPREAD) ? result + "radiusSpread " : result;
-    result = f.getHasProperty(PROP_RADIUS_START) ? result + "radiusStart " : result;
-    result = f.getHasProperty(PROP_RADIUS_FINISH) ? result + "radiusFinish " : result;
-    result = f.getHasProperty(PROP_ALPHA) ? result + "alpha " : result;
-    result = f.getHasProperty(PROP_COLOR_SPREAD) ? result + "colorSpread " : result;
-    result = f.getHasProperty(PROP_COLOR_START) ? result + "colorStart " : result;
-    result = f.getHasProperty(PROP_COLOR_FINISH) ? result + "colorFinish " : result;
-    result = f.getHasProperty(PROP_ALPHA_SPREAD) ? result + "alphaSpread " : result;
-    result = f.getHasProperty(PROP_ALPHA_START) ? result + "alphaStart " : result;
-    result = f.getHasProperty(PROP_ALPHA_FINISH) ? result + "alphaFinish " : result;
-    result = f.getHasProperty(PROP_EMIT_ORIENTATION) ? result + "emitOrientation " : result;
-    result = f.getHasProperty(PROP_EMIT_DIMENSIONS) ? result + "emitDimensions " : result;
-    result = f.getHasProperty(PROP_EMIT_RADIUS_START) ? result + "emitRadiusStart " : result;
-    result = f.getHasProperty(PROP_POLAR_START) ? result + "polarStart " : result;
-    result = f.getHasProperty(PROP_POLAR_FINISH) ? result + "polarFinish " : result;
-    result = f.getHasProperty(PROP_AZIMUTH_START) ? result + "azimuthStart " : result;
-    result = f.getHasProperty(PROP_AZIMUTH_FINISH) ? result + "azimuthFinish " : result;
-    result = f.getHasProperty(PROP_ANIMATION_LOOP) ? result + "animationLoop " : result;
-    result = f.getHasProperty(PROP_ANIMATION_FIRST_FRAME) ? result + "animationFirstFrame " : result;
-    result = f.getHasProperty(PROP_ANIMATION_LAST_FRAME) ? result + "animationLastFrame " : result;
-    result = f.getHasProperty(PROP_ANIMATION_HOLD) ? result + "animationHold " : result;
-    result = f.getHasProperty(PROP_ANIMATION_START_AUTOMATICALLY) ? result + "animationStartAutomatically " : result;
-    result = f.getHasProperty(PROP_EMITTER_SHOULD_TRAIL) ? result + "emitterShouldTrail " : result;
-    result = f.getHasProperty(PROP_PARENT_ID) ? result + "parentID " : result;
-    result = f.getHasProperty(PROP_PARENT_JOINT_INDEX) ? result + "parentJointIndex " : result;
-    result = f.getHasProperty(PROP_LOCAL_POSITION) ? result + "localPosition " : result;
-    result = f.getHasProperty(PROP_LOCAL_ROTATION) ? result + "localRotation " : result;
-    result = f.getHasProperty(PROP_QUERY_AA_CUBE) ? result + "queryAaCube " : result;
-    result = f.getHasProperty(PROP_JOINT_ROTATIONS_SET) ? result + "jointRotationsSet " : result;
-    result = f.getHasProperty(PROP_JOINT_ROTATIONS) ? result + "jointRotations " : result;
-    result = f.getHasProperty(PROP_JOINT_TRANSLATIONS_SET) ? result + "jointTranslationsSet " : result;
-    result = f.getHasProperty(PROP_JOINT_TRANSLATIONS) ? result + "jointTranslations " : result;
-    result = f.getHasProperty(PROP_COLLISION_MASK) ? result + "collisionMask " : result;
-    result = f.getHasProperty(PROP_FALLOFF_RADIUS) ? result + "falloffRadius " : result;
-    result = f.getHasProperty(PROP_FLYING_ALLOWED) ? result + "flyingAllowed " : result;
-    result = f.getHasProperty(PROP_GHOSTING_ALLOWED) ? result + "ghostingAllowed " : result;
-    result = f.getHasProperty(PROP_ENTITY_HOST_TYPE) ? result + "entityHostType " : result;
-    result = f.getHasProperty(PROP_OWNING_AVATAR_ID) ? result + "owningAvatarID " : result;
-    result = f.getHasProperty(PROP_SHAPE) ? result + "shape " : result;
-    result = f.getHasProperty(PROP_DPI) ? result + "dpi " : result;
-    result = f.getHasProperty(PROP_LOCAL_VELOCITY) ? result + "localVelocity " : result;
-    result = f.getHasProperty(PROP_LOCAL_ANGULAR_VELOCITY) ? result + "localAngularVelocity " : result;
-    result = f.getHasProperty(PROP_LAST_EDITED_BY) ? result + "lastEditedBy " : result;
-    result = f.getHasProperty(PROP_SERVER_SCRIPTS) ? result + "serverScripts " : result;
-    result = f.getHasProperty(PROP_FILTER_URL) ? result + "filterUrl " : result;
-    result = f.getHasProperty(PROP_ITEM_NAME) ? result + "itemName " : result;
-    result = f.getHasProperty(PROP_ITEM_DESCRIPTION) ? result + "itemDescription " : result;
-    result = f.getHasProperty(PROP_ITEM_CATEGORIES) ? result + "itemCategories " : result;
-    result = f.getHasProperty(PROP_ITEM_ARTIST) ? result + "itemArtist " : result;
-    result = f.getHasProperty(PROP_ITEM_LICENSE) ? result + "itemLicense " : result;
-    result = f.getHasProperty(PROP_LIMITED_RUN) ? result + "limitedRun " : result;
-    result = f.getHasProperty(PROP_EDITION_NUMBER) ? result + "editionNumber " : result;
-    result = f.getHasProperty(PROP_ENTITY_INSTANCE_NUMBER) ? result + "entityInstanceNumber " : result;
-    result = f.getHasProperty(PROP_CERTIFICATE_ID) ? result + "certificateID " : result;
-    result = f.getHasProperty(PROP_STATIC_CERTIFICATE_VERSION) ? result + "staticCertificateVersion " : result;
-    result = f.getHasProperty(PROP_CLONEABLE) ? result + "cloneable " : result;
-    result = f.getHasProperty(PROP_CLONE_LIFETIME) ? result + "cloneLifetime " : result;
-    result = f.getHasProperty(PROP_CLONE_LIMIT) ? result + "cloneLimit " : result;
-    result = f.getHasProperty(PROP_CLONE_DYNAMIC) ? result + "cloneDynamic " : result;
-    result = f.getHasProperty(PROP_CLONE_AVATAR_ENTITY) ? result + "cloneAvatarEntity " : result;
-    result = f.getHasProperty(PROP_CLONE_ORIGIN_ID) ? result + "cloneOriginID " : result;
-    result = f.getHasProperty(PROP_HAZE_MODE) ? result + "hazeMode " : result;
-    result = f.getHasProperty(PROP_KEYLIGHT_COLOR) ? result + "keylightColor " : result;
-    result = f.getHasProperty(PROP_KEYLIGHT_INTENSITY) ? result + "keylightIntensity " : result;
-    result = f.getHasProperty(PROP_KEYLIGHT_DIRECTION) ? result + "keylightDirection " : result;
-    result = f.getHasProperty(PROP_KEYLIGHT_CAST_SHADOW) ? result + "keylightCastShadow " : result;
-    result = f.getHasProperty(PROP_HAZE_RANGE) ? result + "hazeRange " : result;
-    result = f.getHasProperty(PROP_HAZE_COLOR) ? result + "hazeColor " : result;
-    result = f.getHasProperty(PROP_HAZE_GLARE_COLOR) ? result + "hazeGlareColor " : result;
-    result = f.getHasProperty(PROP_HAZE_ENABLE_GLARE) ? result + "hazeEnableGlare " : result;
-    result = f.getHasProperty(PROP_HAZE_GLARE_ANGLE) ? result + "hazeGlareAngle " : result;
-    result = f.getHasProperty(PROP_HAZE_ALTITUDE_EFFECT) ? result + "hazeAltitudeEffect " : result;
-    result = f.getHasProperty(PROP_HAZE_CEILING) ? result + "hazeCeiling " : result;
-    result = f.getHasProperty(PROP_HAZE_BASE_REF) ? result + "hazeBaseRef " : result;
-    result = f.getHasProperty(PROP_HAZE_BACKGROUND_BLEND) ? result + "hazeBackgroundBlend " : result;
-    result = f.getHasProperty(PROP_HAZE_ATTENUATE_KEYLIGHT) ? result + "hazeAttenuateKeylight " : result;
-    result = f.getHasProperty(PROP_HAZE_KEYLIGHT_RANGE) ? result + "hazeKeylightRange " : result;
-    result = f.getHasProperty(PROP_HAZE_KEYLIGHT_ALTITUDE) ? result + "hazeKeylightAltitude " : result;
-    result = f.getHasProperty(PROP_KEY_LIGHT_MODE) ? result + "keyLightMode " : result;
-    result = f.getHasProperty(PROP_AMBIENT_LIGHT_MODE) ? result + "ambientLightMode " : result;
-    result = f.getHasProperty(PROP_SKYBOX_MODE) ? result + "skyboxMode " : result;
-    result = f.getHasProperty(PROP_LOCAL_DIMENSIONS) ? result + "localDimensions " : result;
-    result = f.getHasProperty(PROP_MATERIAL_URL) ? result + "materialUrl " : result;
-    result = f.getHasProperty(PROP_MATERIAL_MAPPING_MODE) ? result + "materialMappingMode " : result;
-    result = f.getHasProperty(PROP_MATERIAL_PRIORITY) ? result + "materialPriority " : result;
-    result = f.getHasProperty(PROP_PARENT_MATERIAL_NAME) ? result + "parentMaterialName " : result;
-    result = f.getHasProperty(PROP_MATERIAL_MAPPING_POS) ? result + "materialMappingPos " : result;
-    result = f.getHasProperty(PROP_MATERIAL_MAPPING_SCALE) ? result + "materialMappingScale " : result;
-    result = f.getHasProperty(PROP_MATERIAL_MAPPING_ROT) ? result + "materialMappingRot " : result;
-    result = f.getHasProperty(PROP_MATERIAL_DATA) ? result + "materialData " : result;
-    result = f.getHasProperty(PROP_MATERIAL_REPEAT) ? result + "materialRepeat " : result;
-    result = f.getHasProperty(PROP_VISIBLE_IN_SECONDARY_CAMERA) ? result + "visibleInSecondaryCamera " : result;
-    result = f.getHasProperty(PROP_PARTICLE_SPIN) ? result + "particleSpin " : result;
-    result = f.getHasProperty(PROP_SPIN_START) ? result + "spinStart " : result;
-    result = f.getHasProperty(PROP_SPIN_FINISH) ? result + "spinFinish " : result;
-    result = f.getHasProperty(PROP_SPIN_SPREAD) ? result + "spinSpread " : result;
-    result = f.getHasProperty(PROP_PARTICLE_ROTATE_WITH_ENTITY) ? result + "particleRotateWithEntity " : result;
-    result = f.getHasProperty(PROP_BLOOM_INTENSITY) ? result + "bloomIntensity " : result;
-    result = f.getHasProperty(PROP_BLOOM_THRESHOLD) ? result + "bloomThreshold " : result;
-    result = f.getHasProperty(PROP_BLOOM_SIZE) ? result + "bloomSize " : result;
-    result = f.getHasProperty(PROP_GRAB_GRABBABLE) ? result + "grab.Grabbable " : result;
-    result = f.getHasProperty(PROP_GRAB_KINEMATIC) ? result + "grab.Kinematic " : result;
-    result = f.getHasProperty(PROP_GRAB_FOLLOWS_CONTROLLER) ? result + "grab.FollowsController " : result;
-    result = f.getHasProperty(PROP_GRAB_TRIGGERABLE) ? result + "grab.Triggerable " : result;
-    result = f.getHasProperty(PROP_GRAB_EQUIPPABLE) ? result + "grab.Equippable " : result;
-    result = f.getHasProperty(PROP_GRAB_DELEGATE_TO_PARENT) ? result + "grab.GrabDelegateToParent " : result;
-    result =
-        f.getHasProperty(PROP_GRAB_LEFT_EQUIPPABLE_POSITION_OFFSET) ? result + "grab.LeftEquippablePositionOffset " : result;
-    result =
-        f.getHasProperty(PROP_GRAB_LEFT_EQUIPPABLE_ROTATION_OFFSET) ? result + "grab.LeftEquippableRotationOffset " : result;
-    result =
-        f.getHasProperty(PROP_GRAB_RIGHT_EQUIPPABLE_POSITION_OFFSET) ? result + "grab.RightEquippablePositionOffset " : result;
-    result =
-        f.getHasProperty(PROP_GRAB_RIGHT_EQUIPPABLE_ROTATION_OFFSET) ? result + "grab.RightEquippableRotationOffset " : result;
-    result = f.getHasProperty(PROP_GRAB_EQUIPPABLE_INDICATOR_URL) ? result + "grab.EquippableIndicatorURL " : result;
-    result = f.getHasProperty(PROP_GRAB_EQUIPPABLE_INDICATOR_SCALE) ? result + "grab.EquippableIndicatorScale " : result;
-    result = f.getHasProperty(PROP_GRAB_EQUIPPABLE_INDICATOR_OFFSET) ? result + "grab.EquippableIndicatorOffset " : result;
-
-    result += "]";
-    dbg.nospace() << result;
-    return dbg;
-}
diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h
index 1e61894a8b..8e0f5eb387 100644
--- a/libraries/entities/src/EntityPropertyFlags.h
+++ b/libraries/entities/src/EntityPropertyFlags.h
@@ -18,250 +18,28 @@ enum EntityPropertyList {
     PROP_PAGED_PROPERTY,
     PROP_CUSTOM_PROPERTIES_INCLUDED,
 
-    // these properties are supported by the EntityItem base class
+    // Core properties
+    PROP_SIMULATION_OWNER,
     PROP_VISIBLE,
-    PROP_CAN_CAST_SHADOW,
+    PROP_NAME,
+    PROP_LOCKED,
+    PROP_USER_DATA,
+    PROP_HREF,
+    PROP_DESCRIPTION,
     PROP_POSITION,
     PROP_DIMENSIONS,
     PROP_ROTATION,
-    PROP_DENSITY,
-    PROP_VELOCITY,
-    PROP_GRAVITY,
-    PROP_DAMPING,
-    PROP_LIFETIME,
-    PROP_SCRIPT,
-
-    // these properties are supported by some derived classes
-    PROP_COLOR,
-
-    // these are used by models only
-    PROP_MODEL_URL,
-    PROP_ANIMATION_URL,
-    PROP_ANIMATION_FPS,
-    PROP_ANIMATION_FRAME_INDEX,
-    PROP_ANIMATION_PLAYING,
-    PROP_ANIMATION_ALLOW_TRANSLATION,
-    PROP_RELAY_PARENT_JOINTS,
-
-    // these properties are supported by the EntityItem base class
     PROP_REGISTRATION_POINT,
-    PROP_ANGULAR_VELOCITY,
-    PROP_ANGULAR_DAMPING,
-    PROP_COLLISIONLESS,
-    PROP_DYNAMIC, // 24
-
-    // property used by Light entity
-    PROP_IS_SPOTLIGHT,
-    PROP_DIFFUSE_COLOR,
-    PROP_AMBIENT_COLOR_UNUSED, // FIXME - No longer used, can remove and bump protocol
-    PROP_SPECULAR_COLOR_UNUSED, // FIXME - No longer used, can remove and bump protocol
-    PROP_INTENSITY, // Previously PROP_CONSTANT_ATTENUATION
-    PROP_LINEAR_ATTENUATION_UNUSED,
-    PROP_QUADRATIC_ATTENUATION_UNUSED,
-    PROP_EXPONENT,
-    PROP_CUTOFF,
-
-    // available to all entities
-    PROP_LOCKED,  // 34
-
-    PROP_TEXTURES,  // used by Model entities
-    PROP_ANIMATION_SETTINGS_UNUSED,  // FIXME - No longer used, can remove and bump protocol
-    PROP_USER_DATA,  // all entities -- 37
-    PROP_SHAPE_TYPE, // used by Model + zones entities
-
-    // used by ParticleEffect entities
-    PROP_MAX_PARTICLES, // 39
-    PROP_LIFESPAN, // 40 -- used by all entities
-    PROP_EMIT_RATE,
-    PROP_EMIT_SPEED,
-    PROP_EMIT_STRENGTH,
-    PROP_EMIT_ACCELERATION, // FIXME - doesn't seem to get set in mark all changed????
-    PROP_PARTICLE_RADIUS,  // 45!!
-
-    PROP_COMPOUND_SHAPE_URL, // used by Model + zones entities
-    PROP_MARKETPLACE_ID, // all entities
-    PROP_ACCELERATION, // all entities
-    PROP_SIMULATION_OWNER, // formerly known as PROP_SIMULATOR_ID
-    PROP_NAME, // all entities -- 50
-    PROP_COLLISION_SOUND_URL,
-    PROP_RESTITUTION,
-    PROP_FRICTION, // 53
-
-    PROP_VOXEL_VOLUME_SIZE,
-    PROP_VOXEL_DATA,
-    PROP_VOXEL_SURFACE_STYLE,
-
-    //for lines
-    PROP_LINE_WIDTH,
-    PROP_LINE_POINTS,
-
-    // used by hyperlinks
-    PROP_HREF,
-    PROP_DESCRIPTION, // 61
-
-    PROP_BILLBOARD_MODE,
-    PROP_SCRIPT_TIMESTAMP,
-
-    PROP_ACTION_DATA,
-
-    PROP_X_TEXTURE_URL, // used by PolyVox
-    PROP_Y_TEXTURE_URL, // used by PolyVox
-    PROP_Z_TEXTURE_URL, // used by PolyVox
-
-    // Used by PolyLine entity
-    PROP_NORMALS,
-    PROP_STROKE_COLORS,
-    PROP_STROKE_WIDTHS,
-    PROP_IS_UV_MODE_STRETCH,
-
-    // used by particles
-    PROP_SPEED_SPREAD,
-    PROP_ACCELERATION_SPREAD,
-
-    PROP_X_N_NEIGHBOR_ID, // used by PolyVox
-    PROP_Y_N_NEIGHBOR_ID, // used by PolyVox
-    PROP_Z_N_NEIGHBOR_ID, // used by PolyVox
-    PROP_X_P_NEIGHBOR_ID, // used by PolyVox
-    PROP_Y_P_NEIGHBOR_ID, // used by PolyVox
-    PROP_Z_P_NEIGHBOR_ID, // used by PolyVox
-
-    // Used by particles
-    PROP_RADIUS_SPREAD,
-    PROP_RADIUS_START,
-    PROP_RADIUS_FINISH,
-
-    PROP_ALPHA,  // Supported by some derived classes
-
-    //Used by particles
-    PROP_COLOR_SPREAD,
-    PROP_COLOR_START,
-    PROP_COLOR_FINISH,
-    PROP_ALPHA_SPREAD,
-    PROP_ALPHA_START,
-    PROP_ALPHA_FINISH,
-    PROP_EMIT_ORIENTATION,
-    PROP_EMIT_DIMENSIONS,
-    PROP_EMIT_RADIUS_START,
-    PROP_POLAR_START,
-    PROP_POLAR_FINISH,
-    PROP_AZIMUTH_START,
-    PROP_AZIMUTH_FINISH,
-
-    PROP_ANIMATION_LOOP,
-    PROP_ANIMATION_FIRST_FRAME,
-    PROP_ANIMATION_LAST_FRAME,
-    PROP_ANIMATION_HOLD,
-    PROP_ANIMATION_START_AUTOMATICALLY,
-
-    PROP_EMITTER_SHOULD_TRAIL,
-
+    PROP_CREATED,
+    PROP_LAST_EDITED_BY,
+    PROP_ENTITY_HOST_TYPE,            // not sent over wire
+    PROP_OWNING_AVATAR_ID,            // not sent over wire
     PROP_PARENT_ID,
     PROP_PARENT_JOINT_INDEX,
-
-    PROP_LOCAL_POSITION, // only used to convert values to and from scripts
-    PROP_LOCAL_ROTATION, // only used to convert values to and from scripts
-
-    PROP_QUERY_AA_CUBE, // how the EntityTree considers the size and position on an entity
-
-    // ModelEntity joint state
-    PROP_JOINT_ROTATIONS_SET,
-    PROP_JOINT_ROTATIONS,
-    PROP_JOINT_TRANSLATIONS_SET,
-    PROP_JOINT_TRANSLATIONS,
-
-    PROP_COLLISION_MASK, // one byte of collision group flags
-
-    PROP_FALLOFF_RADIUS, // for Light entity
-
-    PROP_FLYING_ALLOWED, // can avatars in a zone fly?
-    PROP_GHOSTING_ALLOWED, // can avatars in a zone turn off physics?
-
-    PROP_ENTITY_HOST_TYPE, // doesn't go over wire
-    PROP_OWNING_AVATAR_ID, // doesn't go over wire
-
-    PROP_SHAPE,
-    PROP_DPI,
-
-    PROP_LOCAL_VELOCITY, // only used to convert values to and from scripts
-    PROP_LOCAL_ANGULAR_VELOCITY, // only used to convert values to and from scripts
-
-    PROP_LAST_EDITED_BY,
-
-    PROP_SERVER_SCRIPTS,
-
-    PROP_FILTER_URL,
-
-    // Certificable Properties
-    PROP_ITEM_NAME,
-    PROP_ITEM_DESCRIPTION,
-    PROP_ITEM_CATEGORIES,
-    PROP_ITEM_ARTIST,
-    PROP_ITEM_LICENSE,
-    PROP_LIMITED_RUN,
-    // PROP_MARKETPLACE_ID is above
-    PROP_EDITION_NUMBER,
-    PROP_ENTITY_INSTANCE_NUMBER,
-    PROP_CERTIFICATE_ID,
-    PROP_STATIC_CERTIFICATE_VERSION,
-
-    PROP_CLONEABLE,
-    PROP_CLONE_LIFETIME,
-    PROP_CLONE_LIMIT,
-    PROP_CLONE_DYNAMIC,
-    PROP_CLONE_AVATAR_ENTITY,
-    PROP_CLONE_ORIGIN_ID,
-
-    PROP_HAZE_MODE,
-
-    PROP_KEYLIGHT_COLOR,
-    PROP_KEYLIGHT_INTENSITY,
-    PROP_KEYLIGHT_DIRECTION,
-    PROP_KEYLIGHT_CAST_SHADOW,
-
-    PROP_HAZE_RANGE,
-    PROP_HAZE_COLOR,
-    PROP_HAZE_GLARE_COLOR,
-    PROP_HAZE_ENABLE_GLARE,
-    PROP_HAZE_GLARE_ANGLE,
-
-    PROP_HAZE_ALTITUDE_EFFECT,
-    PROP_HAZE_CEILING,
-    PROP_HAZE_BASE_REF,
-
-    PROP_HAZE_BACKGROUND_BLEND,
-
-    PROP_HAZE_ATTENUATE_KEYLIGHT,
-    PROP_HAZE_KEYLIGHT_RANGE,
-    PROP_HAZE_KEYLIGHT_ALTITUDE,
-
-    PROP_KEY_LIGHT_MODE,
-    PROP_AMBIENT_LIGHT_MODE,
-    PROP_SKYBOX_MODE,
-
-    PROP_LOCAL_DIMENSIONS, // only used to convert values to and from scripts
-
-    PROP_MATERIAL_URL,
-    PROP_MATERIAL_MAPPING_MODE,
-    PROP_MATERIAL_PRIORITY,
-    PROP_PARENT_MATERIAL_NAME,
-    PROP_MATERIAL_MAPPING_POS,
-    PROP_MATERIAL_MAPPING_SCALE,
-    PROP_MATERIAL_MAPPING_ROT,
-    PROP_MATERIAL_DATA,
-
-    PROP_VISIBLE_IN_SECONDARY_CAMERA, // not sent over the wire, only used locally
-
-    PROP_PARTICLE_SPIN,
-    PROP_SPIN_START,
-    PROP_SPIN_FINISH,
-    PROP_SPIN_SPREAD,
-    PROP_PARTICLE_ROTATE_WITH_ENTITY,
-
-    PROP_BLOOM_MODE,
-    PROP_BLOOM_INTENSITY,
-    PROP_BLOOM_THRESHOLD,
-    PROP_BLOOM_SIZE,
-
+    PROP_QUERY_AA_CUBE,
+    PROP_CAN_CAST_SHADOW,
+    PROP_VISIBLE_IN_SECONDARY_CAMERA, // not sent over wire
+    // Grab
     PROP_GRAB_GRABBABLE,
     PROP_GRAB_KINEMATIC,
     PROP_GRAB_FOLLOWS_CONTROLLER,
@@ -276,60 +54,268 @@ enum EntityPropertyList {
     PROP_GRAB_EQUIPPABLE_INDICATOR_SCALE,
     PROP_GRAB_EQUIPPABLE_INDICATOR_OFFSET,
 
-    PROP_MATERIAL_REPEAT,
+    // Physics
+    PROP_DENSITY,
+    PROP_VELOCITY,
+    PROP_ANGULAR_VELOCITY,
+    PROP_GRAVITY,
+    PROP_ACCELERATION,
+    PROP_DAMPING,
+    PROP_ANGULAR_DAMPING,
+    PROP_RESTITUTION,
+    PROP_FRICTION,
+    PROP_LIFETIME,
+    PROP_COLLISIONLESS,
+    PROP_COLLISION_MASK,
+    PROP_DYNAMIC,
+    PROP_COLLISION_SOUND_URL,
+    PROP_ACTION_DATA,
 
-    PROP_EMISSIVE,
-    PROP_SUB_IMAGE,
+    // Cloning
+    PROP_CLONEABLE,
+    PROP_CLONE_LIFETIME,
+    PROP_CLONE_LIMIT,
+    PROP_CLONE_DYNAMIC,
+    PROP_CLONE_AVATAR_ENTITY,
+    PROP_CLONE_ORIGIN_ID,
 
-    PROP_LEFT_MARGIN,
-    PROP_RIGHT_MARGIN,
-    PROP_TOP_MARGIN,
-    PROP_BOTTOM_MARGIN,
+    // Scripts
+    PROP_SCRIPT,
+    PROP_SCRIPT_TIMESTAMP,
+    PROP_SERVER_SCRIPTS,
+
+    // Certifiable Properties
+    PROP_ITEM_NAME,
+    PROP_ITEM_DESCRIPTION,
+    PROP_ITEM_CATEGORIES,
+    PROP_ITEM_ARTIST,
+    PROP_ITEM_LICENSE,
+    PROP_LIMITED_RUN,
+    PROP_MARKETPLACE_ID,
+    PROP_EDITION_NUMBER,
+    PROP_ENTITY_INSTANCE_NUMBER,
+    PROP_CERTIFICATE_ID,
+    PROP_STATIC_CERTIFICATE_VERSION,
+
+    // Used to convert values to and from scripts
+    PROP_LOCAL_POSITION,
+    PROP_LOCAL_ROTATION,
+    PROP_LOCAL_VELOCITY,
+    PROP_LOCAL_ANGULAR_VELOCITY,
+    PROP_LOCAL_DIMENSIONS,
+    
+    // These properties are used by multiple subtypes but aren't in the base EntityItem
+    PROP_SHAPE_TYPE,
+    PROP_COMPOUND_SHAPE_URL,
+    PROP_COLOR,
+    PROP_ALPHA,
+    PROP_TEXTURES,
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////
-    // ATTENTION: add new properties to end of list just ABOVE this line
+    // ATTENTION: add new shared EntityItem properties to the list ABOVE this line
+    ////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    // We need as many of these as the number of unique properties of a derived EntityItem class
+    PROP_DERIVED_0,
+    PROP_DERIVED_1,
+    PROP_DERIVED_2,
+    PROP_DERIVED_3,
+    PROP_DERIVED_4,
+    PROP_DERIVED_5,
+    PROP_DERIVED_6,
+    PROP_DERIVED_7,
+    PROP_DERIVED_8,
+    PROP_DERIVED_9,
+    PROP_DERIVED_10,
+    PROP_DERIVED_11,
+    PROP_DERIVED_12,
+    PROP_DERIVED_13,
+    PROP_DERIVED_14,
+    PROP_DERIVED_15,
+    PROP_DERIVED_16,
+    PROP_DERIVED_17,
+    PROP_DERIVED_18,
+    PROP_DERIVED_19,
+    PROP_DERIVED_20,
+    PROP_DERIVED_21,
+    PROP_DERIVED_22,
+    PROP_DERIVED_23,
+    PROP_DERIVED_24,
+    PROP_DERIVED_25,
+    PROP_DERIVED_26,
+    PROP_DERIVED_27,
+    PROP_DERIVED_28,
+    PROP_DERIVED_29,
+    PROP_DERIVED_30,
+
     PROP_AFTER_LAST_ITEM,
-    ////////////////////////////////////////////////////////////////////////////////////////////////////
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////
-    // WARNING! Do not add props here unless you intentionally mean to reuse PROP_ indexes
+    // WARNING! Do not add props here unless you intentionally mean to reuse PROP_DERIVED_X indexes
     //
-    // These properties of TextEntity piggy back off of properties of ModelEntities, the type doesn't matter
-    // since the derived class knows how to interpret it's own properties and knows the types it expects
-    PROP_TEXT_COLOR = PROP_COLOR,
-    PROP_TEXT_ALPHA = PROP_ALPHA,
-    PROP_TEXT = PROP_MODEL_URL,
-    PROP_LINE_HEIGHT = PROP_ANIMATION_URL,
-    PROP_BACKGROUND_COLOR = PROP_ANIMATION_FPS,
-    PROP_BACKGROUND_ALPHA = PROP_ALPHA_START,
-
-    // Aliases/Piggyback properties for Zones. These properties intentionally reuse the enum values for
-    // other properties which will never overlap with each other. We do this so that we don't have to expand
+    // These properties intentionally reuse the enum values for other properties which will never overlap with each other. We do this so that we don't have to expand
     // the size of the properties bitflags mask
-    PROP_SKYBOX_COLOR = PROP_ANIMATION_URL,
-    PROP_SKYBOX_URL = PROP_ANIMATION_FPS,
+    //
+    // Only add properties here that are only used by one subclass.  Otherwise, they should go above to prevent collisions
 
-    PROP_AMBIENT_LIGHT_INTENSITY = PROP_CUTOFF,
-    PROP_AMBIENT_LIGHT_URL = PROP_ANIMATION_PLAYING,
+    // Particles
+    PROP_MAX_PARTICLES = PROP_DERIVED_0,
+    PROP_LIFESPAN = PROP_DERIVED_1,
+    PROP_EMITTING_PARTICLES = PROP_DERIVED_2,
+    PROP_EMIT_RATE = PROP_DERIVED_3,
+    PROP_EMIT_SPEED = PROP_DERIVED_4,
+    PROP_SPEED_SPREAD = PROP_DERIVED_5,
+    PROP_EMIT_ORIENTATION = PROP_DERIVED_6,
+    PROP_EMIT_DIMENSIONS = PROP_DERIVED_7,
+    PROP_ACCELERATION_SPREAD = PROP_DERIVED_8,
+    PROP_POLAR_START = PROP_DERIVED_9,
+    PROP_POLAR_FINISH = PROP_DERIVED_10,
+    PROP_AZIMUTH_START = PROP_DERIVED_11,
+    PROP_AZIMUTH_FINISH = PROP_DERIVED_12,
+    PROP_EMIT_RADIUS_START = PROP_DERIVED_13,
+    PROP_EMIT_ACCELERATION = PROP_DERIVED_14,
+    PROP_PARTICLE_RADIUS = PROP_DERIVED_15,
+    PROP_RADIUS_SPREAD = PROP_DERIVED_16,
+    PROP_RADIUS_START = PROP_DERIVED_17,
+    PROP_RADIUS_FINISH = PROP_DERIVED_18,
+    PROP_COLOR_SPREAD = PROP_DERIVED_19,
+    PROP_COLOR_START = PROP_DERIVED_20,
+    PROP_COLOR_FINISH = PROP_DERIVED_21,
+    PROP_ALPHA_SPREAD = PROP_DERIVED_22,
+    PROP_ALPHA_START = PROP_DERIVED_23,
+    PROP_ALPHA_FINISH = PROP_DERIVED_24,
+    PROP_EMITTER_SHOULD_TRAIL = PROP_DERIVED_25,
+    PROP_PARTICLE_SPIN = PROP_DERIVED_26,
+    PROP_SPIN_START = PROP_DERIVED_27,
+    PROP_SPIN_FINISH = PROP_DERIVED_28,
+    PROP_SPIN_SPREAD = PROP_DERIVED_29,
+    PROP_PARTICLE_ROTATE_WITH_ENTITY = PROP_DERIVED_30,
 
-    // Aliases/Piggyback properties for Web. These properties intentionally reuse the enum values for
-    // other properties which will never overlap with each other. 
-    PROP_SOURCE_URL = PROP_MODEL_URL,
+    // Model
+    PROP_MODEL_URL = PROP_DERIVED_0,
+    PROP_JOINT_ROTATIONS_SET = PROP_DERIVED_1,
+    PROP_JOINT_ROTATIONS = PROP_DERIVED_2,
+    PROP_JOINT_TRANSLATIONS_SET = PROP_DERIVED_3,
+    PROP_JOINT_TRANSLATIONS = PROP_DERIVED_4,
+    PROP_RELAY_PARENT_JOINTS = PROP_DERIVED_5,
+    // Animation
+    PROP_ANIMATION_URL = PROP_DERIVED_6,
+    PROP_ANIMATION_ALLOW_TRANSLATION = PROP_DERIVED_7,
+    PROP_ANIMATION_FPS = PROP_DERIVED_8,
+    PROP_ANIMATION_FRAME_INDEX = PROP_DERIVED_9,
+    PROP_ANIMATION_PLAYING = PROP_DERIVED_10,
+    PROP_ANIMATION_LOOP = PROP_DERIVED_11,
+    PROP_ANIMATION_FIRST_FRAME = PROP_DERIVED_12,
+    PROP_ANIMATION_LAST_FRAME = PROP_DERIVED_13,
+    PROP_ANIMATION_HOLD = PROP_DERIVED_14,
 
-    // Aliases/Piggyback properties for Particle Emmitter. These properties intentionally reuse the enum values for
-    // other properties which will never overlap with each other. 
-    PROP_EMITTING_PARTICLES = PROP_ANIMATION_PLAYING,
+    // Light
+    PROP_IS_SPOTLIGHT = PROP_DERIVED_0,
+    PROP_INTENSITY = PROP_DERIVED_1,
+    PROP_EXPONENT = PROP_DERIVED_2,
+    PROP_CUTOFF = PROP_DERIVED_3,
+    PROP_FALLOFF_RADIUS = PROP_DERIVED_4,
 
-    // Aliases/Piggyback properties for Image. These properties intentionally reuse the enum values for
-    // other properties which will never overlap with each other. 
-    PROP_IMAGE_URL = PROP_MODEL_URL,
-    PROP_KEEP_ASPECT_RATIO = PROP_ANIMATION_PLAYING,
+    // Text
+    PROP_TEXT = PROP_DERIVED_0,
+    PROP_LINE_HEIGHT = PROP_DERIVED_1,
+    PROP_TEXT_COLOR = PROP_DERIVED_2,
+    PROP_TEXT_ALPHA = PROP_DERIVED_3,
+    PROP_BACKGROUND_COLOR = PROP_DERIVED_4,
+    PROP_BACKGROUND_ALPHA = PROP_DERIVED_5,
+    PROP_BILLBOARD_MODE = PROP_DERIVED_6,
+    PROP_LEFT_MARGIN = PROP_DERIVED_7,
+    PROP_RIGHT_MARGIN = PROP_DERIVED_8,
+    PROP_TOP_MARGIN = PROP_DERIVED_9,
+    PROP_BOTTOM_MARGIN = PROP_DERIVED_10,
 
-    // Aliases/Piggyback properties for Grid. These properties intentionally reuse the enum values for
-    // other properties which will never overlap with each other.
-    PROP_GRID_FOLLOW_CAMERA = PROP_ANIMATION_PLAYING,
-    PROP_MAJOR_GRID_EVERY = PROP_ANIMATION_URL,
-    PROP_MINOR_GRID_EVERY = PROP_ANIMATION_FPS,
+    // Zone
+    // Keylight
+    PROP_KEYLIGHT_COLOR = PROP_DERIVED_0,
+    PROP_KEYLIGHT_INTENSITY = PROP_DERIVED_1,
+    PROP_KEYLIGHT_DIRECTION = PROP_DERIVED_2,
+    PROP_KEYLIGHT_CAST_SHADOW = PROP_DERIVED_3,
+    // Ambient light
+    PROP_AMBIENT_LIGHT_INTENSITY = PROP_DERIVED_4,
+    PROP_AMBIENT_LIGHT_URL = PROP_DERIVED_5,
+    // Skybox
+    PROP_SKYBOX_COLOR = PROP_DERIVED_6,
+    PROP_SKYBOX_URL = PROP_DERIVED_7,
+    // Haze
+    PROP_HAZE_RANGE = PROP_DERIVED_8,
+    PROP_HAZE_COLOR = PROP_DERIVED_9,
+    PROP_HAZE_GLARE_COLOR = PROP_DERIVED_10,
+    PROP_HAZE_ENABLE_GLARE = PROP_DERIVED_11,
+    PROP_HAZE_GLARE_ANGLE = PROP_DERIVED_12,
+    PROP_HAZE_ALTITUDE_EFFECT = PROP_DERIVED_13,
+    PROP_HAZE_CEILING = PROP_DERIVED_14,
+    PROP_HAZE_BASE_REF = PROP_DERIVED_15,
+    PROP_HAZE_BACKGROUND_BLEND = PROP_DERIVED_16,
+    PROP_HAZE_ATTENUATE_KEYLIGHT = PROP_DERIVED_17,
+    PROP_HAZE_KEYLIGHT_RANGE = PROP_DERIVED_18,
+    PROP_HAZE_KEYLIGHT_ALTITUDE = PROP_DERIVED_19,
+    // Bloom
+    PROP_BLOOM_INTENSITY = PROP_DERIVED_20,
+    PROP_BLOOM_THRESHOLD = PROP_DERIVED_21,
+    PROP_BLOOM_SIZE = PROP_DERIVED_22,
+    PROP_FLYING_ALLOWED = PROP_DERIVED_23,
+    PROP_GHOSTING_ALLOWED = PROP_DERIVED_24,
+    PROP_FILTER_URL = PROP_DERIVED_25,
+    PROP_KEY_LIGHT_MODE = PROP_DERIVED_26,
+    PROP_AMBIENT_LIGHT_MODE = PROP_DERIVED_27,
+    PROP_SKYBOX_MODE = PROP_DERIVED_28,
+    PROP_HAZE_MODE = PROP_DERIVED_29,
+    PROP_BLOOM_MODE = PROP_DERIVED_30,
+
+    // Polyvox
+    PROP_VOXEL_VOLUME_SIZE = PROP_DERIVED_0,
+    PROP_VOXEL_DATA = PROP_DERIVED_1,
+    PROP_VOXEL_SURFACE_STYLE = PROP_DERIVED_2,
+    PROP_X_TEXTURE_URL = PROP_DERIVED_3,
+    PROP_Y_TEXTURE_URL = PROP_DERIVED_4,
+    PROP_Z_TEXTURE_URL = PROP_DERIVED_5,
+    PROP_X_N_NEIGHBOR_ID = PROP_DERIVED_6,
+    PROP_Y_N_NEIGHBOR_ID = PROP_DERIVED_7,
+    PROP_Z_N_NEIGHBOR_ID = PROP_DERIVED_8,
+    PROP_X_P_NEIGHBOR_ID = PROP_DERIVED_9,
+    PROP_Y_P_NEIGHBOR_ID = PROP_DERIVED_10,
+    PROP_Z_P_NEIGHBOR_ID = PROP_DERIVED_11,
+
+    // Web
+    PROP_SOURCE_URL = PROP_DERIVED_0,
+    PROP_DPI = PROP_DERIVED_1,
+
+    // Polyline
+    PROP_LINE_POINTS = PROP_DERIVED_0,
+    PROP_STROKE_WIDTHS = PROP_DERIVED_1,
+    PROP_STROKE_NORMALS = PROP_DERIVED_2,
+    PROP_STROKE_COLORS = PROP_DERIVED_3,
+    PROP_IS_UV_MODE_STRETCH = PROP_DERIVED_4,
+
+    // Shape
+    PROP_SHAPE = PROP_DERIVED_0,
+
+    // Material
+    PROP_MATERIAL_URL = PROP_DERIVED_0,
+    PROP_MATERIAL_MAPPING_MODE = PROP_DERIVED_1,
+    PROP_MATERIAL_PRIORITY = PROP_DERIVED_2,
+    PROP_PARENT_MATERIAL_NAME = PROP_DERIVED_3,
+    PROP_MATERIAL_MAPPING_POS = PROP_DERIVED_4,
+    PROP_MATERIAL_MAPPING_SCALE = PROP_DERIVED_5,
+    PROP_MATERIAL_MAPPING_ROT = PROP_DERIVED_6,
+    PROP_MATERIAL_DATA = PROP_DERIVED_7,
+    PROP_MATERIAL_REPEAT = PROP_DERIVED_8,
+
+    // Image
+    PROP_IMAGE_URL = PROP_DERIVED_0,
+    PROP_EMISSIVE = PROP_DERIVED_1,
+    PROP_KEEP_ASPECT_RATIO = PROP_DERIVED_2,
+    PROP_SUB_IMAGE = PROP_DERIVED_3,
+
+    // Grid
+    PROP_GRID_FOLLOW_CAMERA = PROP_DERIVED_0,
+    PROP_MAJOR_GRID_EVERY = PROP_DERIVED_1,
+    PROP_MINOR_GRID_EVERY = PROP_DERIVED_2,
 
     // WARNING!!! DO NOT ADD PROPS_xxx here unless you really really meant to.... Add them UP above
 };
@@ -340,10 +326,4 @@ typedef PropertyFlags<EntityPropertyList> EntityPropertyFlags;
 // one greater than the last item property due to the enum's auto-incrementing.
 extern EntityPropertyList PROP_LAST_ITEM;
 
-QString EntityPropertyFlagsToString(EntityPropertyFlags propertiesFlags);
-
-
-QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f);
-
-
 #endif // hifi_EntityPropertyFlags_h
diff --git a/libraries/entities/src/ImageEntityItem.cpp b/libraries/entities/src/ImageEntityItem.cpp
index 98817a63ba..cdff1b5390 100644
--- a/libraries/entities/src/ImageEntityItem.cpp
+++ b/libraries/entities/src/ImageEntityItem.cpp
@@ -30,30 +30,30 @@ void ImageEntityItem::setUnscaledDimensions(const glm::vec3& value) {
 EntityItemProperties ImageEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const {
     EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class
 
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha);
+
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(imageURL, getImageURL);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(emissive, getEmissive);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(keepAspectRatio, getKeepAspectRatio);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(billboardMode, getBillboardMode);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(subImage, getSubImage);
 
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha);
-
     return properties;
 }
 
 bool ImageEntityItem::setProperties(const EntityItemProperties& properties) {
     bool somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class
 
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha);
+
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(imageURL, setImageURL);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(emissive, setEmissive);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(keepAspectRatio, setKeepAspectRatio);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(billboardMode, setBillboardMode);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(subImage, setSubImage);
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha);
-
     if (somethingChanged) {
         bool wantDebug = false;
         if (wantDebug) {
@@ -75,30 +75,30 @@ int ImageEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
     int bytesRead = 0;
     const unsigned char* dataAt = data;
 
+    READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor);
+    READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha);
+
     READ_ENTITY_PROPERTY(PROP_IMAGE_URL, QString, setImageURL);
     READ_ENTITY_PROPERTY(PROP_EMISSIVE, bool, setEmissive);
     READ_ENTITY_PROPERTY(PROP_KEEP_ASPECT_RATIO, bool, setKeepAspectRatio);
     READ_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, BillboardMode, setBillboardMode);
     READ_ENTITY_PROPERTY(PROP_SUB_IMAGE, QRect, setSubImage);
 
-    READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor);
-    READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha);
-
     return bytesRead;
 }
 
 EntityPropertyFlags ImageEntityItem::getEntityProperties(EncodeBitstreamParams& params) const {
     EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params);
 
+    requestedProperties += PROP_COLOR;
+    requestedProperties += PROP_ALPHA;
+
     requestedProperties += PROP_IMAGE_URL;
     requestedProperties += PROP_EMISSIVE;
     requestedProperties += PROP_KEEP_ASPECT_RATIO;
     requestedProperties += PROP_BILLBOARD_MODE;
     requestedProperties += PROP_SUB_IMAGE;
 
-    requestedProperties += PROP_COLOR;
-    requestedProperties += PROP_ALPHA;
-
     return requestedProperties;
 }
 
@@ -112,14 +112,14 @@ void ImageEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit
 
     bool successPropertyFits = true;
 
+    APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
+    APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha());
+
     APPEND_ENTITY_PROPERTY(PROP_IMAGE_URL, getImageURL());
     APPEND_ENTITY_PROPERTY(PROP_EMISSIVE, getEmissive());
     APPEND_ENTITY_PROPERTY(PROP_KEEP_ASPECT_RATIO, getKeepAspectRatio());
     APPEND_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, (uint32_t)getBillboardMode());
     APPEND_ENTITY_PROPERTY(PROP_SUB_IMAGE, getSubImage());
-
-    APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
-    APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha());
 }
 
 bool ImageEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp
index e3de5f66f8..185aa70dc0 100644
--- a/libraries/entities/src/LightEntityItem.cpp
+++ b/libraries/entities/src/LightEntityItem.cpp
@@ -71,8 +71,8 @@ void LightEntityItem::dimensionsChanged() {
 EntityItemProperties LightEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const {
     EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class
 
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(isSpotlight, getIsSpotlight);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(isSpotlight, getIsSpotlight);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(intensity, getIntensity);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(exponent, getExponent);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(cutoff, getCutoff);
@@ -155,8 +155,8 @@ bool LightEntityItem::setProperties(const EntityItemProperties& properties) {
 bool LightEntityItem::setSubClassProperties(const EntityItemProperties& properties) {
     bool somethingChanged = EntityItem::setSubClassProperties(properties); // set the properties in our base class
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(isSpotlight, setIsSpotlight);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(isSpotlight, setIsSpotlight);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(intensity, setIntensity);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(exponent, setExponent);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(cutoff, setCutoff);
@@ -174,8 +174,8 @@ int LightEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
     int bytesRead = 0;
     const unsigned char* dataAt = data;
 
-    READ_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, bool, setIsSpotlight);
     READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor);
+    READ_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, bool, setIsSpotlight);
     READ_ENTITY_PROPERTY(PROP_INTENSITY, float, setIntensity);
     READ_ENTITY_PROPERTY(PROP_EXPONENT, float, setExponent);
     READ_ENTITY_PROPERTY(PROP_CUTOFF, float, setCutoff);
@@ -187,8 +187,8 @@ int LightEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
 
 EntityPropertyFlags LightEntityItem::getEntityProperties(EncodeBitstreamParams& params) const {
     EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params);
-    requestedProperties += PROP_IS_SPOTLIGHT;
     requestedProperties += PROP_COLOR;
+    requestedProperties += PROP_IS_SPOTLIGHT;
     requestedProperties += PROP_INTENSITY;
     requestedProperties += PROP_EXPONENT;
     requestedProperties += PROP_CUTOFF;
@@ -205,8 +205,8 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit
                                     OctreeElement::AppendState& appendState) const { 
 
     bool successPropertyFits = true;
-    APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, getIsSpotlight());
     APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
+    APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, getIsSpotlight());
     APPEND_ENTITY_PROPERTY(PROP_INTENSITY, getIntensity());
     APPEND_ENTITY_PROPERTY(PROP_EXPONENT, getExponent());
     APPEND_ENTITY_PROPERTY(PROP_CUTOFF, getCutoff());
diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp
index 4957c30112..12d1178690 100644
--- a/libraries/entities/src/LineEntityItem.cpp
+++ b/libraries/entities/src/LineEntityItem.cpp
@@ -21,7 +21,6 @@
 #include "EntityTreeElement.h"
 #include "OctreeConstants.h"
 
-const float LineEntityItem::DEFAULT_LINE_WIDTH = 2.0f;
 const int LineEntityItem::MAX_POINTS_PER_LINE = 70;
 
 
@@ -42,7 +41,6 @@ EntityItemProperties LineEntityItem::getProperties(const EntityPropertyFlags& de
     EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class
 
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints);
 
     return properties;
@@ -53,7 +51,6 @@ bool LineEntityItem::setProperties(const EntityItemProperties& properties) {
     somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class
 
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(lineWidth, setLineWidth);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints);
 
     if (somethingChanged) {
@@ -115,7 +112,6 @@ int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
     const unsigned char* dataAt = data;
 
     READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor);
-    READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth);
     READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector<glm::vec3>, setLinePoints);
 
     return bytesRead;
@@ -125,7 +121,6 @@ int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
 EntityPropertyFlags LineEntityItem::getEntityProperties(EncodeBitstreamParams& params) const {
     EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params);
     requestedProperties += PROP_COLOR;
-    requestedProperties += PROP_LINE_WIDTH;
     requestedProperties += PROP_LINE_POINTS;
     return requestedProperties;
 }
@@ -141,7 +136,6 @@ void LineEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits
     bool successPropertyFits = true;
 
     APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
-    APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, getLineWidth());
     APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints());
 }
 
@@ -166,20 +160,6 @@ void LineEntityItem::setColor(const glm::u8vec3& value) {
     });
 }
 
-void LineEntityItem::setLineWidth(float lineWidth) { 
-    withWriteLock([&] {
-        _lineWidth = lineWidth;
-    });
-}
-
-float LineEntityItem::getLineWidth() const { 
-    float result;
-    withReadLock([&] {
-        result = _lineWidth;
-    });
-    return result;
-}
-
 QVector<glm::vec3> LineEntityItem::getLinePoints() const { 
     QVector<glm::vec3> result;
     withReadLock([&] {
diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h
index 1ebb248d23..86ca6065bb 100644
--- a/libraries/entities/src/LineEntityItem.h
+++ b/libraries/entities/src/LineEntityItem.h
@@ -44,9 +44,6 @@ class LineEntityItem : public EntityItem {
     glm::u8vec3 getColor() const;
     void setColor(const glm::u8vec3& value);
 
-    void setLineWidth(float lineWidth);
-    float getLineWidth() const;
-
     bool setLinePoints(const QVector<glm::vec3>& points);
     bool appendPoint(const glm::vec3& point);
 
@@ -69,12 +66,10 @@ class LineEntityItem : public EntityItem {
     bool pointsChanged() const { return _pointsChanged; }
     void resetPointsChanged();
     virtual void debugDump() const override;
-    static const float DEFAULT_LINE_WIDTH;
     static const int MAX_POINTS_PER_LINE;
 
  private:
     glm::u8vec3 _color;
-    float _lineWidth { DEFAULT_LINE_WIDTH };
     QVector<glm::vec3> _points;
     bool _pointsChanged { true };
 };
diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp
index 067a9e0b19..55ae1c6c3b 100644
--- a/libraries/entities/src/ModelEntityItem.cpp
+++ b/libraries/entities/src/ModelEntityItem.cpp
@@ -55,11 +55,13 @@ void ModelEntityItem::setTextures(const QString& textures) {
 
 EntityItemProperties ModelEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const {
     EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(modelURL, getModelURL);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures);
+
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures);
+
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(modelURL, getModelURL);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointRotationsSet, getJointRotationsSet);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointRotations, getJointRotations);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointTranslationsSet, getJointTranslationsSet);
@@ -75,11 +77,12 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) {
     bool somethingChanged = false;
     somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(modelURL, setModelURL);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures);
+
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(modelURL, setModelURL);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointRotationsSet, setJointRotationsSet);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointRotations, setJointRotations);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointTranslationsSet, setJointTranslationsSet);
@@ -116,11 +119,12 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
     const unsigned char* dataAt = data;
     bool animationPropertiesChanged = false;
 
-    READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor);
-    READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL);
-    READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
-    READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
     READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType);
+    READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
+    READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor);
+    READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
+
+    READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL);
     READ_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, QVector<bool>, setJointRotationsSet);
     READ_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, QVector<glm::quat>, setJointRotations);
     READ_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, QVector<bool>, setJointTranslationsSet);
@@ -151,11 +155,12 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
 EntityPropertyFlags ModelEntityItem::getEntityProperties(EncodeBitstreamParams& params) const {
     EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params);
 
-    requestedProperties += PROP_COLOR;
-    requestedProperties += PROP_MODEL_URL;
-    requestedProperties += PROP_COMPOUND_SHAPE_URL;
-    requestedProperties += PROP_TEXTURES;
     requestedProperties += PROP_SHAPE_TYPE;
+    requestedProperties += PROP_COMPOUND_SHAPE_URL;
+    requestedProperties += PROP_COLOR;
+    requestedProperties += PROP_TEXTURES;
+
+    requestedProperties += PROP_MODEL_URL;
     requestedProperties += PROP_JOINT_ROTATIONS_SET;
     requestedProperties += PROP_JOINT_ROTATIONS;
     requestedProperties += PROP_JOINT_TRANSLATIONS_SET;
@@ -176,11 +181,12 @@ void ModelEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit
 
     bool successPropertyFits = true;
 
-    APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
-    APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, getModelURL());
-    APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL());
-    APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
     APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType());
+    APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL());
+    APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
+    APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
+
+    APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, getModelURL());
     APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, getJointRotationsSet());
     APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, getJointRotations());
     APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, getJointTranslationsSet());
diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp
index 2cafbd017e..7426318979 100644
--- a/libraries/entities/src/ParticleEffectEntityItem.cpp
+++ b/libraries/entities/src/ParticleEffectEntityItem.cpp
@@ -410,6 +410,10 @@ EntityItemProperties ParticleEffectEntityItem::getProperties(const EntityPropert
     EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class
 
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures);
+
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(maxParticles, getMaxParticles);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifespan, getLifespan);
 
@@ -434,17 +438,14 @@ EntityItemProperties ParticleEffectEntityItem::getProperties(const EntityPropert
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(radiusStart, getRadiusStart);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(radiusFinish, getRadiusFinish);
 
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(colorSpread, getColorSpread);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(colorStart, getColorStart);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(colorFinish, getColorFinish);
 
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(alphaSpread, getAlphaSpread);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(alphaStart, getAlphaStart);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(alphaFinish, getAlphaFinish);
 
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitterShouldTrail, getEmitterShouldTrail);
 
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(particleSpin, getParticleSpin);
@@ -460,6 +461,10 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert
     bool somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class
 
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures);
+
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(maxParticles, setMaxParticles);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifespan, setLifespan);
 
@@ -484,17 +489,14 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(radiusStart, setRadiusStart);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(radiusFinish, setRadiusFinish);
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(colorSpread, setColorSpread);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(colorStart, setColorStart);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(colorFinish, setColorFinish);
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(alphaSpread, setAlphaSpread);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(alphaStart, setAlphaStart);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(alphaFinish, setAlphaFinish);
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitterShouldTrail, setEmitterShouldTrail);
 
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(particleSpin, setParticleSpin);
@@ -531,6 +533,10 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch
     const unsigned char* dataAt = data;
 
     READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType);
+    READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor);
+    READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha);
+    READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
+
     READ_ENTITY_PROPERTY(PROP_MAX_PARTICLES, quint32, setMaxParticles);
     READ_ENTITY_PROPERTY(PROP_LIFESPAN, float, setLifespan);
 
@@ -555,17 +561,14 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch
     READ_ENTITY_PROPERTY(PROP_RADIUS_START, float, setRadiusStart);
     READ_ENTITY_PROPERTY(PROP_RADIUS_FINISH, float, setRadiusFinish);
 
-    READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor);
     READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, u8vec3Color, setColorSpread);
     READ_ENTITY_PROPERTY(PROP_COLOR_START, vec3Color, setColorStart);
     READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, vec3Color, setColorFinish);
 
-    READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha);
     READ_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, float, setAlphaSpread);
     READ_ENTITY_PROPERTY(PROP_ALPHA_START, float, setAlphaStart);
     READ_ENTITY_PROPERTY(PROP_ALPHA_FINISH, float, setAlphaFinish);
 
-    READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
     READ_ENTITY_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, bool, setEmitterShouldTrail);
 
     READ_ENTITY_PROPERTY(PROP_PARTICLE_SPIN, float, setParticleSpin);
@@ -581,6 +584,10 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea
     EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params);
 
     requestedProperties += PROP_SHAPE_TYPE;
+    requestedProperties += PROP_COLOR;
+    requestedProperties += PROP_ALPHA;
+    requestedProperties += PROP_TEXTURES;
+
     requestedProperties += PROP_MAX_PARTICLES;
     requestedProperties += PROP_LIFESPAN;
 
@@ -605,17 +612,14 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea
     requestedProperties += PROP_RADIUS_START;
     requestedProperties += PROP_RADIUS_FINISH;
 
-    requestedProperties += PROP_COLOR;
     requestedProperties += PROP_COLOR_SPREAD;
     requestedProperties += PROP_COLOR_START;
     requestedProperties += PROP_COLOR_FINISH;
 
-    requestedProperties += PROP_ALPHA;
     requestedProperties += PROP_ALPHA_SPREAD;
     requestedProperties += PROP_ALPHA_START;
     requestedProperties += PROP_ALPHA_FINISH;
 
-    requestedProperties += PROP_TEXTURES;
     requestedProperties += PROP_EMITTER_SHOULD_TRAIL;
 
     requestedProperties += PROP_PARTICLE_SPIN;
@@ -637,10 +641,14 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData,
 
     bool successPropertyFits = true;
     APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType());
+    APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
+    APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha());
+    APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
+
     APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles());
     APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan());
-    APPEND_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, getIsEmitting());
 
+    APPEND_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, getIsEmitting());
     APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, getEmitRate());
     APPEND_ENTITY_PROPERTY(PROP_EMIT_SPEED, getEmitSpeed());
     APPEND_ENTITY_PROPERTY(PROP_SPEED_SPREAD, getSpeedSpread());
@@ -661,17 +669,14 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData,
     APPEND_ENTITY_PROPERTY(PROP_RADIUS_START, getRadiusStart());
     APPEND_ENTITY_PROPERTY(PROP_RADIUS_FINISH, getRadiusFinish());
 
-    APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
     APPEND_ENTITY_PROPERTY(PROP_COLOR_SPREAD, getColorSpread());
     APPEND_ENTITY_PROPERTY(PROP_COLOR_START, getColorStart());
     APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, getColorFinish());
 
-    APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha());
     APPEND_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, getAlphaSpread());
     APPEND_ENTITY_PROPERTY(PROP_ALPHA_START, getAlphaStart());
     APPEND_ENTITY_PROPERTY(PROP_ALPHA_FINISH, getAlphaFinish());
 
-    APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
     APPEND_ENTITY_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, getEmitterShouldTrail());
 
     APPEND_ENTITY_PROPERTY(PROP_PARTICLE_SPIN, getParticleSpin());
diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp
index d16a2f93d4..88f2d14ae6 100644
--- a/libraries/entities/src/PolyLineEntityItem.cpp
+++ b/libraries/entities/src/PolyLineEntityItem.cpp
@@ -41,13 +41,12 @@ EntityItemProperties PolyLineEntityItem::getProperties(const EntityPropertyFlags
     EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class
     
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures);
 
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeWidths, getStrokeWidths);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(normals, getNormals);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeColors, getStrokeColors);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeWidths, getStrokeWidths);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(isUVModeStretch, getIsUVModeStretch);
     return properties;
 }
@@ -58,13 +57,12 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) {
     somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class
 
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(lineWidth, setLineWidth);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures);
 
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeWidths, setStrokeWidths);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(normals, setNormals);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeColors, setStrokeColors);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeWidths, setStrokeWidths);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(isUVModeStretch, setIsUVModeStretch);
 
     if (somethingChanged) {
@@ -203,13 +201,12 @@ int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da
     const unsigned char* dataAt = data;
 
     READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor);
-    READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth);
-    READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector<glm::vec3>, setLinePoints);
-
-    READ_ENTITY_PROPERTY(PROP_NORMALS, QVector<glm::vec3>, setNormals);
-    READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector<glm::vec3>, setStrokeColors);
-    READ_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, QVector<float>, setStrokeWidths);
     READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
+
+    READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector<glm::vec3>, setLinePoints);
+    READ_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, QVector<float>, setStrokeWidths);
+    READ_ENTITY_PROPERTY(PROP_STROKE_NORMALS, QVector<glm::vec3>, setNormals);
+    READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector<glm::vec3>, setStrokeColors);
     READ_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch);
 
     return bytesRead;
@@ -218,13 +215,12 @@ int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da
 EntityPropertyFlags PolyLineEntityItem::getEntityProperties(EncodeBitstreamParams& params) const {
     EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params);
     requestedProperties += PROP_COLOR;
-    requestedProperties += PROP_LINE_WIDTH;
-    requestedProperties += PROP_LINE_POINTS;
-
-    requestedProperties += PROP_NORMALS;
-    requestedProperties += PROP_STROKE_COLORS;
-    requestedProperties += PROP_STROKE_WIDTHS;
     requestedProperties += PROP_TEXTURES;
+
+    requestedProperties += PROP_LINE_POINTS;
+    requestedProperties += PROP_STROKE_WIDTHS;
+    requestedProperties += PROP_STROKE_NORMALS;
+    requestedProperties += PROP_STROKE_COLORS;
     requestedProperties += PROP_IS_UV_MODE_STRETCH;
     return requestedProperties;
 }
@@ -241,13 +237,12 @@ void PolyLineEntityItem::appendSubclassData(OctreePacketData* packetData, Encode
     bool successPropertyFits = true;
 
     APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
-    APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, getLineWidth());
-    APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints());
-
-    APPEND_ENTITY_PROPERTY(PROP_NORMALS, getNormals());
-    APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, getStrokeColors());
-    APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, getStrokeWidths());
     APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
+
+    APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints());
+    APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, getStrokeWidths());
+    APPEND_ENTITY_PROPERTY(PROP_STROKE_NORMALS, getNormals());
+    APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, getStrokeColors());
     APPEND_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, getIsUVModeStretch());
 }
 
diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h
index f640bd7a9e..4420a123c5 100644
--- a/libraries/entities/src/PolyLineEntityItem.h
+++ b/libraries/entities/src/PolyLineEntityItem.h
@@ -44,9 +44,6 @@ class PolyLineEntityItem : public EntityItem {
     glm::u8vec3 getColor() const;
     void setColor(const glm::u8vec3& value);
 
-    void setLineWidth(float lineWidth){ _lineWidth = lineWidth; }
-    float getLineWidth() const{ return _lineWidth; }
-
     bool setLinePoints(const QVector<glm::vec3>& points);
     bool appendPoint(const glm::vec3& point);
     QVector<glm::vec3> getLinePoints() const;
@@ -99,7 +96,6 @@ private:
     
  protected:
     glm::u8vec3 _color;
-    float _lineWidth { DEFAULT_LINE_WIDTH };
     bool _pointsChanged { true };
     bool _normalsChanged { true };
     bool _strokeColorsChanged { true };
diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp
index 08af12a289..88612c8be6 100644
--- a/libraries/entities/src/ShapeEntityItem.cpp
+++ b/libraries/entities/src/ShapeEntityItem.cpp
@@ -118,10 +118,10 @@ ShapeEntityItem::ShapeEntityItem(const EntityItemID& entityItemID) : EntityItem(
 EntityItemProperties ShapeEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const {
     EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class
 
-    properties.setShape(entity::stringFromShape(getShape()));
-    properties._shapeChanged = false;
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha);
+    properties.setShape(entity::stringFromShape(getShape()));
+    properties._shapeChanged = false;
 
     return properties;
 }
@@ -158,9 +158,9 @@ void ShapeEntityItem::setShape(const entity::Shape& shape) {
 bool ShapeEntityItem::setProperties(const EntityItemProperties& properties) {
     bool somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(shape, setShape);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(shape, setShape);
 
     if (somethingChanged) {
         bool wantDebug = false;
@@ -183,18 +183,18 @@ int ShapeEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
     int bytesRead = 0;
     const unsigned char* dataAt = data;
 
-    READ_ENTITY_PROPERTY(PROP_SHAPE, QString, setShape);
     READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor);
     READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha);
+    READ_ENTITY_PROPERTY(PROP_SHAPE, QString, setShape);
 
     return bytesRead;
 }
 
 EntityPropertyFlags ShapeEntityItem::getEntityProperties(EncodeBitstreamParams& params) const {
     EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params);
-    requestedProperties += PROP_SHAPE;
     requestedProperties += PROP_COLOR;
     requestedProperties += PROP_ALPHA;
+    requestedProperties += PROP_SHAPE;
     return requestedProperties;
 }
 
@@ -207,9 +207,9 @@ void ShapeEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit
                                     OctreeElement::AppendState& appendState) const { 
 
     bool successPropertyFits = true;
-    APPEND_ENTITY_PROPERTY(PROP_SHAPE, entity::stringFromShape(getShape()));
     APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor());
     APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha());
+    APPEND_ENTITY_PROPERTY(PROP_SHAPE, entity::stringFromShape(getShape()));
 }
 
 void ShapeEntityItem::setColor(const glm::u8vec3& value) {
diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp
index ffd1dbba40..a265fe16cd 100644
--- a/libraries/entities/src/ZoneEntityItem.cpp
+++ b/libraries/entities/src/ZoneEntityItem.cpp
@@ -48,6 +48,9 @@ ZoneEntityItem::ZoneEntityItem(const EntityItemID& entityItemID) : EntityItem(en
 EntityItemProperties ZoneEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const {
     EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class
 
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType);
+    COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL);
+
     // Contain QString properties, must be synchronized
     withReadLock([&] {
         _keyLightProperties.getProperties(properties);
@@ -57,9 +60,6 @@ EntityItemProperties ZoneEntityItem::getProperties(const EntityPropertyFlags& de
     _hazeProperties.getProperties(properties);
     _bloomProperties.getProperties(properties);
 
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType);
-    COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL);
-
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(flyingAllowed, getFlyingAllowed);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(ghostingAllowed, getGhostingAllowed);
     COPY_ENTITY_PROPERTY_TO_PROPERTIES(filterURL, getFilterURL);
@@ -94,6 +94,9 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) {
 bool ZoneEntityItem::setSubClassProperties(const EntityItemProperties& properties) {
     bool somethingChanged = EntityItem::setSubClassProperties(properties); // set the properties in our base class
 
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType);
+    SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL);
+
     // Contains a QString property, must be synchronized
     withWriteLock([&] {
         _keyLightPropertiesChanged = _keyLightProperties.setProperties(properties);
@@ -103,9 +106,6 @@ bool ZoneEntityItem::setSubClassProperties(const EntityItemProperties& propertie
     _hazePropertiesChanged = _hazeProperties.setProperties(properties);
     _bloomPropertiesChanged = _bloomProperties.setProperties(properties);
 
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType);
-    SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL);
-
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(flyingAllowed, setFlyingAllowed);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(ghostingAllowed, setGhostingAllowed);
     SET_ENTITY_PROPERTY_FROM_PROPERTIES(filterURL, setFilterURL);
@@ -129,6 +129,9 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
     int bytesRead = 0;
     const unsigned char* dataAt = data;
 
+    READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType);
+    READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
+
     {
         int bytesFromKeylight;
         withWriteLock([&] {
@@ -178,9 +181,6 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
         dataAt += bytesFromBloom;
     }
 
-    READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType);
-    READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
-
     READ_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, bool, setFlyingAllowed);
     READ_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, bool, setGhostingAllowed);
     READ_ENTITY_PROPERTY(PROP_FILTER_URL, QString, setFilterURL);
@@ -197,15 +197,15 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
 EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& params) const {
     EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params);
 
+    requestedProperties += PROP_SHAPE_TYPE;
+    requestedProperties += PROP_COMPOUND_SHAPE_URL;
+
     requestedProperties += _keyLightProperties.getEntityProperties(params);
     requestedProperties += _ambientLightProperties.getEntityProperties(params);
     requestedProperties += _skyboxProperties.getEntityProperties(params);
     requestedProperties += _hazeProperties.getEntityProperties(params);
     requestedProperties += _bloomProperties.getEntityProperties(params);
 
-    requestedProperties += PROP_SHAPE_TYPE;
-    requestedProperties += PROP_COMPOUND_SHAPE_URL;
-
     requestedProperties += PROP_FLYING_ALLOWED;
     requestedProperties += PROP_GHOSTING_ALLOWED;
     requestedProperties += PROP_FILTER_URL;
@@ -229,6 +229,9 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits
 
     bool successPropertyFits = true;
 
+    APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType());
+    APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL());
+
     withReadLock([&] {
         _keyLightProperties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties,
             propertyFlags, propertiesDidntFit, propertyCount, appendState);
@@ -242,9 +245,6 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits
     _bloomProperties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties,
         propertyFlags, propertiesDidntFit, propertyCount, appendState);
 
-    APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType());
-    APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL());
-
     APPEND_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, getFlyingAllowed());
     APPEND_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, getGhostingAllowed());
     APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, getFilterURL());
diff --git a/libraries/networking/src/BandwidthRecorder.cpp b/libraries/networking/src/BandwidthRecorder.cpp
deleted file mode 100644
index 80276dba5a..0000000000
--- a/libraries/networking/src/BandwidthRecorder.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-//
-//  BandwidthMeter.cpp
-//  interface/src/ui
-//
-//  Created by Seth Alves on 2015-1-30
-//  Copyright 2015 High Fidelity, Inc.
-//
-//  Based on code by Tobias Schwinger
-//
-//  Distributed under the Apache License, Version 2.0.
-//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-//
-
-#include "BandwidthRecorder.h"
-
-#include <QDateTime>
-
-BandwidthRecorder::Channel::Channel() {
-}
-
-float BandwidthRecorder::Channel::getAverageInputPacketsPerSecond() const {
-    float averageTimeBetweenPackets = _input.getEventDeltaAverage();
-    if (averageTimeBetweenPackets > 0.0f) {
-        return (1.0f / averageTimeBetweenPackets);
-    }
-    return 0.0f;
-}
-
-float BandwidthRecorder::Channel::getAverageOutputPacketsPerSecond() const {
-    float averageTimeBetweenPackets = _output.getEventDeltaAverage();
-    if (averageTimeBetweenPackets > 0.0f) {
-        return (1.0f / averageTimeBetweenPackets);
-    }
-    return 0.0f;
-}
-
-float BandwidthRecorder::Channel::getAverageInputKilobitsPerSecond() const {
-    return (_input.getAverageSampleValuePerSecond() * (8.0f / 1000));
-}
-
-float BandwidthRecorder::Channel::getAverageOutputKilobitsPerSecond() const {
-    return (_output.getAverageSampleValuePerSecond() * (8.0f / 1000));
-}
-
-
-void BandwidthRecorder::Channel::updateInputAverage(const float sample) {
-    _input.updateAverage(sample);
-}
-
-void BandwidthRecorder::Channel::updateOutputAverage(const float sample) {
-    _output.updateAverage(sample);
-}
-
-BandwidthRecorder::BandwidthRecorder() {
-    for (uint i=0; i<CHANNEL_COUNT; i++) {
-        _channels[ i ] = NULL;
-    }
-}
-
-BandwidthRecorder::~BandwidthRecorder() {
-    for (uint i=0; i<CHANNEL_COUNT; i++) {
-        delete _channels[ i ];
-    }
-}
-
-void BandwidthRecorder::updateInboundData(const quint8 channelType, const int sample) {
-    if (! _channels[channelType]) {
-        _channels[channelType] = new Channel();
-    }
-    _channels[channelType]->updateInputAverage(sample);
-}
-
-void BandwidthRecorder::updateOutboundData(const quint8 channelType, const int sample) {
-    if (! _channels[channelType]) {
-        _channels[channelType] = new Channel();
-    }
-    _channels[channelType]->updateOutputAverage(sample);
-}
-
-float BandwidthRecorder::getAverageInputPacketsPerSecond(const quint8 channelType) const {
-    if (! _channels[channelType]) {
-        return 0.0f;
-    }
-    return _channels[channelType]->getAverageInputPacketsPerSecond();
-}
-
-float BandwidthRecorder::getAverageOutputPacketsPerSecond(const quint8 channelType) const {
-    if (! _channels[channelType]) {
-        return 0.0f;
-    }
-    return _channels[channelType]->getAverageOutputPacketsPerSecond();
-}
-
-float BandwidthRecorder::getAverageInputKilobitsPerSecond(const quint8 channelType) const {
-    if (! _channels[channelType]) {
-        return 0.0f;
-    }
-    return _channels[channelType]->getAverageInputKilobitsPerSecond();
-}
-
-float BandwidthRecorder::getAverageOutputKilobitsPerSecond(const quint8 channelType) const {
-    if (! _channels[channelType]) {
-        return 0.0f;
-    }
-    return _channels[channelType]->getAverageOutputKilobitsPerSecond();
-}
-
-float BandwidthRecorder::getTotalAverageInputPacketsPerSecond() const {
-    float result = 0.0f;
-    for (uint i=0; i<CHANNEL_COUNT; i++) {
-        if (_channels[i]) {
-            result += _channels[i]->getAverageInputPacketsPerSecond();
-        }
-    }
-    return result;
-}
-
-float BandwidthRecorder::getTotalAverageOutputPacketsPerSecond() const {
-    float result = 0.0f;
-    for (uint i=0; i<CHANNEL_COUNT; i++) {
-        if (_channels[i]) {
-            result += _channels[i]->getAverageOutputPacketsPerSecond();
-        }
-    }
-    return result;
-}
-
-float BandwidthRecorder::getTotalAverageInputKilobitsPerSecond() const {
-    float result = 0.0f;
-    for (uint i=0; i<CHANNEL_COUNT; i++) {
-        if (_channels[i]) {
-            result += _channels[i]->getAverageInputKilobitsPerSecond();
-        }
-    }
-    return result;
-}
-
-float BandwidthRecorder::getTotalAverageOutputKilobitsPerSecond() const {
-    float result = 0.0f;
-    for (uint i=0; i<CHANNEL_COUNT; i++) {
-        if (_channels[i]) {
-            result += _channels[i]->getAverageOutputKilobitsPerSecond();
-        }
-    }
-    return result;
-}
-
-float BandwidthRecorder::getCachedTotalAverageInputPacketsPerSecond() const {
-    static qint64 lastCalculated = 0;
-    static float cachedValue = 0.0f;
-    qint64 now = QDateTime::currentMSecsSinceEpoch();
-    if (now - lastCalculated > 1000.0f) {
-        lastCalculated = now;
-        cachedValue = getTotalAverageInputPacketsPerSecond();
-    }
-    return cachedValue;
-}
-
-float BandwidthRecorder::getCachedTotalAverageOutputPacketsPerSecond() const {
-    static qint64 lastCalculated = 0;
-    static float cachedValue = 0.0f;
-    qint64 now = QDateTime::currentMSecsSinceEpoch();
-    if (now - lastCalculated > 1000.0f) {
-        lastCalculated = now;
-        cachedValue = getTotalAverageOutputPacketsPerSecond();
-    }
-    return cachedValue;
-}
-
-float BandwidthRecorder::getCachedTotalAverageInputKilobitsPerSecond() const {
-    static qint64 lastCalculated = 0;
-    static float cachedValue = 0.0f;
-    qint64 now = QDateTime::currentMSecsSinceEpoch();
-    if (now - lastCalculated > 1000.0f) {
-        lastCalculated = now;
-        cachedValue = getTotalAverageInputKilobitsPerSecond();
-    }
-    return cachedValue;
-}
-
-float BandwidthRecorder::getCachedTotalAverageOutputKilobitsPerSecond() const {
-    static qint64 lastCalculated = 0;
-    static float cachedValue = 0.0f;
-    qint64 now = QDateTime::currentMSecsSinceEpoch();
-    if (now - lastCalculated > 1000.0f) {
-        lastCalculated = now;
-        cachedValue = getTotalAverageOutputKilobitsPerSecond();
-    }
-    return cachedValue;
-}
diff --git a/libraries/networking/src/BandwidthRecorder.h b/libraries/networking/src/BandwidthRecorder.h
deleted file mode 100644
index b1cee570f2..0000000000
--- a/libraries/networking/src/BandwidthRecorder.h
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-//  BandwidthRecorder.h
-//
-//  Created by Seth Alves on 2015-1-30
-//  Copyright 2015 High Fidelity, Inc.
-//
-//  Based on code by Tobias Schwinger
-//
-//  Distributed under the Apache License, Version 2.0.
-//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-//
-
-
-#ifndef hifi_BandwidthRecorder_h
-#define hifi_BandwidthRecorder_h
-
-#include <QObject>
-#include <QElapsedTimer>
-#include "DependencyManager.h"
-#include "SimpleMovingAverage.h"
-
-
-class BandwidthRecorder : public QObject, public Dependency {
-    Q_OBJECT
-    SINGLETON_DEPENDENCY
-
-public:
-    BandwidthRecorder();
-    ~BandwidthRecorder();
-
-    // keep track of data rate in two directions as well as units and style to use during display
-    class Channel {
-    public:
-        Channel();
-        float getAverageInputPacketsPerSecond() const;
-        float getAverageOutputPacketsPerSecond() const;
-        float getAverageInputKilobitsPerSecond() const;
-        float getAverageOutputKilobitsPerSecond() const;
-
-        void updateInputAverage(const float sample);
-        void updateOutputAverage(const float sample);
-
-    private:
-        SimpleMovingAverage _input;
-        SimpleMovingAverage _output;
-    };
-
-    float getAverageInputPacketsPerSecond(const quint8 channelType) const;
-    float getAverageOutputPacketsPerSecond(const quint8 channelType) const;
-    float getAverageInputKilobitsPerSecond(const quint8 channelType) const;
-    float getAverageOutputKilobitsPerSecond(const quint8 channelType) const;
-
-    float getTotalAverageInputPacketsPerSecond() const;
-    float getTotalAverageOutputPacketsPerSecond() const;
-    float getTotalAverageInputKilobitsPerSecond() const;
-    float getTotalAverageOutputKilobitsPerSecond() const;
-
-    float getCachedTotalAverageInputPacketsPerSecond() const;
-    float getCachedTotalAverageOutputPacketsPerSecond() const;
-    float getCachedTotalAverageInputKilobitsPerSecond() const;
-    float getCachedTotalAverageOutputKilobitsPerSecond() const;
-
-
-private:
-    // one for each possible Node type
-    static const unsigned int CHANNEL_COUNT = 256;
-    Channel* _channels[CHANNEL_COUNT];
-
-
-public slots:
-    void updateInboundData(const quint8 channelType, const int bytes);
-    void updateOutboundData(const quint8 channelType, const int bytes);
-};
-
-#endif
diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp
index a1137b785a..063885e782 100644
--- a/libraries/networking/src/LimitedNodeList.cpp
+++ b/libraries/networking/src/LimitedNodeList.cpp
@@ -83,6 +83,11 @@ LimitedNodeList::LimitedNodeList(int socketListenPort, int dtlsListenPort) :
     connect(silentNodeTimer, &QTimer::timeout, this, &LimitedNodeList::removeSilentNodes);
     silentNodeTimer->start(NODE_SILENCE_THRESHOLD_MSECS);
 
+    const int CONNECTION_STATS_SAMPLE_INTERVAL_MSECS = 1000;
+    QTimer* statsSampleTimer = new QTimer(this);
+    connect(statsSampleTimer, &QTimer::timeout, this, &LimitedNodeList::sampleConnectionStats);
+    statsSampleTimer->start(CONNECTION_STATS_SAMPLE_INTERVAL_MSECS);
+
     // check the local socket right now
     updateLocalSocket();
 
@@ -295,7 +300,6 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe
             });
 
             if (sendingNodeType != NodeType::Unassigned) {
-                emit dataReceived(sendingNodeType, packet.getPayloadSize());
                 return true;
             } else {
                 HIFI_FCDEBUG(networking(), "Replicated packet of type" << headerType
@@ -303,9 +307,7 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe
 
                 return false;
             }
-
         } else {
-            emit dataReceived(NodeType::Unassigned, packet.getPayloadSize());
             return true;
         }
     } else {
@@ -328,8 +330,6 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe
             packet.getSenderSockAddr() == getDomainSockAddr() &&
             PacketTypeEnum::getDomainSourcedPackets().contains(headerType)) {
             // This is a packet sourced by the domain server
-
-            emit dataReceived(NodeType::Unassigned, packet.getPayloadSize());
             return true;
         }
 
@@ -367,8 +367,6 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe
             // from this sending node
             sourceNode->setLastHeardMicrostamp(usecTimestampNow());
 
-            emit dataReceived(sourceNode->getType(), packet.getPayloadSize());
-
             return true;
 
         } else {
@@ -407,9 +405,6 @@ qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node&
         return 0;
     }
 
-    emit dataSent(destinationNode.getType(), packet.getDataSize());
-    destinationNode.recordBytesSent(packet.getDataSize());
-
     return sendUnreliablePacket(packet, *destinationNode.getActiveSocket(), destinationNode.getAuthenticateHash());
 }
 
@@ -430,9 +425,6 @@ qint64 LimitedNodeList::sendPacket(std::unique_ptr<NLPacket> packet, const Node&
     auto activeSocket = destinationNode.getActiveSocket();
 
     if (activeSocket) {
-        emit dataSent(destinationNode.getType(), packet->getDataSize());
-        destinationNode.recordBytesSent(packet->getDataSize());
-
         return sendPacket(std::move(packet), *activeSocket, destinationNode.getAuthenticateHash());
     } else {
         qCDebug(networking) << "LimitedNodeList::sendPacket called without active socket for node" << destinationNode << "- not sending";
@@ -470,8 +462,6 @@ qint64 LimitedNodeList::sendUnreliableUnorderedPacketList(NLPacketList& packetLi
             bytesSent += sendPacket(packetList.takeFront<NLPacket>(), *activeSocket,
                 connectionHash);
         }
-
-        emit dataSent(destinationNode.getType(), bytesSent);
         return bytesSent;
     } else {
         qCDebug(networking) << "LimitedNodeList::sendPacketList called without active socket for node" << destinationNode
@@ -887,10 +877,56 @@ void LimitedNodeList::removeSilentNodes() {
     }
 }
 
+void LimitedNodeList::sampleConnectionStats() {
+    uint32_t packetsIn { 0 };
+    uint32_t packetsOut { 0 };
+    uint64_t bytesIn { 0 };
+    uint64_t bytesOut { 0 };
+    int elapsedSum { 0 };
+    int elapsedCount { 0 };
+
+    auto allStats = _nodeSocket.sampleStatsForAllConnections();
+    for (const auto& stats : allStats) {
+        auto node = findNodeWithAddr(stats.first);
+        if (node && node->getActiveSocket() &&
+            *node->getActiveSocket() == stats.first) {
+            node->updateStats(stats.second);
+        }
+
+        packetsIn += stats.second.receivedPackets;
+        packetsIn += stats.second.receivedUnreliablePackets;
+        packetsOut += stats.second.sentPackets;
+        packetsOut += stats.second.sentUnreliablePackets;
+        bytesIn += stats.second.receivedBytes;
+        bytesIn += stats.second.receivedUnreliableBytes;
+        bytesOut += stats.second.sentBytes;
+        bytesOut += stats.second.sentUnreliableBytes;
+        elapsedSum += (stats.second.endTime - stats.second.startTime).count();
+        elapsedCount++;
+    }
+
+    if (elapsedCount > 0) {
+        float elapsedAvg = (float)elapsedSum / elapsedCount;
+        float factor = USECS_PER_SECOND / elapsedAvg;
+
+        float kilobitsReceived = (float)bytesIn * BITS_IN_BYTE / BYTES_PER_KILOBYTE;
+        float kilobitsSent = (float)bytesOut * BITS_IN_BYTE / BYTES_PER_KILOBYTE;
+
+        _inboundPPS = packetsIn * factor;
+        _outboundPPS = packetsOut * factor;
+        _inboundKbps = kilobitsReceived * factor;
+        _outboundKbps = kilobitsSent * factor;
+    } else {
+        _inboundPPS = 0;
+        _outboundPPS = 0;
+        _inboundKbps = 0.0f;
+        _outboundKbps = 0.0f;
+    }
+}
+
 const uint32_t RFC_5389_MAGIC_COOKIE = 0x2112A442;
 const int NUM_BYTES_STUN_HEADER = 20;
 
-
 void LimitedNodeList::makeSTUNRequestPacket(char* stunRequestPacket) {
     int packetIndex = 0;
 
diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h
index 33a4a7e0b4..78d4d5810f 100644
--- a/libraries/networking/src/LimitedNodeList.h
+++ b/libraries/networking/src/LimitedNodeList.h
@@ -319,6 +319,11 @@ public:
     void sendFakedHandshakeRequestToNode(SharedNodePointer node);
 #endif
 
+    int getInboundPPS() const { return _inboundPPS; }
+    int getOutboundPPS() const { return _outboundPPS; }
+    float getInboundKbps() const { return _inboundKbps; }
+    float getOutboundKbps() const { return _outboundKbps; }
+
 public slots:
     void reset();
     void eraseAllNodes();
@@ -332,10 +337,10 @@ public slots:
 
     bool killNodeWithUUID(const QUuid& nodeUUID, ConnectionID newConnectionID = NULL_CONNECTION_ID);
 
-signals:
-    void dataSent(quint8 channelType, int bytes);
-    void dataReceived(quint8 channelType, int bytes);
+private slots:
+    void sampleConnectionStats();
 
+signals:
     // QUuid might be zero for non-sourced packet types.
     void packetVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID);
 
@@ -372,8 +377,6 @@ protected:
 
     qint64 sendPacket(std::unique_ptr<NLPacket> packet, const Node& destinationNode,
                       const HifiSockAddr& overridenSockAddr);
-    qint64 writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr,
-                       const QUuid& connectionSecret = QUuid());
     void collectPacketStats(const NLPacket& packet);
     void fillPacketHeader(const NLPacket& packet, HMACAuth* hmacAuth = nullptr);
 
@@ -444,6 +447,11 @@ private:
     LocalIDMapping _localIDMap;
     Node::LocalID _sessionLocalID { 0 };
     bool _flagTimeForConnectionStep { false }; // only keep track in interface
+
+    int _inboundPPS { 0 };
+    int _outboundPPS { 0 };
+    float _inboundKbps { 0.0f };
+    float _outboundKbps { 0.0f };
 };
 
 #endif // hifi_LimitedNodeList_h
diff --git a/libraries/networking/src/NetworkPeer.cpp b/libraries/networking/src/NetworkPeer.cpp
index 35956c4789..4e0a82ba0e 100644
--- a/libraries/networking/src/NetworkPeer.cpp
+++ b/libraries/networking/src/NetworkPeer.cpp
@@ -228,19 +228,3 @@ QDebug operator<<(QDebug debug, const NetworkPeer &peer) {
         << "- local:" << peer.getLocalSocket();
     return debug;
 }
-
-void NetworkPeer::recordBytesSent(int count) const {
-    _bandwidthRecorder.updateOutboundData(0, count);
-}
-
-void NetworkPeer::recordBytesReceived(int count) const {
-    _bandwidthRecorder.updateInboundData(0, count);
-}
-
-float NetworkPeer::getOutboundBandwidth() const {
-    return _bandwidthRecorder.getAverageOutputKilobitsPerSecond(0);
-}
-
-float NetworkPeer::getInboundBandwidth() const {
-    return _bandwidthRecorder.getAverageInputKilobitsPerSecond(0);
-}
diff --git a/libraries/networking/src/NetworkPeer.h b/libraries/networking/src/NetworkPeer.h
index 4688498a96..b75d2f8b86 100644
--- a/libraries/networking/src/NetworkPeer.h
+++ b/libraries/networking/src/NetworkPeer.h
@@ -18,7 +18,6 @@
 #include <QtCore/QTimer>
 #include <QtCore/QUuid>
 
-#include "BandwidthRecorder.h"
 #include "HifiSockAddr.h"
 #include "UUID.h"
 
@@ -78,12 +77,6 @@ public:
     void incrementConnectionAttempts() { ++_connectionAttempts; }
     void resetConnectionAttempts() { _connectionAttempts = 0; }
 
-    void recordBytesSent(int count) const;
-    void recordBytesReceived(int count) const;
-
-    float getOutboundBandwidth() const; // in kbps
-    float getInboundBandwidth() const; // in kbps
-
     // Typically the LimitedNodeList removes nodes after they are "silent"
     // meaning that we have not received any packets (including simple keepalive pings) from them for a set interval.
     // The _isForcedNeverSilent flag tells the LimitedNodeList that a Node should never be killed by removeSilentNodes()
@@ -114,8 +107,6 @@ protected:
     HifiSockAddr _symmetricSocket;
     HifiSockAddr* _activeSocket;
 
-    mutable BandwidthRecorder _bandwidthRecorder;
-
     quint64 _wakeTimestamp;
     std::atomic_ullong _lastHeardMicrostamp;
 
diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp
index 9421e1da44..a2bd60914a 100644
--- a/libraries/networking/src/Node.cpp
+++ b/libraries/networking/src/Node.cpp
@@ -219,3 +219,37 @@ void Node::setConnectionSecret(const QUuid& connectionSecret) {
     _connectionSecret = connectionSecret;
     _authenticateHash->setKey(_connectionSecret);
 }
+
+void Node::updateStats(Stats stats) {
+    _stats = stats;
+}
+
+const Node::Stats& Node::getConnectionStats() const {
+    return _stats;
+}
+
+float Node::getInboundKbps() const {
+    float bitsReceived = (_stats.receivedBytes + _stats.receivedUnreliableBytes) * BITS_IN_BYTE;
+    auto elapsed = _stats.endTime - _stats.startTime;
+    auto bps = (bitsReceived * USECS_PER_SECOND) / elapsed.count();
+    return bps / BYTES_PER_KILOBYTE;
+}
+
+float Node::getOutboundKbps() const {
+    float bitsSent = (_stats.sentBytes + _stats.sentUnreliableBytes) * BITS_IN_BYTE;
+    auto elapsed = _stats.endTime - _stats.startTime;
+    auto bps = (bitsSent * USECS_PER_SECOND) / elapsed.count();
+    return bps / BYTES_PER_KILOBYTE;
+}
+
+int Node::getInboundPPS() const {
+    float packetsReceived = _stats.receivedPackets + _stats.receivedUnreliablePackets;
+    auto elapsed = _stats.endTime - _stats.startTime;
+    return (packetsReceived * USECS_PER_SECOND) / elapsed.count();
+}
+
+int Node::getOutboundPPS() const {
+    float packetsSent = _stats.sentPackets + _stats.sentUnreliablePackets;
+    auto elapsed = _stats.endTime - _stats.startTime;
+    return (packetsSent * USECS_PER_SECOND) / elapsed.count();
+}
diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h
index 6c5a56c94e..fe3177d785 100644
--- a/libraries/networking/src/Node.h
+++ b/libraries/networking/src/Node.h
@@ -35,10 +35,13 @@
 #include "MovingPercentile.h"
 #include "NodePermissions.h"
 #include "HMACAuth.h"
+#include "udt/ConnectionStats.h"
+#include "NumericalConstants.h"
 
 class Node : public NetworkPeer {
     Q_OBJECT
 public:
+    using Stats = udt::ConnectionStats::Stats;
 
     Node(const QUuid& uuid, NodeType_t type,
          const HifiSockAddr& publicSocket, const HifiSockAddr& localSocket,
@@ -94,6 +97,14 @@ public:
     friend QDataStream& operator<<(QDataStream& out, const Node& node);
     friend QDataStream& operator>>(QDataStream& in, Node& node);
 
+    void updateStats(Stats stats);
+    const Stats& getConnectionStats() const;
+
+    int getInboundPPS() const;
+    int getOutboundPPS() const;
+    float getInboundKbps() const;
+    float getOutboundKbps() const;
+
 private:
     // privatize copy and assignment operator to disallow Node copying
     Node(const Node &otherNode);
@@ -115,6 +126,8 @@ private:
     IgnoredNodeIDs _ignoredNodeIDs;
     mutable QReadWriteLock _ignoredNodeIDSetLock;
     std::vector<QString> _replicatedUsernames { };
+
+    Stats _stats;
 };
 
 Q_DECLARE_METATYPE(Node*)
diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp
index fe2a273d61..83be481914 100644
--- a/libraries/networking/src/PacketReceiver.cpp
+++ b/libraries/networking/src/PacketReceiver.cpp
@@ -284,10 +284,6 @@ void PacketReceiver::handleVerifiedMessage(QSharedPointer<ReceivedMessage> recei
             connectionType = _directlyConnectedObjects.contains(listener.object) ? Qt::DirectConnection : Qt::AutoConnection;
         }
 
-        if (matchingNode) {
-            matchingNode->recordBytesReceived(receivedMessage->getSize());
-        }
-
         QMetaMethod metaMethod = listener.method;
 
         static const QByteArray QSHAREDPOINTER_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer<Node>");
diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp
index 4798288a18..418dc8f417 100644
--- a/libraries/networking/src/udt/Connection.cpp
+++ b/libraries/networking/src/udt/Connection.cpp
@@ -192,12 +192,21 @@ void Connection::recordSentPackets(int wireSize, int payloadSize,
     _congestionControl->onPacketSent(wireSize, seqNum, timePoint);
 }
 
-void Connection::recordRetransmission(int wireSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) {
-    _stats.record(ConnectionStats::Stats::Retransmission);
+void Connection::recordRetransmission(int wireSize, int payloadSize,
+                                      SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) {
+    _stats.recordRetransmittedPackets(payloadSize, wireSize);
 
     _congestionControl->onPacketReSent(wireSize, seqNum, timePoint);
 }
 
+void Connection::recordSentUnreliablePackets(int wireSize, int payloadSize) {
+    _stats.recordUnreliableSentPackets(payloadSize, wireSize);
+}
+
+void Connection::recordReceivedUnreliablePackets(int wireSize, int payloadSize) {
+    _stats.recordUnreliableReceivedPackets(payloadSize, wireSize);
+}
+
 void Connection::sendACK() {
     SequenceNumber nextACKNumber = nextACK();
 
@@ -212,7 +221,7 @@ void Connection::sendACK() {
     // have the socket send off our packet
     _parentSocket->writeBasePacket(*_ackPacket, _destination);
     
-    _stats.record(ConnectionStats::Stats::SentACK);
+    _stats.recordSentACK(_ackPacket->getWireSize());
 }
 
 SequenceNumber Connection::nextACK() const {
@@ -270,7 +279,7 @@ bool Connection::processReceivedSequenceNumber(SequenceNumber sequenceNumber, in
     sendACK();
     
     if (wasDuplicate) {
-        _stats.record(ConnectionStats::Stats::Duplicate);
+        _stats.recordDuplicatePackets(payloadSize, packetSize);
     } else {
         _stats.recordReceivedPackets(payloadSize, packetSize);
     }
@@ -318,7 +327,7 @@ void Connection::processACK(ControlPacketPointer controlPacket) {
     controlPacket->readPrimitive(&ack);
     
     // update the total count of received ACKs
-    _stats.record(ConnectionStats::Stats::ReceivedACK);
+    _stats.recordReceivedACK(controlPacket->getWireSize());
     
     // validate that this isn't a BS ACK
     if (ack > getSendQueue().getCurrentSequenceNumber()) {
diff --git a/libraries/networking/src/udt/Connection.h b/libraries/networking/src/udt/Connection.h
index 17e8a9b1f9..938ec36860 100644
--- a/libraries/networking/src/udt/Connection.h
+++ b/libraries/networking/src/udt/Connection.h
@@ -73,6 +73,9 @@ public:
     void setMaxBandwidth(int maxBandwidth);
 
     void sendHandshakeRequest();
+    
+    void recordSentUnreliablePackets(int wireSize, int payloadSize);
+    void recordReceivedUnreliablePackets(int wireSize, int payloadSize);
 
 signals:
     void packetSent();
@@ -80,7 +83,8 @@ signals:
 
 private slots:
     void recordSentPackets(int wireSize, int payloadSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint);
-    void recordRetransmission(int wireSize, SequenceNumber sequenceNumber, p_high_resolution_clock::time_point timePoint);
+    void recordRetransmission(int wireSize, int payloadSize, SequenceNumber sequenceNumber, p_high_resolution_clock::time_point timePoint);
+
     void queueInactive();
     void queueTimeout();
     
diff --git a/libraries/networking/src/udt/ConnectionStats.cpp b/libraries/networking/src/udt/ConnectionStats.cpp
index e30c588dba..188cc3114d 100644
--- a/libraries/networking/src/udt/ConnectionStats.cpp
+++ b/libraries/networking/src/udt/ConnectionStats.cpp
@@ -19,7 +19,6 @@ using namespace std::chrono;
 ConnectionStats::ConnectionStats() {
     auto now = duration_cast<microseconds>(system_clock::now().time_since_epoch());
     _currentSample.startTime = now;
-    _total.startTime = now;
 }
 
 ConnectionStats::Stats ConnectionStats::sample() {
@@ -35,79 +34,60 @@ ConnectionStats::Stats ConnectionStats::sample() {
 
 void ConnectionStats::record(Stats::Event event) {
     ++_currentSample.events[(int) event];
-    ++_total.events[(int) event];
+}
+
+void ConnectionStats::recordSentACK(int size) {
+    record(Stats::SentACK);
+    recordSentPackets(0, size);
+}
+
+void ConnectionStats::recordReceivedACK(int size) {
+    record(Stats::ReceivedACK);
+    recordReceivedPackets(0, size);
 }
 
 void ConnectionStats::recordSentPackets(int payload, int total) {
     ++_currentSample.sentPackets;
-    ++_total.sentPackets;
-    
     _currentSample.sentUtilBytes += payload;
-    _total.sentUtilBytes += payload;
-    
     _currentSample.sentBytes += total;
-    _total.sentBytes += total;
 }
 
 void ConnectionStats::recordReceivedPackets(int payload, int total) {
     ++_currentSample.receivedPackets;
-    ++_total.receivedPackets;
-    
     _currentSample.receivedUtilBytes += payload;
-    _total.receivedUtilBytes += payload;
-    
     _currentSample.receivedBytes += total;
-    _total.receivedBytes += total;
+}
+
+void ConnectionStats::recordRetransmittedPackets(int payload, int total) {
+    ++_currentSample.retransmittedPackets;
+    _currentSample.retransmittedUtilBytes += payload;
+    _currentSample.retransmittedBytes += total;
+}
+
+void ConnectionStats::recordDuplicatePackets(int payload, int total) {
+    ++_currentSample.duplicatePackets;
+    _currentSample.duplicateUtilBytes += payload;
+    _currentSample.duplicateBytes += total;
 }
 
 void ConnectionStats::recordUnreliableSentPackets(int payload, int total) {
     ++_currentSample.sentUnreliablePackets;
-    ++_total.sentUnreliablePackets;
-    
     _currentSample.sentUnreliableUtilBytes += payload;
-    _total.sentUnreliableUtilBytes += payload;
-    
     _currentSample.sentUnreliableBytes += total;
-    _total.sentUnreliableBytes += total;
 }
 
 void ConnectionStats::recordUnreliableReceivedPackets(int payload, int total) {
     ++_currentSample.receivedUnreliablePackets;
-    ++_total.receivedUnreliablePackets;
-    
     _currentSample.receivedUnreliableUtilBytes += payload;
-    _total.receivedUnreliableUtilBytes += payload;
-    
-    _currentSample.sentUnreliableBytes += total;
-    _total.receivedUnreliableBytes += total;
-}
-
-static const double EWMA_CURRENT_SAMPLE_WEIGHT = 0.125;
-static const double EWMA_PREVIOUS_SAMPLES_WEIGHT = 1.0 - EWMA_CURRENT_SAMPLE_WEIGHT;
-
-void ConnectionStats::recordSendRate(int sample) {
-    _currentSample.sendRate = sample;
-    _total.sendRate = (int)((_total.sendRate * EWMA_PREVIOUS_SAMPLES_WEIGHT) + (sample * EWMA_CURRENT_SAMPLE_WEIGHT));
-}
-
-void ConnectionStats::recordReceiveRate(int sample) {
-    _currentSample.receiveRate = sample;
-    _total.receiveRate = (int)((_total.receiveRate * EWMA_PREVIOUS_SAMPLES_WEIGHT) + (sample * EWMA_CURRENT_SAMPLE_WEIGHT));
-}
-
-void ConnectionStats::recordRTT(int sample) {
-    _currentSample.rtt = sample;
-    _total.rtt = (int)((_total.rtt * EWMA_PREVIOUS_SAMPLES_WEIGHT) + (sample * EWMA_CURRENT_SAMPLE_WEIGHT));
+    _currentSample.receivedUnreliableBytes += total;
 }
 
 void ConnectionStats::recordCongestionWindowSize(int sample) {
     _currentSample.congestionWindowSize = sample;
-    _total.congestionWindowSize = (int)((_total.congestionWindowSize * EWMA_PREVIOUS_SAMPLES_WEIGHT) + (sample * EWMA_CURRENT_SAMPLE_WEIGHT));
 }
 
 void ConnectionStats::recordPacketSendPeriod(int sample) {
     _currentSample.packetSendPeriod = sample;
-    _total.packetSendPeriod = (int)((_total.packetSendPeriod * EWMA_PREVIOUS_SAMPLES_WEIGHT) + (sample * EWMA_CURRENT_SAMPLE_WEIGHT));
 }
 
 QDebug& operator<<(QDebug&& debug, const udt::ConnectionStats::Stats& stats) {
@@ -117,13 +97,13 @@ QDebug& operator<<(QDebug&& debug, const udt::ConnectionStats::Stats& stats) {
     HIFI_LOG_EVENT(SentACK)
     HIFI_LOG_EVENT(ReceivedACK)
     HIFI_LOG_EVENT(ProcessedACK)
-    HIFI_LOG_EVENT(Retransmission)
-    HIFI_LOG_EVENT(Duplicate)
     ;
 #undef HIFI_LOG_EVENT
 
     debug << "    Sent packets: " << stats.sentPackets;
+    debug << "\n    Retransmitted packets: " << stats.retransmittedPackets;
     debug << "\n     Received packets: " << stats.receivedPackets;
+    debug << "\n     Duplicate packets: " << stats.duplicatePackets;
     debug << "\n     Sent util bytes: " << stats.sentUtilBytes;
     debug << "\n     Sent bytes: " << stats.sentBytes;
     debug << "\n     Received bytes: " << stats.receivedBytes << "\n";
diff --git a/libraries/networking/src/udt/ConnectionStats.h b/libraries/networking/src/udt/ConnectionStats.h
index 0fdd1636b3..8ff0ec90fd 100644
--- a/libraries/networking/src/udt/ConnectionStats.h
+++ b/libraries/networking/src/udt/ConnectionStats.h
@@ -14,6 +14,7 @@
 
 #include <chrono>
 #include <array>
+#include <stdint.h>
 
 namespace udt {
 
@@ -24,8 +25,6 @@ public:
             SentACK,
             ReceivedACK,
             ProcessedACK,
-            Retransmission,
-            Duplicate,
             
             NumEvents
         };
@@ -40,19 +39,27 @@ public:
         Events events;
         
         // packet counts and sizes
-        int sentPackets { 0 };
-        int receivedPackets { 0 };
-        int sentUtilBytes { 0 };
-        int receivedUtilBytes { 0 };
-        int sentBytes { 0 };
-        int receivedBytes { 0 };
+        uint32_t sentPackets { 0 };
+        uint32_t receivedPackets { 0 };
+        uint32_t retransmittedPackets { 0 };
+        uint32_t duplicatePackets { 0 };
+
+        uint64_t sentUtilBytes { 0 };
+        uint64_t receivedUtilBytes { 0 };
+        uint64_t retransmittedUtilBytes { 0 };
+        uint64_t duplicateUtilBytes { 0 };
+
+        uint64_t sentBytes { 0 };
+        uint64_t receivedBytes { 0 };
+        uint64_t retransmittedBytes { 0 };
+        uint64_t duplicateBytes { 0 };
         
-        int sentUnreliablePackets { 0 };
-        int receivedUnreliablePackets { 0 };
-        int sentUnreliableUtilBytes { 0 };
-        int receivedUnreliableUtilBytes { 0 };
-        int sentUnreliableBytes { 0 };
-        int receivedUnreliableBytes { 0 };
+        uint32_t sentUnreliablePackets { 0 };
+        uint32_t receivedUnreliablePackets { 0 };
+        uint64_t sentUnreliableUtilBytes { 0 };
+        uint64_t receivedUnreliableUtilBytes { 0 };
+        uint64_t sentUnreliableBytes { 0 };
+        uint64_t receivedUnreliableBytes { 0 };
        
         // the following stats are trailing averages in the result, not totals
         int sendRate { 0 };
@@ -69,25 +76,26 @@ public:
     ConnectionStats();
     
     Stats sample();
-    Stats getTotalStats();
     
     void record(Stats::Event event);
-    
+
+    void recordSentACK(int size);
+    void recordReceivedACK(int size);
+
     void recordSentPackets(int payload, int total);
     void recordReceivedPackets(int payload, int total);
+
+    void recordRetransmittedPackets(int payload, int total);
+    void recordDuplicatePackets(int payload, int total);
     
     void recordUnreliableSentPackets(int payload, int total);
     void recordUnreliableReceivedPackets(int payload, int total);
-    
-    void recordSendRate(int sample);
-    void recordReceiveRate(int sample);
-    void recordRTT(int sample);
+
     void recordCongestionWindowSize(int sample);
     void recordPacketSendPeriod(int sample);
     
 private:
     Stats _currentSample;
-    Stats _total;
 };
     
 }
diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp
index 2cc5804d10..6273c61762 100644
--- a/libraries/networking/src/udt/PacketHeaders.cpp
+++ b/libraries/networking/src/udt/PacketHeaders.cpp
@@ -33,7 +33,7 @@ PacketVersion versionForPacketType(PacketType packetType) {
         case PacketType::EntityEdit:
         case PacketType::EntityData:
         case PacketType::EntityPhysics:
-            return static_cast<PacketVersion>(EntityVersion::GrabTraits);
+            return static_cast<PacketVersion>(EntityVersion::MorePropertiesCleanup);
         case PacketType::EntityQuery:
             return static_cast<PacketVersion>(EntityQueryPacketVersion::ConicalFrustums);
         case PacketType::AvatarIdentity:
diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h
index 62549a7562..c1d91681df 100644
--- a/libraries/networking/src/udt/PacketHeaders.h
+++ b/libraries/networking/src/udt/PacketHeaders.h
@@ -251,7 +251,8 @@ enum class EntityVersion : PacketVersion {
     ImageEntities,
     GridEntities,
     MissingTextProperties,
-    GrabTraits
+    GrabTraits,
+    MorePropertiesCleanup
 };
 
 enum class EntityScriptCallMethodVersion : PacketVersion {
diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp
index 3178217a36..b507f0921d 100644
--- a/libraries/networking/src/udt/SendQueue.cpp
+++ b/libraries/networking/src/udt/SendQueue.cpp
@@ -404,6 +404,7 @@ bool SendQueue::maybeResendPacket() {
                 Packet::ObfuscationLevel level = (Packet::ObfuscationLevel)(entry.first < 2 ? 0 : (entry.first - 2) % 4);
 
                 auto wireSize = resendPacket.getWireSize();
+                auto payloadSize = resendPacket.getPayloadSize();
                 auto sequenceNumber = it->first;
 
                 if (level != Packet::NoObfuscation) {
@@ -439,7 +440,8 @@ bool SendQueue::maybeResendPacket() {
                     sentLocker.unlock();
                 }
                 
-                emit packetRetransmitted(wireSize, sequenceNumber, p_high_resolution_clock::now());
+                emit packetRetransmitted(wireSize, payloadSize, sequenceNumber,
+                                         p_high_resolution_clock::now());
                 
                 // Signal that we did resend a packet
                 return true;
diff --git a/libraries/networking/src/udt/SendQueue.h b/libraries/networking/src/udt/SendQueue.h
index c1faac3b22..148d813fc1 100644
--- a/libraries/networking/src/udt/SendQueue.h
+++ b/libraries/networking/src/udt/SendQueue.h
@@ -78,7 +78,7 @@ public slots:
 
 signals:
     void packetSent(int wireSize, int payloadSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint);
-    void packetRetransmitted(int wireSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint);
+    void packetRetransmitted(int wireSize, int payloadSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint);
     
     void queueInactive();
 
diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp
index 25e6fae023..358acce694 100644
--- a/libraries/networking/src/udt/Socket.cpp
+++ b/libraries/networking/src/udt/Socket.cpp
@@ -129,6 +129,12 @@ qint64 Socket::writePacket(const Packet& packet, const HifiSockAddr& sockAddr) {
         sequenceNumber = ++_unreliableSequenceNumbers[sockAddr];
     }
 
+    auto connection = findOrCreateConnection(sockAddr, true);
+    if (connection) {
+        connection->recordSentUnreliablePackets(packet.getWireSize(),
+                                                packet.getPayloadSize());
+    }
+
     // write the correct sequence number to the Packet here
     packet.writeSequenceNumber(sequenceNumber);
 
@@ -392,9 +398,10 @@ void Socket::readPendingDatagrams() {
 
             // call our verification operator to see if this packet is verified
             if (!_packetFilterOperator || _packetFilterOperator(*packet)) {
+                auto connection = findOrCreateConnection(senderSockAddr, true);
+
                 if (packet->isReliable()) {
                     // if this was a reliable packet then signal the matching connection with the sequence number
-                    auto connection = findOrCreateConnection(senderSockAddr, true);
 
                     if (!connection || !connection->processReceivedSequenceNumber(packet->getSequenceNumber(),
                                                                                   packet->getDataSize(),
@@ -406,6 +413,9 @@ void Socket::readPendingDatagrams() {
 #endif
                         continue;
                     }
+                } else if (connection) {
+                    connection->recordReceivedUnreliablePackets(packet->getWireSize(),
+                                                                packet->getPayloadSize());
                 }
 
                 if (packet->isPartOfMessage()) {
diff --git a/libraries/octree/src/OctreeEntitiesFileParser.cpp b/libraries/octree/src/OctreeEntitiesFileParser.cpp
index 962f744c34..2f03eda286 100644
--- a/libraries/octree/src/OctreeEntitiesFileParser.cpp
+++ b/libraries/octree/src/OctreeEntitiesFileParser.cpp
@@ -9,13 +9,15 @@
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
 //
 
+#include "OctreeEntitiesFileParser.h"
+
 #include <sstream>
 #include <cctype>
+
 #include <QUuid>
 #include <QJsonDocument>
 #include <QJsonObject>
 
-#include "OctreeEntitiesFileParser.h"
 
 using std::string;
 
diff --git a/libraries/render-utils/src/glowLine.slv b/libraries/render-utils/src/glowLine.slv
index 3471bc2f98..1bcb25817c 100644
--- a/libraries/render-utils/src/glowLine.slv
+++ b/libraries/render-utils/src/glowLine.slv
@@ -49,7 +49,7 @@ void main(void) {
     vec3 orthogonal = cross(v1, v2) * _lineData.width;
     
     // Deteremine which end to emit based on the vertex id (even / odd)
-    vec4 eye = (0 == gl_VertexID % 2) ? p1eye : p2eye;
+    vec4 eye = mix(p2eye, p1eye, float(gl_VertexID % 2 == 0));
 
     // Add or subtract the orthogonal vector based on a different vertex ID 
     // calculation
diff --git a/libraries/shared/src/AABox.cpp b/libraries/shared/src/AABox.cpp
index ff6c2a4e6e..6ff290f9f2 100644
--- a/libraries/shared/src/AABox.cpp
+++ b/libraries/shared/src/AABox.cpp
@@ -480,7 +480,7 @@ void AABox::embiggen(const glm::vec3& scale) {
 }
 
 void AABox::setScaleStayCentered(const glm::vec3& scale) {
-    _corner += -0.5f * scale;
+    _corner -= 0.5f * (scale - _scale);
     _scale = scale;
 }
 
diff --git a/libraries/shared/src/GLMHelpers.cpp b/libraries/shared/src/GLMHelpers.cpp
index 905bf3ccfd..790623ad8e 100644
--- a/libraries/shared/src/GLMHelpers.cpp
+++ b/libraries/shared/src/GLMHelpers.cpp
@@ -9,9 +9,12 @@
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
 //
 
-#include <limits>
 #include "GLMHelpers.h"
+
+#include <limits>
+
 #include <glm/gtc/matrix_transform.hpp>
+
 #include "NumericalConstants.h"
 
 const vec3 Vectors::UNIT_X{ 1.0f, 0.0f, 0.0f };
diff --git a/libraries/shared/src/ResourceRequestObserver.cpp b/libraries/shared/src/ResourceRequestObserver.cpp
index 5e0925520a..608d6905c5 100644
--- a/libraries/shared/src/ResourceRequestObserver.cpp
+++ b/libraries/shared/src/ResourceRequestObserver.cpp
@@ -1,6 +1,6 @@
 //
-//  ResourceAccessMonitor.h
-//  libraries/networking/src
+//  ResourceRequestObserver.cpp
+//  libraries/shared/src
 //
 //  Created by Kerry Ivan Kurian on 9/27/18.
 //  Copyright 2018 High Fidelity, Inc.
@@ -9,12 +9,12 @@
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
 //
 
+#include "ResourceRequestObserver.h"
 
 #include <QJsonArray>
 #include <QJsonObject>
 #include <QString>
 #include <QUrl>
-#include "ResourceRequestObserver.h"
 
 void ResourceRequestObserver::update(const QUrl& requestUrl,
     const qint64 callerId,
diff --git a/libraries/shared/src/ResourceRequestObserver.h b/libraries/shared/src/ResourceRequestObserver.h
index 1b1bc322e5..edf3c617cb 100644
--- a/libraries/shared/src/ResourceRequestObserver.h
+++ b/libraries/shared/src/ResourceRequestObserver.h
@@ -1,6 +1,6 @@
 //
 //  ResourceRequestObserver.h
-//  libraries/commerce/src
+//  libraries/shared/src
 //
 //  Created by Kerry Ivan Kurian on 9/27/18.
 //  Copyright 2018 High Fidelity, Inc.
diff --git a/scripts/developer/tests/avatarToWorldTests.js b/scripts/developer/tests/avatarToWorldTests.js
index c2da49cbd4..e27c3c4b5b 100644
--- a/scripts/developer/tests/avatarToWorldTests.js
+++ b/scripts/developer/tests/avatarToWorldTests.js
@@ -42,52 +42,6 @@ function jointToWorldPointTest_update(deltaTime) {
    Entities.editEntity(jointToWorldPointTest_sphereEntity, newProperties);
 }
 
-//jointToWorldDirection
-//	create line in world space
-//	each frame calculate world space direction of players head z axis
-//	update line to match
-var jointToWorldDirectionTest_lineEntity;
-function jointToWorldDirectionTest() {
-   var jointIndex = MyAvatar.getJointIndex("Head");
-   var avatarPos = MyAvatar.getJointPosition(jointIndex);
-
-   var jointDir = { x: 1, y: 0, z: 1 };
-   var worldDir = MyAvatar.jointToWorldDirection(jointDir, jointIndex);
-   print(worldDir.x);
-   print(worldDir.y);
-   print(worldDir.z);
-   jointToWorldDirectionTest_lineEntity = Entities.addEntity({
-      type: "Line",
-      color: {red: 250, green: 0, blue: 0},
-      dimensions: {x: 5, y: 5, z: 5},
-      lifetime: 10.0,
-      linePoints: [{
-        x: 0,
-        y: 0,
-        z: 0
-       }, worldDir
-       ],
-      position : avatarPos,
-   });
-}
-function jointToWorldDirection_update(deltaTime) {
-   var jointIndex = MyAvatar.getJointIndex("Head");
-   var avatarPos = MyAvatar.getJointPosition(jointIndex);
-   var jointDir = { x: 1, y: 0, z: 0 };
-   var worldDir = MyAvatar.jointToWorldDirection(jointDir, jointIndex);
-   var newProperties = {
-      linePoints: [{
-        x: 0,
-        y: 0,
-        z: 0
-      }, worldDir
-      ],
-      position : avatarPos
-   };
-   
-   Entities.editEntity(jointToWorldDirectionTest_lineEntity, newProperties);
-}
-
 //jointToWorldRotation
 //	create box in world space
 //	each frame calculate world space rotation of players head
diff --git a/scripts/developer/tests/worldToAvatarTests.js b/scripts/developer/tests/worldToAvatarTests.js
index 6f0b19dc2d..e368a5e455 100644
--- a/scripts/developer/tests/worldToAvatarTests.js
+++ b/scripts/developer/tests/worldToAvatarTests.js
@@ -49,53 +49,6 @@ function worldToJointPointTest() {
    Entities.addEntity(worldSphereProps);
 }
 
-//worldToJointDirection
-//	create line and attach to avatars head
-//	each frame calculate direction of world x axis in joint space of players head
-//	update arrow orientation to match
-var worldToJointDirectionTest_lineEntity;
-function worldToJointDirectionTest() {
-   var jointIndex = MyAvatar.getJointIndex("Head");
-
-   var jointPosition_WorldSpace =  MyAvatar.getJointPosition(jointIndex);
-   var jointOffset_WorldSpace = { x: 0, y: 0, z: 0 };
-   var jointPosition_WorldSpaceOffset = Vec3.sum(jointPosition_WorldSpace, jointOffset_WorldSpace);
-   var jointPosition_JointSpaceOffset = MyAvatar.worldToJointPoint(jointPosition_WorldSpaceOffset, jointIndex);
-
-   var worldDir = { x: 1, y: 0, z: 0 };
-   var avatarDir = MyAvatar.worldToJointDirection(worldDir, jointIndex);
-   
-   worldToJointDirectionTest_lineEntity = Entities.addEntity({
-      type: "Line",
-      color: {red: 200, green: 250, blue: 0},
-      dimensions: {x: 5, y: 5, z: 5},
-      lifetime: 10.0,
-      linePoints: [{
-        x: 0,
-        y: 0,
-        z: 0
-       }, avatarDir
-       ],
-      localPosition : jointOffset_WorldSpace,
-      parentID : AVATAR_SELF_ID,         
-      parentJointIndex : jointIndex      
-   });
-}
-
-function worldToJointDirectionTest_update(deltaTime) {  
-   var jointIndex = MyAvatar.getJointIndex("Head");
-   var worldDir = { x: 1, y: 0, z: 0 };
-   var avatarDir = MyAvatar.worldToJointDirection(worldDir, jointIndex);
-   var newProperties = { linePoints: [{
-        x: 0,
-        y: 0,
-        z: 0
-       }, avatarDir
-       ]};
-   
-   Entities.editEntity(worldToJointDirectionTest_lineEntity, newProperties);
-}
-
 //worldToJointRotation
 //	create box and parent to some player joint
 //	convert world identity rotation to joint space rotation
diff --git a/tools/udt-test/src/UDTTest.cpp b/tools/udt-test/src/UDTTest.cpp
index 46e7ed0be0..65bf2c7ebd 100644
--- a/tools/udt-test/src/UDTTest.cpp
+++ b/tools/udt-test/src/UDTTest.cpp
@@ -386,7 +386,7 @@ void UDTTest::sampleStats() {
             QString::number(stats.events[udt::ConnectionStats::Stats::ReceivedACK]).rightJustified(CLIENT_STATS_TABLE_HEADERS[++headerIndex].size()),
             QString::number(stats.events[udt::ConnectionStats::Stats::ProcessedACK]).rightJustified(CLIENT_STATS_TABLE_HEADERS[++headerIndex].size()),
             QString::number(stats.sentPackets).rightJustified(CLIENT_STATS_TABLE_HEADERS[++headerIndex].size()),
-            QString::number(stats.events[udt::ConnectionStats::Stats::Retransmission]).rightJustified(CLIENT_STATS_TABLE_HEADERS[++headerIndex].size())
+            QString::number(stats.retransmittedPackets).rightJustified(CLIENT_STATS_TABLE_HEADERS[++headerIndex].size())
         };
         
         // output this line of values