diff --git a/libraries/controllers/src/controllers/UserInputMapper.cpp b/libraries/controllers/src/controllers/UserInputMapper.cpp
index 1eb1a9fa1a..c76ca9dbd3 100755
--- a/libraries/controllers/src/controllers/UserInputMapper.cpp
+++ b/libraries/controllers/src/controllers/UserInputMapper.cpp
@@ -312,7 +312,10 @@ void UserInputMapper::update(float deltaTime) {
 Input::NamedVector UserInputMapper::getAvailableInputs(uint16 deviceID) const {
     Locker locker(_lock);
     auto iterator = _registeredDevices.find(deviceID);
-    return iterator->second->getAvailableInputs();
+    if (iterator != _registeredDevices.end()) {
+        return iterator->second->getAvailableInputs();
+    }
+    return Input::NamedVector();
 }
 
 QVector<Action> UserInputMapper::getAllActions() const {
@@ -366,7 +369,7 @@ bool UserInputMapper::triggerHapticPulse(float strength, float duration, control
     Locker locker(_lock);
     bool toReturn = false;
     for (const auto& device : _registeredDevices) {
-        toReturn = toReturn || device.second->triggerHapticPulse(strength, duration, hand);
+        toReturn = device.second->triggerHapticPulse(strength, duration, hand) || toReturn;
     }
     return toReturn;
 }
@@ -1237,16 +1240,42 @@ void UserInputMapper::disableMapping(const Mapping::Pointer& mapping) {
 }
 
 void UserInputMapper::setActionState(Action action, float value, bool valid) {
+    Locker locker(_lock);
     _actionStates[toInt(action)] = value;
     _actionStatesValid[toInt(action)] = valid;
 }
 
 void UserInputMapper::deltaActionState(Action action, float delta, bool valid) {
+    Locker locker(_lock);
     _actionStates[toInt(action)] += delta;
     bool wasValid = _actionStatesValid[toInt(action)];
     _actionStatesValid[toInt(action)] = wasValid & valid;
 }
 
+float UserInputMapper::getActionState(Action action) const {
+    Locker locker(_lock);
+
+    int index = toInt(action);
+    if (index < _actionStates.size()) {
+        return _actionStates[index];
+    }
+
+    qCDebug(controllers) << "UserInputMapper::getActionState invalid action:" << index;
+    return 0.0f;
+}
+
+bool UserInputMapper::getActionStateValid(Action action) const {
+    Locker locker(_lock);
+
+    int index = toInt(action);
+    if (index < _actionStatesValid.size()) {
+        return _actionStatesValid[index];
+    }
+
+    qCDebug(controllers) << "UserInputMapper::getActionStateValid invalid action:" << index;
+    return false;
+}
+
 
 }
 
diff --git a/libraries/controllers/src/controllers/UserInputMapper.h b/libraries/controllers/src/controllers/UserInputMapper.h
index cd44f3226c..79fcf6e64c 100644
--- a/libraries/controllers/src/controllers/UserInputMapper.h
+++ b/libraries/controllers/src/controllers/UserInputMapper.h
@@ -81,8 +81,8 @@ namespace controller {
         QVector<Action> getAllActions() const;
         QString getActionName(Action action) const;
         QString getStandardPoseName(uint16_t pose);
-        float getActionState(Action action) const { return _actionStates[toInt(action)]; }
-        bool getActionStateValid(Action action) const { return _actionStatesValid[toInt(action)]; }
+        float getActionState(Action action) const;
+        bool getActionStateValid(Action action) const;
         Pose getPoseState(Action action) const;
         int findAction(const QString& actionName) const;
         QVector<QString> getActionNames() const;