diff --git a/policy_manager/policy_manager-inl.h b/policy_manager/policy_manager-inl.h
index 7ff6fa6..81cc808 100644
--- a/policy_manager/policy_manager-inl.h
+++ b/policy_manager/policy_manager-inl.h
@@ -17,11 +17,9 @@
 template<typename R, typename... Args>
 EvalStatus PolicyManager::EvaluatePolicy(
     EvaluationContext* ec,
-    EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
-                                        State* state,
-                                        std::string* error,
-                                        R* result,
-                                        Args... args) const,
+    EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
+                                        std::string*, R*,
+                                        Args...) const,
     R* result, Args... args) {
   std::string error;
 
@@ -47,11 +45,9 @@
 void PolicyManager::OnPolicyReadyToEvaluate(
     scoped_refptr<EvaluationContext> ec,
     base::Callback<void(EvalStatus status, const R& result)> callback,
-    EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
-                                        State* state,
-                                        std::string* error,
-                                        R* result,
-                                        Args... args) const,
+    EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
+                                        std::string*, R*,
+                                        Args...) const,
     Args... args) {
   ec->ResetEvaluation();
   R result;
@@ -78,32 +74,34 @@
   }
 }
 
-template<typename R, typename... Args>
+template<typename R, typename... ActualArgs, typename... ExpectedArgs>
 EvalStatus PolicyManager::PolicyRequest(
-    EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
-                                        State* state,
-                                        std::string* error,
-                                        R* result,
-                                        Args... args) const,
-    R* result, Args... args) {
+    EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
+                                        std::string*, R*,
+                                        ExpectedArgs...) const,
+    R* result, ActualArgs... args) {
   scoped_refptr<EvaluationContext> ec(new EvaluationContext(clock_));
   // A PolicyRequest allways consists on a single evaluation on a new
   // EvaluationContext.
-  return EvaluatePolicy(ec, policy_method, result, args...);
+  // IMPORTANT: To ensure that ActualArgs can be converted to ExpectedArgs, we
+  // explicitly instantiate EvaluatePolicy with the latter in lieu of the
+  // former.
+  return EvaluatePolicy<R, ExpectedArgs...>(ec, policy_method, result, args...);
 }
 
-template<typename R, typename... Args>
+template<typename R, typename... ActualArgs, typename... ExpectedArgs>
 void PolicyManager::AsyncPolicyRequest(
     base::Callback<void(EvalStatus, const R& result)> callback,
-    EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
-                                        State* state,
-                                        std::string* error,
-                                        R* result,
-                                        Args... args) const,
-    Args... args) {
+    EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
+                                        std::string*, R*,
+                                        ExpectedArgs...) const,
+    ActualArgs... args) {
   scoped_refptr<EvaluationContext> ec = new EvaluationContext(clock_);
+  // IMPORTANT: To ensure that ActualArgs can be converted to ExpectedArgs, we
+  // explicitly instantiate PolicyManager::OnPolicyReadyToEvaluate with the
+  // latter in lieu of the former.
   base::Closure closure = base::Bind(
-      &PolicyManager::OnPolicyReadyToEvaluate<R, Args...>,
+      &PolicyManager::OnPolicyReadyToEvaluate<R, ExpectedArgs...>,
       base::Unretained(this), ec, callback, policy_method, args...);
   RunFromMainLoop(closure);
 }
diff --git a/policy_manager/policy_manager.h b/policy_manager/policy_manager.h
index 99ca26b..586854f 100644
--- a/policy_manager/policy_manager.h
+++ b/policy_manager/policy_manager.h
@@ -42,14 +42,12 @@
   //
   // An example call to this method is:
   //   pm.PolicyRequest(&Policy::SomePolicyMethod, &bool_result, arg1, arg2);
-  template<typename R, typename... Args>
+  template<typename R, typename... ActualArgs, typename... ExpectedArgs>
   EvalStatus PolicyRequest(
-      EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
-                                          State* state,
-                                          std::string* error,
-                                          R* result,
-                                          Args... args) const,
-      R* result, Args... args);
+      EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
+                                          std::string*, R*,
+                                          ExpectedArgs...) const,
+      R* result, ActualArgs...);
 
   // Evaluates the given |policy_method| policy with the provided |args|
   // arguments and calls the |callback| callback with the result when done.
@@ -59,15 +57,13 @@
   // policy until another status is returned. If the policy implementation based
   // its return value solely on const variables, the callback will be called
   // with the EvalStatus::kAskMeAgainLater status.
-  template<typename R, typename... Args>
+  template<typename R, typename... ActualArgs, typename... ExpectedArgs>
   void AsyncPolicyRequest(
       base::Callback<void(EvalStatus, const R& result)> callback,
-      EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
-                                          State* state,
-                                          std::string* error,
-                                          R* result,
-                                          Args... args) const,
-      Args... args);
+      EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
+                                          std::string*, R*,
+                                          ExpectedArgs...) const,
+      ActualArgs... args);
 
  protected:
   // The PolicyManager receives ownership of the passed Policy instance.
@@ -90,11 +86,9 @@
   template<typename R, typename... Args>
   EvalStatus EvaluatePolicy(
       EvaluationContext* ec,
-      EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
-                                          State* state,
-                                          std::string* error,
-                                          R* result,
-                                          Args... args) const,
+      EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
+                                          std::string*, R*,
+                                          Args...) const,
       R* result, Args... args);
 
   // OnPolicyReadyToEvaluate() is called by the main loop when the evaluation
@@ -107,11 +101,9 @@
   void OnPolicyReadyToEvaluate(
       scoped_refptr<EvaluationContext> ec,
       base::Callback<void(EvalStatus status, const R& result)> callback,
-      EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
-                                          State* state,
-                                          std::string* error,
-                                          R* result,
-                                          Args... args) const,
+      EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
+                                          std::string*, R*,
+                                          Args...) const,
       Args... args);
 
   // The policy used by the PolicyManager. Note that since it is a const Policy,
