diff --git a/libraries/script-engine/src/ScriptManager.cpp b/libraries/script-engine/src/ScriptManager.cpp
index c524c80d5f..286e78b311 100644
--- a/libraries/script-engine/src/ScriptManager.cpp
+++ b/libraries/script-engine/src/ScriptManager.cpp
@@ -1117,6 +1117,7 @@ void ScriptManager::timerFired() {
         return; // bail early
     }
 
+#ifdef SCRIPT_TIMER_PERFORMANCE_STATISTICS
     _timerCallCounter++;
     if (_timerCallCounter % 100 == 0) {
         qCDebug(scriptengine) << "Script engine: " << _engine->manager()->getFilename()
@@ -1124,6 +1125,7 @@ void ScriptManager::timerFired() {
     }
     QElapsedTimer callTimer;
     callTimer.start();
+#endif
 
     QTimer* callingTimer = reinterpret_cast<QTimer*>(sender());
     CallbackData timerData = _timerFunctionMap.value(callingTimer);
@@ -1146,7 +1148,9 @@ void ScriptManager::timerFired() {
         qCWarning(scriptengine) << "timerFired -- invalid function" << timerData.function.toVariant().toString();
     }
 
+#ifdef SCRIPT_TIMER_PERFORMANCE_STATISTICS
     _totalTimeInTimerEvents_s += callTimer.elapsed() / 1000.0;
+#endif
 }
 
 QTimer* ScriptManager::setupTimerWithInterval(const ScriptValue& function, int intervalMS, bool isSingleShot) {
diff --git a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp
index 1c5855968b..3af798842f 100644
--- a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp
+++ b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp
@@ -552,7 +552,7 @@ void ScriptObjectV8Proxy::v8Set(v8::Local<v8::Name> name, v8::Local<v8::Value> v
 }
 
 void ScriptObjectV8Proxy::v8GetPropertyNames(const v8::PropertyCallbackInfo<v8::Array>& info) {
-    qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames called";
+    //qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames called";
     v8::HandleScope handleScope(info.GetIsolate());
     auto context = info.GetIsolate()->GetCurrentContext();
     v8::Context::Scope contextScope(context);
@@ -897,7 +897,7 @@ void ScriptVariantV8Proxy::v8Set(v8::Local<v8::Name> name, v8::Local<v8::Value>
 
 void ScriptVariantV8Proxy::v8GetPropertyNames(const v8::PropertyCallbackInfo<v8::Array>& info) {
     //V8TODO: Only methods from the prototype should be listed.
-    qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames called";
+    //qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames called";
     v8::HandleScope handleScope(info.GetIsolate());
     auto context = info.GetIsolate()->GetCurrentContext();
     v8::Context::Scope contextScope(context);
@@ -1387,6 +1387,7 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu
         return id;
     }
 
+#ifdef SCRIPT_EVENT_PERFORMANCE_STATISTICS
     _callCounter++;
     if (_callCounter % 1000 == 0) {
         qCDebug(scriptengine_v8) << "Script engine: " << _engine->manager()->getFilename() << " Signal proxy " << fullName()
@@ -1394,6 +1395,7 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu
     }
     QElapsedTimer callTimer;
     callTimer.start();
+#endif
 
     auto isolate = _engine->getIsolate();
     v8::Locker locker(isolate);
@@ -1488,8 +1490,9 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu
     }
     //});
 
+#ifdef SCRIPT_EVENT_PERFORMANCE_STATISTICS
     _totalCallTime_s += callTimer.elapsed() / 1000.0f;
-
+#endif
     return -1;
 }
 
diff --git a/script-archive/libraries/overlayManager.js b/script-archive/libraries/overlayManager.js
index cca9be8f75..17293f3b56 100644
--- a/script-archive/libraries/overlayManager.js
+++ b/script-archive/libraries/overlayManager.js
@@ -65,6 +65,7 @@
         properties.forEach(function(prop) {
             Object.defineProperty(that.prototype, prop, {
                 get: function() {
+                    //V8TODO:
                     return Overlays.getProperty(this._id, prop);
                 },
                 set: function(newValue) {
diff --git a/scripts/system/controllers/controllerModules/nearParentGrabOverlay.js b/scripts/system/controllers/controllerModules/nearParentGrabOverlay.js
index 5dcfee23cb..a8f1487105 100644
--- a/scripts/system/controllers/controllerModules/nearParentGrabOverlay.js
+++ b/scripts/system/controllers/controllerModules/nearParentGrabOverlay.js
@@ -47,7 +47,7 @@ Script.include("/~/system/libraries/utils.js");
         };
 
         this.isGrabbedThingVisible = function() {
-            return Overlays.getProperty(this.grabbedThingID, "visible");
+            return Entities.getEntityProperties(this.grabbedThingID, ["visible"]).visible;
         };
 
         this.thisHandIsParent = function(props) {
@@ -78,10 +78,10 @@ Script.include("/~/system/libraries/utils.js");
 
         this.getGrabbedProperties = function() {
             return {
-                position: Overlays.getProperty(this.grabbedThingID, "position"),
-                rotation: Overlays.getProperty(this.grabbedThingID, "rotation"),
-                parentID: Overlays.getProperty(this.grabbedThingID, "parentID"),
-                parentJointIndex: Overlays.getProperty(this.grabbedThingID, "parentJointIndex"),
+                position: Entities.getEntityProperties(this.grabbedThingID, ["position"]).position,
+                rotation: Entities.getEntityProperties(this.grabbedThingID, ["rotation"]).rotation,
+                parentID: Entities.getEntityProperties(this.grabbedThingID, ["parentID"]).parentID,
+                parentJointIndex: Entities.getEntityProperties(this.grabbedThingID, ["parentJointIndex"]).parentJointIndex,
                 dynamic: false,
                 shapeType: "none"
             };
@@ -164,7 +164,7 @@ Script.include("/~/system/libraries/utils.js");
         this.getTargetID = function(overlays, controllerData) {
             var sensorScaleFactor = MyAvatar.sensorToWorldScale;
             for (var i = 0; i < overlays.length; i++) {
-                var overlayPosition = Overlays.getProperty(overlays[i], "position");
+                var overlayPosition = Entities.getEntityProperties(overlays[i], ["position"]).position;
                 var handPosition = controllerData.controllerLocations[this.hand].position;
                 var distance = Vec3.distance(overlayPosition, handPosition);
                 if (distance <= NEAR_GRAB_RADIUS * sensorScaleFactor) {
@@ -202,7 +202,8 @@ Script.include("/~/system/libraries/utils.js");
 
             var candidateOverlays = controllerData.nearbyOverlayIDs[this.hand];
             var grabbableOverlays = candidateOverlays.filter(function(overlayID) {
-                return Overlays.getProperty(overlayID, "grabbable");
+                // V8TODO: check if this works
+                return Entities.getEntityProperties(overlayID, ["grab"]).grab.grabbable;
             });
 
             var targetID = this.getTargetID(grabbableOverlays, controllerData);
diff --git a/scripts/system/controllers/controllerModules/stylusInput.js b/scripts/system/controllers/controllerModules/stylusInput.js
index 3f429d6159..38ee6a765b 100644
--- a/scripts/system/controllers/controllerModules/stylusInput.js
+++ b/scripts/system/controllers/controllerModules/stylusInput.js
@@ -31,7 +31,7 @@ Script.include("/~/system/libraries/controllers.js");
     }
 
     function getOverlayDistance(controllerPosition, overlayID) {
-        var position = Overlays.getProperty(overlayID, "position");
+        var position = Entities.getEntityProperties(overlayID, ["position"]).position;
         return {
             id: overlayID,
             distance: Vec3.distance(position, controllerPosition)
@@ -98,7 +98,7 @@ Script.include("/~/system/libraries/controllers.js");
 
             for (i = 0; i < candidateOverlays.length; i++) {
                 if (!(HMD.tabletID && candidateOverlays[i] === HMD.tabletID) &&
-                    Overlays.getProperty(candidateOverlays[i], "visible")) {
+                    Entities.getEntityProperties(candidateOverlays[i], ["visible"]).visible) {
                     stylusTarget = getOverlayDistance(controllerPosition, candidateOverlays[i]);
                     if (stylusTarget) {
                         stylusTargets.push(stylusTarget);
@@ -108,7 +108,7 @@ Script.include("/~/system/libraries/controllers.js");
 
             // add the tabletScreen, if it is valid
             if (HMD.tabletScreenID && HMD.tabletScreenID !== Uuid.NULL &&
-                Overlays.getProperty(HMD.tabletScreenID, "visible")) {
+                Entities.getEntityProperties(HMD.tabletScreenID, ["visible"]).visible) {
                 stylusTarget = getOverlayDistance(controllerPosition, HMD.tabletScreenID);
                 if (stylusTarget) {
                     stylusTargets.push(stylusTarget);
@@ -117,7 +117,7 @@ Script.include("/~/system/libraries/controllers.js");
 
             // add the tablet home button.
             if (HMD.homeButtonID && HMD.homeButtonID !== Uuid.NULL &&
-                Overlays.getProperty(HMD.homeButtonID, "visible")) {
+                Entities.getEntityProperties(HMD.homeButtonID, ["visible"]).visible) {
                 stylusTarget = getOverlayDistance(controllerPosition, HMD.homeButtonID);
                 if (stylusTarget) {
                     stylusTargets.push(stylusTarget);
@@ -125,7 +125,7 @@ Script.include("/~/system/libraries/controllers.js");
             }
 
             // Add the mini tablet.
-            if (HMD.miniTabletScreenID && Overlays.getProperty(HMD.miniTabletScreenID, "visible") &&
+            if (HMD.miniTabletScreenID && Entities.getEntityProperties(HMD.miniTabletScreenID, ["visible"]).visible &&
                 this.hand != HMD.miniTabletHand) {
                 stylusTarget = getOverlayDistance(controllerPosition, HMD.miniTabletScreenID);
                 if (stylusTarget) {
diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js
index 98c3e70fdf..abe3bbea5b 100644
--- a/scripts/system/controllers/controllerModules/teleport.js
+++ b/scripts/system/controllers/controllerModules/teleport.js
@@ -215,7 +215,7 @@ Script.include("/~/system/libraries/controllers.js");
                 var avatarSensorPosition = Mat4.transformPoint(worldToSensorMatrix, MyAvatar.position);
                 avatarSensorPosition.y = 0;
 
-                var targetRotation = Overlays.getProperty(_this.targetOverlayID, "rotation");
+                var targetRotation = Entities.getEntityProperties(_this.targetOverlayID, ["rotation"]).rotation;
                 var relativePlayAreaCenterOffset =
                     Vec3.sum(_this.playAreaCenterOffset, { x: 0, y: -TARGET_MODEL_DIMENSIONS.y / 2, z: 0 });
                 var localPosition = Vec3.multiplyQbyV(Quat.inverse(targetRotation),
@@ -507,7 +507,7 @@ Script.include("/~/system/libraries/controllers.js");
                 });
             } else {
                 // Set play area position and rotation in local coordinates with parenting.
-                var targetRotation = Overlays.getProperty(_this.targetOverlayID, "rotation");
+                var targetRotation = Entities.getEntityProperties(_this.targetOverlayID, ["rotation"]).rotation;
                 var sensorToTargetRotation = Quat.multiply(Quat.inverse(targetRotation), sensorToWorldRotation);
                 var relativePlayAreaCenterOffset =
                     Vec3.sum(_this.playAreaCenterOffset, { x: 0, y: -TARGET_MODEL_DIMENSIONS.y / 2, z: 0 });
diff --git a/scripts/system/controllers/controllerModules/webSurfaceLaserInput.js b/scripts/system/controllers/controllerModules/webSurfaceLaserInput.js
index cf700a8ad9..27388ed153 100644
--- a/scripts/system/controllers/controllerModules/webSurfaceLaserInput.js
+++ b/scripts/system/controllers/controllerModules/webSurfaceLaserInput.js
@@ -58,7 +58,8 @@ Script.include("/~/system/libraries/controllers.js");
                 if (nearGrabModule) {
                     var candidateOverlays = controllerData.nearbyOverlayIDs[this.hand];
                     var grabbableOverlays = candidateOverlays.filter(function(overlayID) {
-                        return Overlays.getProperty(overlayID, "grabbable");
+                        //V8TODO: this needs to be checked if it works
+                        return Entities.getEntityProperties(overlayID, ["grab"]).grab.grabbable;
                     });
                     var target = nearGrabModule.getTargetID(grabbableOverlays, controllerData);
                     if (target) {
@@ -105,7 +106,7 @@ Script.include("/~/system/libraries/controllers.js");
                 if (intersection.type === Picks.INTERSECTED_OVERLAY) {
                     var overlayIndex = this.ignoredObjects.indexOf(objectID);
 
-                    var overlayName = Overlays.getProperty(objectID, "name");
+                    var overlayName = Entities.getEntityProperties(objectID, ["name"]).name;
                     if (overlayName !== "Loading-Destination-Card-Text" && overlayName !== "Loading-Destination-Card-GoTo-Image" &&
                         overlayName !== "Loading-Destination-Card-GoTo-Image-Hover") {
                         var data = {
diff --git a/scripts/system/interstitialPage.js b/scripts/system/interstitialPage.js
index 0c238756a9..2f573abc32 100644
--- a/scripts/system/interstitialPage.js
+++ b/scripts/system/interstitialPage.js
@@ -237,8 +237,8 @@
     var connectionToDomainFailed = false;
 
     function getAnchorLocalYOffset() {
-        var loadingSpherePosition = Overlays.getProperty(loadingSphereID, "position");
-        var loadingSphereOrientation = Overlays.getProperty(loadingSphereID, "rotation");
+        var loadingSpherePosition = Entities.getEntityProperties(loadingSphereID, ["position"]).position;
+        var loadingSphereOrientation = Entities.getEntityProperties(loadingSphereID, ["rotation"]).rotation;
         var overlayXform = new Xform(loadingSphereOrientation, loadingSpherePosition);
         var worldToOverlayXform = overlayXform.inv();
         var headPosition = MyAvatar.getHeadPosition();
diff --git a/scripts/system/libraries/controllerDispatcherUtils.js b/scripts/system/libraries/controllerDispatcherUtils.js
index 8262212b5a..bf9776d478 100644
--- a/scripts/system/libraries/controllerDispatcherUtils.js
+++ b/scripts/system/libraries/controllerDispatcherUtils.js
@@ -435,9 +435,9 @@ var projectOntoEntityXYPlane = function (entityID, worldPos, popProps) {
 };
 
 var projectOntoOverlayXYPlane = function projectOntoOverlayXYPlane(overlayID, worldPos) {
-    var position = Overlays.getProperty(overlayID, "position");
-    var rotation = Overlays.getProperty(overlayID, "rotation");
-    var dimensions = Overlays.getProperty(overlayID, "dimensions");
+    var position = Entities.getEntityProperties(overlayID, ["position"]).position;
+    var rotation = Entities.getEntityProperties(overlayID, ["rotation"]).rotation;
+    var dimensions = Entities.getEntityProperties(overlayID, ["dimensions"]).dimensions;
     dimensions.z = 0.01; // we are projecting onto the XY plane of the overlay, so ignore the z dimension
 
     return projectOntoXYPlane(worldPos, position, rotation, dimensions, DEFAULT_REGISTRATION_POINT);
diff --git a/scripts/system/libraries/touchEventUtils.js b/scripts/system/libraries/touchEventUtils.js
index f0f7ec46fe..bdee5cf5dc 100644
--- a/scripts/system/libraries/touchEventUtils.js
+++ b/scripts/system/libraries/touchEventUtils.js
@@ -152,13 +152,13 @@ function composeTouchTargetFromIntersection(intersection) {
 
 // will return undefined if overlayID does not exist.
 function calculateTouchTargetFromOverlay(touchTip, overlayID) {
-    var overlayPosition = Overlays.getProperty(overlayID, "position");
+    var overlayPosition = Entities.getEntityProperties(overlayID, ["position"]).position;
     if (overlayPosition === undefined) {
         return;
     }
 
     // project touchTip onto overlay plane.
-    var overlayRotation = Overlays.getProperty(overlayID, "rotation");
+    var overlayRotation = Entities.getEntityProperties(overlayID, ["rotation"]).rotation;
     if (overlayRotation === undefined) {
         return;
     }
@@ -170,7 +170,8 @@ function calculateTouchTargetFromOverlay(touchTip, overlayID) {
     var invRot = Quat.inverse(overlayRotation);
     var localPos = Vec3.multiplyQbyV(invRot, Vec3.subtract(position, overlayPosition));
 
-    var dimensions = Overlays.getProperty(overlayID, "dimensions");
+    // V8TODO: check if this is correct for entities
+    var dimensions = Entities.getEntityProperties(overlayID, ["dimensions"]).dimensions;
     if (dimensions === undefined) {
         return;
     }
diff --git a/scripts/system/libraries/utils.js b/scripts/system/libraries/utils.js
index c7c30a58dd..5d76c53839 100644
--- a/scripts/system/libraries/utils.js
+++ b/scripts/system/libraries/utils.js
@@ -376,7 +376,7 @@ resizeTablet = function (width, newParentJointIndex, sensorToWorldScaleOverride)
     var sensorScaleFactor = sensorToWorldScaleOverride || MyAvatar.sensorToWorldScale;
     var sensorScaleOffsetOverride = 1;
     var SENSOR_TO_ROOM_MATRIX = 65534;
-    var parentJointIndex = newParentJointIndex || Overlays.getProperty(HMD.tabletID, "parentJointIndex");
+    var parentJointIndex = newParentJointIndex || Entities.getEntityProperties(HMD.tabletID, ["parentJointIndex"]).parentJointIndex;
     if (parentJointIndex === SENSOR_TO_ROOM_MATRIX) {
         sensorScaleOffsetOverride = 1 / sensorScaleFactor;
     }
diff --git a/scripts/system/marketplaces/marketplaces.js b/scripts/system/marketplaces/marketplaces.js
index 38287e3af3..fcc37cef0d 100644
--- a/scripts/system/marketplaces/marketplaces.js
+++ b/scripts/system/marketplaces/marketplaces.js
@@ -115,7 +115,7 @@ function setTabletVisibleInSecondaryCamera(visibleInSecondaryCam) {
         }
     } else {
         // if we're hiding the tablet, check to see if it was visible in the first place
-        tabletShouldBeVisibleInSecondaryCamera = Overlays.getProperty(HMD.tabletID, "isVisibleInSecondaryCamera");
+        tabletShouldBeVisibleInSecondaryCamera = Entities.getEntityProperties(HMD.tabletID, ["isVisibleInSecondaryCamera"]).isVisibleInSecondaryCamera;
     }
 
     Overlays.editOverlay(HMD.tabletID, { isVisibleInSecondaryCamera: visibleInSecondaryCam });
diff --git a/unpublishedScripts/marketplace/camera-move/app-camera-move.js b/unpublishedScripts/marketplace/camera-move/app-camera-move.js
index f9361c6091..ff6ad88c7d 100644
--- a/unpublishedScripts/marketplace/camera-move/app-camera-move.js
+++ b/unpublishedScripts/marketplace/camera-move/app-camera-move.js
@@ -354,7 +354,7 @@ function main() {
     settingsApp.isActiveChanged.connect(function(isActive) {
         updateButtonText();
         if (Overlays.getOverlayType(HMD.tabletScreenID)) {
-            var fromMode = Overlays.getProperty(HMD.tabletScreenID, 'inputMode'),
+            var fromMode = Entities.getEntityProperties(HMD.tabletScreenID, ['inputMode']).inputMode,
                 inputMode = isActive ? "Mouse" : "Touch";
             log('switching HMD.tabletScreenID from inputMode', fromMode, 'to', inputMode);
             Overlays.editOverlay(HMD.tabletScreenID, { inputMode: inputMode });