diff --git a/src/components/pin-networked-object-button.js b/src/components/pin-networked-object-button.js
index a522fbb51931449b39b604adf66e263e699c36bd..51f72ac1120cfa26af62d997225996a94bb0c33f 100644
--- a/src/components/pin-networked-object-button.js
+++ b/src/components/pin-networked-object-button.js
@@ -3,7 +3,7 @@ AFRAME.registerComponent("pin-networked-object-button", {
     this.scene = document.querySelector("a-scene");
 
     this.onClick = () => {
-      this.targetEl.setAttribute("pinned", "");
+      this.targetEl.setAttribute("pinnable", { pinned: true });
       this.scene.emit("object_pinned", { el: this.targetEl });
     };
 
diff --git a/src/components/pinnable.js b/src/components/pinnable.js
new file mode 100644
index 0000000000000000000000000000000000000000..f0f2e11f2c790c81804aa0385a3cfe8f72ecd057
--- /dev/null
+++ b/src/components/pinnable.js
@@ -0,0 +1,15 @@
+AFRAME.registerComponent("pinnable", {
+  schema: {
+    pinned: { default: false }
+  },
+
+  init() {},
+
+  update() {
+    this.el.setAttribute("grabbable", { maxGrabbers: this.data.pinned ? 0 : 1 });
+
+    if (this.data.pinned) {
+      this.el.setAttribute("body", { type: "static" });
+    }
+  }
+});
diff --git a/src/components/pinned.js b/src/components/pinned.js
deleted file mode 100644
index 225fd7208152199c0afc5cf285be3e4265c200f0..0000000000000000000000000000000000000000
--- a/src/components/pinned.js
+++ /dev/null
@@ -1,8 +0,0 @@
-AFRAME.registerComponent("pinned", {
-  init() {},
-
-  update() {
-    console.log("Disabling");
-    console.log(this.el);
-  }
-});
diff --git a/src/components/sticky-object.js b/src/components/sticky-object.js
index 61d04814a95b2e30cc79743a039dec1c0a6d5235..dbf57ed56353304d8409c42f776d76a53bcbe294 100644
--- a/src/components/sticky-object.js
+++ b/src/components/sticky-object.js
@@ -60,6 +60,8 @@ AFRAME.registerComponent("sticky-object", {
   },
 
   _onGrab() {
+    if (!this.el.grabbable || this.el.grabbable.data.maxGrabbers === 0) return;
+
     this.setLocked(false);
     this.el.body.collisionResponse = false;
   },
diff --git a/src/components/super-networked-interactable.js b/src/components/super-networked-interactable.js
index 86a49e71b2cea0639f3ef8de81120356177893fd..f2d1b398d387f60704488a69f58f1fb2bb9ced5d 100644
--- a/src/components/super-networked-interactable.js
+++ b/src/components/super-networked-interactable.js
@@ -51,6 +51,8 @@ AFRAME.registerComponent("super-networked-interactable", {
   },
 
   _onGrabStart: function(e) {
+    if (!this.el.grabbable || this.el.grabbable.data.maxGrabbers === 0) return;
+
     this.hand = e.detail.hand;
     this.hand.emit("haptic_pulse", { intensity: "high" });
     if (this.networkedEl && !NAF.utils.isMine(this.networkedEl)) {
diff --git a/src/hub.html b/src/hub.html
index 74a8d6c6abe272070c2ebb258021fd0649caa1c9..c54135cdd930d0529e0e49f3c56f822a94a1e13d 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -150,6 +150,7 @@
                     position-at-box-shape-border="target:.action-buttons"
                     destroy-at-extreme-distances
                     set-yxz-order
+                    pinnable
                 >
                     <a-entity class="action-buttons" visible-while-frozen>
                         <a-entity mixin="rounded-text-button" pin-networked-object-button position="0 0.125 0.01"> </a-entity>
diff --git a/src/hub.js b/src/hub.js
index fcd1c6bdb19e9860b3d109931e5d1984c6f43823..79ddeb10a657b4c0302b5f07caaf8e229de13ba6 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -55,7 +55,7 @@ import "./components/pinch-to-move";
 import "./components/pitch-yaw-rotator";
 import "./components/auto-scale-cannon-physics-body";
 import "./components/position-at-box-shape-border";
-import "./components/pinned";
+import "./components/pinnable";
 import "./components/pin-networked-object-button";
 import "./components/remove-networked-object-button";
 import "./components/destroy-at-extreme-distances";