diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
index 9d4644e8..4b048cf 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/dbus/power_manager/backlight.pb.h"
+#include "chromeos/services/power/public/cpp/power_manager_mojo_client.h"
 #include "components/prefs/pref_service.h"
 
 namespace chromeos {
@@ -98,7 +99,7 @@
 
 void Adapter::Init() {
   // Deferred to Init() because it can result in a virtual method being called.
-  power_manager_client_observer_.Add(PowerManagerClient::Get());
+  power_manager_client_observer_.Add(PowerManagerMojoClient::Get());
 }
 
 void Adapter::OnAmbientLightUpdated(int lux) {
@@ -593,7 +594,7 @@
   request.set_transition(
       power_manager::SetBacklightBrightnessRequest_Transition_GRADUAL);
   request.set_cause(power_manager::SetBacklightBrightnessRequest_Cause_MODEL);
-  PowerManagerClient::Get()->SetScreenBrightness(request);
+  PowerManagerMojoClient::Get()->SetScreenBrightness(request);
 
   const base::TimeTicks brightness_change_time = tick_clock_->NowTicks();
   if (!latest_model_brightness_change_time_.is_null()) {
diff --git a/chromeos/services/power/public/cpp/power_manager_mojo_client.cc b/chromeos/services/power/public/cpp/power_manager_mojo_client.cc
index 05a75fe..cd88ec6 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_client.cc
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_client.cc
@@ -27,7 +27,8 @@
 
 void PowerManagerMojoClient::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
-  // TODO(estade): Call PowerManagerBecameAvailable as appropriate.
+  if (service_available_)
+    observer->PowerManagerBecameAvailable(*service_available_);
 }
 
 void PowerManagerMojoClient::RemoveObserver(Observer* observer) {
@@ -133,6 +134,12 @@
 
 void PowerManagerMojoClient::DeferScreenDim() {}
 
+void PowerManagerMojoClient::PowerManagerBecameAvailable(bool available) {
+  service_available_ = available;
+  for (auto& observer : observers_)
+    observer.PowerManagerBecameAvailable(available);
+}
+
 void PowerManagerMojoClient::ScreenBrightnessChanged(
     const power_manager::BacklightBrightnessChange& change) {
   for (auto& observer : observers_)
diff --git a/chromeos/services/power/public/cpp/power_manager_mojo_client.h b/chromeos/services/power/public/cpp/power_manager_mojo_client.h
index 637c7d4a..bfffe88 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_client.h
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_client.h
@@ -73,6 +73,7 @@
   void DeferScreenDim() override;
 
   // power::mojom::PowerManagerObserver:
+  void PowerManagerBecameAvailable(bool available) override;
   void ScreenBrightnessChanged(
       const power_manager::BacklightBrightnessChange& change) override;
   void KeyboardBrightnessChanged(
@@ -101,6 +102,8 @@
   // The last proto received via mojo; initially empty.
   base::Optional<power_manager::PowerSupplyProperties> proto_;
 
+  base::Optional<bool> service_available_;
+
   DISALLOW_COPY_AND_ASSIGN(PowerManagerMojoClient);
 };
 
diff --git a/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc b/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc
index 8cec9a9..9954591 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc
@@ -28,6 +28,11 @@
   PowerManagerClient::Get()->AddObserver(this);
 }
 
+void PowerManagerMojoController::SetScreenBrightness(
+    const power_manager::SetBacklightBrightnessRequest& request) {
+  PowerManagerClient::Get()->SetScreenBrightness(request);
+}
+
 void PowerManagerMojoController::GetScreenBrightnessPercent(
     GetScreenBrightnessPercentCallback callback) {
   // This extra thunk is only necessary to convert between
@@ -43,6 +48,10 @@
       std::move(callback)));
 }
 
+void PowerManagerMojoController::PowerManagerBecameAvailable(bool available) {
+  client_->PowerManagerBecameAvailable(available);
+}
+
 void PowerManagerMojoController::ScreenBrightnessChanged(
     const power_manager::BacklightBrightnessChange& change) {
   client_->ScreenBrightnessChanged(change);
diff --git a/chromeos/services/power/public/cpp/power_manager_mojo_controller.h b/chromeos/services/power/public/cpp/power_manager_mojo_controller.h
index a45d92f..5e54934 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_controller.h
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_controller.h
@@ -28,10 +28,13 @@
   // mojom::PowerManagerMojoController:
   void SetObserver(
       power::mojom::PowerManagerObserverAssociatedPtrInfo client) override;
+  void SetScreenBrightness(
+      const power_manager::SetBacklightBrightnessRequest& request) override;
   void GetScreenBrightnessPercent(
       GetScreenBrightnessPercentCallback callback) override;
 
   // PowerManagerClient::Observer:
+  void PowerManagerBecameAvailable(bool available) override;
   void ScreenBrightnessChanged(
       const power_manager::BacklightBrightnessChange& change) override;
   void KeyboardBrightnessChanged(
diff --git a/chromeos/services/power/public/mojom/OWNERS b/chromeos/services/power/public/mojom/OWNERS
index 2c44a46..b15e65d 100644
--- a/chromeos/services/power/public/mojom/OWNERS
+++ b/chromeos/services/power/public/mojom/OWNERS
@@ -1,6 +1,6 @@
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
-per-file *_struct_traits*.*=set noparent
-per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS
+per-file mojom_traits.*=set noparent
+per-file mojom_traits.*=file://ipc/SECURITY_OWNERS
 per-file *.typemap=set noparent
 per-file *.typemap=file://ipc/SECURITY_OWNERS
diff --git a/chromeos/services/power/public/mojom/mojom_traits.cc b/chromeos/services/power/public/mojom/mojom_traits.cc
index 7b1c1b8..7533904 100644
--- a/chromeos/services/power/public/mojom/mojom_traits.cc
+++ b/chromeos/services/power/public/mojom/mojom_traits.cc
@@ -6,96 +6,173 @@
 
 namespace mojo {
 
+using chromeos::power::mojom::BacklightBrightnessChangeCause;
+using chromeos::power::mojom::SetBacklightBrightnessRequestCause;
+using chromeos::power::mojom::SetBacklightBrightnessRequestTransition;
+
 // static
-chromeos::power::mojom::BacklightBrightnessChangeCause
-EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
+SetBacklightBrightnessRequestTransition
+EnumTraits<SetBacklightBrightnessRequestTransition,
+           power_manager::SetBacklightBrightnessRequest_Transition>::
+    ToMojom(
+        power_manager::SetBacklightBrightnessRequest_Transition transition) {
+  switch (transition) {
+    case power_manager::SetBacklightBrightnessRequest_Transition_GRADUAL:
+      return SetBacklightBrightnessRequestTransition::kGradual;
+    case power_manager::SetBacklightBrightnessRequest_Transition_INSTANT:
+      return SetBacklightBrightnessRequestTransition::kInstant;
+  }
+  NOTREACHED();
+  return SetBacklightBrightnessRequestTransition::kGradual;
+}
+
+// static
+bool EnumTraits<SetBacklightBrightnessRequestTransition,
+                power_manager::SetBacklightBrightnessRequest_Transition>::
+    FromMojom(SetBacklightBrightnessRequestTransition transition,
+              power_manager::SetBacklightBrightnessRequest_Transition* out) {
+  switch (transition) {
+    case SetBacklightBrightnessRequestTransition::kGradual:
+      *out = power_manager::SetBacklightBrightnessRequest_Transition_GRADUAL;
+      return true;
+    case SetBacklightBrightnessRequestTransition::kInstant:
+      *out = power_manager::SetBacklightBrightnessRequest_Transition_INSTANT;
+      return true;
+  }
+
+  NOTREACHED();
+  return false;
+}
+
+// static
+SetBacklightBrightnessRequestCause
+EnumTraits<SetBacklightBrightnessRequestCause,
+           power_manager::SetBacklightBrightnessRequest_Cause>::
+    ToMojom(power_manager::SetBacklightBrightnessRequest_Cause cause) {
+  switch (cause) {
+    case power_manager::SetBacklightBrightnessRequest_Cause_USER_REQUEST:
+      return SetBacklightBrightnessRequestCause::kUserRequest;
+    case power_manager::SetBacklightBrightnessRequest_Cause_MODEL:
+      return SetBacklightBrightnessRequestCause::kModel;
+  }
+  NOTREACHED();
+  return SetBacklightBrightnessRequestCause::kUserRequest;
+}
+
+// static
+bool EnumTraits<SetBacklightBrightnessRequestCause,
+                power_manager::SetBacklightBrightnessRequest_Cause>::
+    FromMojom(SetBacklightBrightnessRequestCause cause,
+              power_manager::SetBacklightBrightnessRequest_Cause* out) {
+  switch (cause) {
+    case SetBacklightBrightnessRequestCause::kUserRequest:
+      *out = power_manager::SetBacklightBrightnessRequest_Cause_USER_REQUEST;
+      return true;
+    case SetBacklightBrightnessRequestCause::kModel:
+      *out = power_manager::SetBacklightBrightnessRequest_Cause_MODEL;
+      return true;
+  }
+
+  NOTREACHED();
+  return false;
+}
+
+// static
+bool StructTraits<chromeos::power::mojom::SetBacklightBrightnessRequestDataView,
+                  power_manager::SetBacklightBrightnessRequest>::
+    Read(chromeos::power::mojom::SetBacklightBrightnessRequestDataView data,
+         power_manager::SetBacklightBrightnessRequest* out) {
+  if (data.percent() < 0. || data.percent() > 100.)
+    return false;
+
+  out->set_percent(data.percent());
+
+  power_manager::SetBacklightBrightnessRequest_Transition transition;
+  power_manager::SetBacklightBrightnessRequest_Cause cause;
+  if (!data.ReadTransition(&transition) || !data.ReadCause(&cause))
+    return false;
+
+  out->set_transition(transition);
+  out->set_cause(cause);
+  return true;
+}
+
+// static
+BacklightBrightnessChangeCause
+EnumTraits<BacklightBrightnessChangeCause,
            power_manager::BacklightBrightnessChange_Cause>::
     ToMojom(power_manager::BacklightBrightnessChange_Cause cause) {
   switch (cause) {
     case power_manager::BacklightBrightnessChange_Cause_USER_REQUEST:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kUserRequest;
+      return BacklightBrightnessChangeCause::kUserRequest;
     case power_manager::BacklightBrightnessChange_Cause_USER_ACTIVITY:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kUserActivity;
+      return BacklightBrightnessChangeCause::kUserActivity;
     case power_manager::BacklightBrightnessChange_Cause_USER_INACTIVITY:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kUserInactivity;
+      return BacklightBrightnessChangeCause::kUserInactivity;
     case power_manager::BacklightBrightnessChange_Cause_AMBIENT_LIGHT_CHANGED:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kAmbientLightChanged;
+      return BacklightBrightnessChangeCause::kAmbientLightChanged;
     case power_manager::
         BacklightBrightnessChange_Cause_EXTERNAL_POWER_CONNECTED:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kExternalPowerConnected;
+      return BacklightBrightnessChangeCause::kExternalPowerConnected;
     case power_manager::
         BacklightBrightnessChange_Cause_EXTERNAL_POWER_DISCONNECTED:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kExternalPowerDisconnected;
+      return BacklightBrightnessChangeCause::kExternalPowerDisconnected;
     case power_manager::BacklightBrightnessChange_Cause_FORCED_OFF:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::kForcedOff;
+      return BacklightBrightnessChangeCause::kForcedOff;
     case power_manager::BacklightBrightnessChange_Cause_NO_LONGER_FORCED_OFF:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kNoLongerForcedOff;
+      return BacklightBrightnessChangeCause::kNoLongerForcedOff;
     case power_manager::BacklightBrightnessChange_Cause_OTHER:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::kOther;
+      return BacklightBrightnessChangeCause::kOther;
     case power_manager::BacklightBrightnessChange_Cause_MODEL:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::kModel;
+      return BacklightBrightnessChangeCause::kModel;
     case power_manager::BacklightBrightnessChange_Cause_WAKE_NOTIFICATION:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kWakeNotification;
+      return BacklightBrightnessChangeCause::kWakeNotification;
   }
   NOTREACHED();
-  return chromeos::power::mojom::BacklightBrightnessChangeCause::kUserRequest;
+  return BacklightBrightnessChangeCause::kUserRequest;
 }
 
 // static
-bool EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
+bool EnumTraits<BacklightBrightnessChangeCause,
                 power_manager::BacklightBrightnessChange_Cause>::
-    FromMojom(chromeos::power::mojom::BacklightBrightnessChangeCause cause,
+    FromMojom(BacklightBrightnessChangeCause cause,
               power_manager::BacklightBrightnessChange_Cause* out) {
   switch (cause) {
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kUserRequest:
+    case BacklightBrightnessChangeCause::kUserRequest:
       *out = power_manager::BacklightBrightnessChange_Cause_USER_REQUEST;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kUserActivity:
+    case BacklightBrightnessChangeCause::kUserActivity:
       *out = power_manager::BacklightBrightnessChange_Cause_USER_ACTIVITY;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kUserInactivity:
+    case BacklightBrightnessChangeCause::kUserInactivity:
       *out = power_manager::BacklightBrightnessChange_Cause_USER_INACTIVITY;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kAmbientLightChanged:
+    case BacklightBrightnessChangeCause::kAmbientLightChanged:
       *out =
           power_manager::BacklightBrightnessChange_Cause_AMBIENT_LIGHT_CHANGED;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kExternalPowerConnected:
+    case BacklightBrightnessChangeCause::kExternalPowerConnected:
       *out = power_manager::
           BacklightBrightnessChange_Cause_EXTERNAL_POWER_CONNECTED;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kExternalPowerDisconnected:
+    case BacklightBrightnessChangeCause::kExternalPowerDisconnected:
       *out = power_manager::
           BacklightBrightnessChange_Cause_EXTERNAL_POWER_DISCONNECTED;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kForcedOff:
+    case BacklightBrightnessChangeCause::kForcedOff:
       *out = power_manager::BacklightBrightnessChange_Cause_FORCED_OFF;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kNoLongerForcedOff:
+    case BacklightBrightnessChangeCause::kNoLongerForcedOff:
       *out =
           power_manager::BacklightBrightnessChange_Cause_NO_LONGER_FORCED_OFF;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kOther:
+    case BacklightBrightnessChangeCause::kOther:
       *out = power_manager::BacklightBrightnessChange_Cause_OTHER;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kModel:
+    case BacklightBrightnessChangeCause::kModel:
       *out = power_manager::BacklightBrightnessChange_Cause_MODEL;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kWakeNotification:
+    case BacklightBrightnessChangeCause::kWakeNotification:
       *out = power_manager::BacklightBrightnessChange_Cause_WAKE_NOTIFICATION;
       return true;
   }
diff --git a/chromeos/services/power/public/mojom/mojom_traits.h b/chromeos/services/power/public/mojom/mojom_traits.h
index f41a567..3c0f3c5 100644
--- a/chromeos/services/power/public/mojom/mojom_traits.h
+++ b/chromeos/services/power/public/mojom/mojom_traits.h
@@ -13,6 +13,50 @@
 namespace mojo {
 
 template <>
+struct EnumTraits<
+    chromeos::power::mojom::SetBacklightBrightnessRequestTransition,
+    power_manager::SetBacklightBrightnessRequest_Transition> {
+  static chromeos::power::mojom::SetBacklightBrightnessRequestTransition
+  ToMojom(power_manager::SetBacklightBrightnessRequest_Transition cause);
+
+  static bool FromMojom(
+      chromeos::power::mojom::SetBacklightBrightnessRequestTransition cause,
+      power_manager::SetBacklightBrightnessRequest_Transition* out);
+};
+
+template <>
+struct EnumTraits<chromeos::power::mojom::SetBacklightBrightnessRequestCause,
+                  power_manager::SetBacklightBrightnessRequest_Cause> {
+  static chromeos::power::mojom::SetBacklightBrightnessRequestCause ToMojom(
+      power_manager::SetBacklightBrightnessRequest_Cause cause);
+
+  static bool FromMojom(
+      chromeos::power::mojom::SetBacklightBrightnessRequestCause cause,
+      power_manager::SetBacklightBrightnessRequest_Cause* out);
+};
+
+template <>
+struct StructTraits<
+    chromeos::power::mojom::SetBacklightBrightnessRequestDataView,
+    power_manager::SetBacklightBrightnessRequest> {
+  static double percent(
+      const power_manager::SetBacklightBrightnessRequest& request) {
+    return request.percent();
+  }
+  static power_manager::SetBacklightBrightnessRequest_Transition transition(
+      const power_manager::SetBacklightBrightnessRequest& request) {
+    return request.transition();
+  }
+  static power_manager::SetBacklightBrightnessRequest_Cause cause(
+      const power_manager::SetBacklightBrightnessRequest& request) {
+    return request.cause();
+  }
+  static bool Read(
+      chromeos::power::mojom::SetBacklightBrightnessRequestDataView data,
+      power_manager::SetBacklightBrightnessRequest* out);
+};
+
+template <>
 struct EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
                   power_manager::BacklightBrightnessChange_Cause> {
   static chromeos::power::mojom::BacklightBrightnessChangeCause ToMojom(
diff --git a/chromeos/services/power/public/mojom/power_manager.mojom b/chromeos/services/power/public/mojom/power_manager.mojom
index f084e2e80..6f6e18a 100644
--- a/chromeos/services/power/public/mojom/power_manager.mojom
+++ b/chromeos/services/power/public/mojom/power_manager.mojom
@@ -4,6 +4,23 @@
 
 module chromeos.power.mojom;
 
+enum SetBacklightBrightnessRequestTransition {
+  kGradual,
+  kInstant,
+};
+
+enum SetBacklightBrightnessRequestCause {
+  kUserRequest,
+  kModel,
+};
+
+struct SetBacklightBrightnessRequest {
+  // The brightness percent is in the range [0.0, 100.0].
+  double percent;
+  SetBacklightBrightnessRequestTransition transition;
+  SetBacklightBrightnessRequestCause cause;
+};
+
 // TODO(https://crbug.com/657632): This struct wrapper exists to allow the value
 // to be null.
 struct Brightness {
@@ -42,6 +59,7 @@
 
   // All following methods and their semantics are copied from the
   // PowerManagerClient interface. Refer to that for documentation.
+  SetScreenBrightness(SetBacklightBrightnessRequest request);
   GetScreenBrightnessPercent() => (Brightness? brightness);
 };
 
@@ -50,6 +68,7 @@
 interface PowerManagerObserver {
   // All following methods and their semantics are copied from the
   // PowerManagerClient::Observer interface. Refer to that for documentation.
+  PowerManagerBecameAvailable(bool available);
   ScreenBrightnessChanged(BacklightBrightnessChange change);
   KeyboardBrightnessChanged(BacklightBrightnessChange change);
 };
diff --git a/chromeos/services/power/public/mojom/power_types.typemap b/chromeos/services/power/public/mojom/power_types.typemap
index 9f81e2d..bc7ae7bc9 100644
--- a/chromeos/services/power/public/mojom/power_types.typemap
+++ b/chromeos/services/power/public/mojom/power_types.typemap
@@ -15,4 +15,7 @@
 type_mappings = [
   "chromeos.power.mojom.BacklightBrightnessChange=power_manager::BacklightBrightnessChange",
   "chromeos.power.mojom.BacklightBrightnessChangeCause=power_manager::BacklightBrightnessChange_Cause",
+  "chromeos.power.mojom.SetBacklightBrightnessRequest=power_manager::SetBacklightBrightnessRequest",
+  "chromeos.power.mojom.SetBacklightBrightnessRequestCause=power_manager::SetBacklightBrightnessRequest_Cause",
+  "chromeos.power.mojom.SetBacklightBrightnessRequestTransition=power_manager::SetBacklightBrightnessRequest_Transition",
 ]
