diff --git a/oracle/src/lib.rs b/oracle/src/lib.rs
index 4298306e81a5da516110b3013031a79050d7bb0c..8871cf1596f46b84bcf20c4189f49a8fd505d38b 100644
--- a/oracle/src/lib.rs
+++ b/oracle/src/lib.rs
@@ -8,6 +8,7 @@ mod tests;
 mod timestamped_value;
 
 use codec::Encode;
+pub use default_combine_data::DefaultCombineData;
 use frame_support::{
 	decl_error, decl_event, decl_module, decl_storage, ensure,
 	traits::{ChangeMembers, Get, InitializeMembers, Time},
@@ -25,8 +26,7 @@ use sp_std::{convert::TryInto, prelude::*, vec};
 // FIXME: `pallet/frame-` prefix should be used for all pallet modules, but currently `frame_system`
 // would cause compiling error in `decl_module!` and `construct_runtime!`
 // #3295 https://github.com/paritytech/substrate/issues/3295
-pub use default_combine_data::DefaultCombineData;
-use frame_system::{self as system, ensure_none, ensure_signed};
+use frame_system::{self as system, ensure_none, ensure_root, ensure_signed};
 pub use orml_traits::{CombineData, DataProvider, DataProviderExtended, OnNewData, OnRedundantCall};
 use orml_utilities::OrderedSet;
 pub use timestamped_value::TimestampedValue;
@@ -124,7 +124,7 @@ decl_module! {
 			// we can skip doing it here again.
 			_signature: <T::AuthorityId as RuntimeAppPublic>::Signature,
 		) {
-			ensure_none(origin)?;
+			ensure_none(origin.clone()).or_else(|_| ensure_root(origin))?;
 			let who = Self::members().0[index as usize].clone();
 			Self::_feed_values(who, values)?;
 		}
diff --git a/oracle/src/tests.rs b/oracle/src/tests.rs
index 4546a5faa0612a3c9240843472ee84dd61a6712c..f96a9b0a2af21761a2477d68f32d94c96b7397be 100644
--- a/oracle/src/tests.rs
+++ b/oracle/src/tests.rs
@@ -11,7 +11,7 @@ use frame_support::{
 	unsigned::ValidateUnsigned,
 };
 use sp_runtime::{
-	testing::UintAuthorityId,
+	testing::{TestSignature, UintAuthorityId},
 	transaction_validity::{InvalidTransaction, TransactionSource, TransactionValidityError},
 	RuntimeAppPublic,
 };
@@ -76,6 +76,44 @@ fn should_feed_values() {
 	});
 }
 
+#[test]
+fn should_feed_values_from_root() {
+	new_test_ext().execute_with(|| {
+		let account_id: AccountId = 1;
+
+		assert_ok!(ModuleOracle::feed_values(
+			Origin::ROOT,
+			vec![(50, 1000), (51, 900), (52, 800)],
+			0,
+			TestSignature(0, vec![])
+		));
+
+		assert_eq!(
+			ModuleOracle::raw_values(&account_id, &50),
+			Some(TimestampedValue {
+				value: 1000,
+				timestamp: 12345,
+			})
+		);
+
+		assert_eq!(
+			ModuleOracle::raw_values(&account_id, &51),
+			Some(TimestampedValue {
+				value: 900,
+				timestamp: 12345,
+			})
+		);
+
+		assert_eq!(
+			ModuleOracle::raw_values(&account_id, &52),
+			Some(TimestampedValue {
+				value: 800,
+				timestamp: 12345,
+			})
+		);
+	});
+}
+
 #[test]
 fn should_update_is_updated() {
 	new_test_ext().execute_with(|| {