diff --git a/substrate/frame/staking-rewards/src/lib.rs b/substrate/frame/staking-rewards/src/lib.rs
index ff4432b697d86f5015f761eaf2cdea399a446027..091de5a3f6351049b2ae13e12a38fd0773efdbf8 100644
--- a/substrate/frame/staking-rewards/src/lib.rs
+++ b/substrate/frame/staking-rewards/src/lib.rs
@@ -68,6 +68,9 @@ use sp_core::Get;
 use sp_runtime::DispatchError;
 use sp_std::boxed::Box;
 
+/// The type of the unique id for each pool.
+pub type PoolId = u32;
+
 /// A pool staker.
 #[derive(Decode, Encode, MaxEncodedLen, TypeInfo)]
 pub struct PoolStakerInfo<Balance> {
@@ -78,7 +81,7 @@ pub struct PoolStakerInfo<Balance> {
 
 /// A staking pool.
 #[derive(Decode, Encode, Default, PartialEq, Eq, MaxEncodedLen, TypeInfo)]
-pub struct PoolInfo<AssetId, Balance, BlockNumber> {
+pub struct PoolInfo<AccountId, AssetId, Balance, BlockNumber> {
 	/// The asset that is staked in this pool.
 	staking_asset_id: AssetId,
 	/// The asset that is distributed as rewards in this pool.
@@ -91,16 +94,14 @@ pub struct PoolInfo<AssetId, Balance, BlockNumber> {
 	accumulated_rewards_per_share: Balance,
 	/// Last block number the pool was updated. Used when calculating payouts.
 	last_rewarded_block: BlockNumber,
+	/// Permissioned account that can manage this pool.
+	admin: AccountId,
 }
 
 #[frame_support::pallet(dev_mode)]
 pub mod pallet {
 	use super::*;
-	use codec::FullCodec;
-	use frame_support::{
-		pallet_prelude::*,
-		traits::{tokens::AssetId, Incrementable},
-	};
+	use frame_support::{pallet_prelude::*, traits::tokens::AssetId};
 	use frame_system::pallet_prelude::*;
 	use sp_runtime::traits::AccountIdConversion;
 
@@ -122,25 +123,15 @@ pub mod pallet {
 		/// The type in which the assets are measured.
 		type Balance: Balance + TypeInfo;
 
-		/// The origin with permission to create and manage pools.
-		type PoolAdminOrigin: EnsureOrigin<Self::RuntimeOrigin>;
+		/// The origin with permission to create pools. This will be removed in a later release of
+		/// this pallet, which will allow permissionless pool creation.
+		type PermissionedPoolCreator: EnsureOrigin<Self::RuntimeOrigin>;
 
 		/// Registry of assets that can be configured to either stake for rewards, or be offered as
 		/// rewards for staking.
 		type Assets: Inspect<Self::AccountId, AssetId = Self::AssetId, Balance = Self::Balance>
 			+ Mutate<Self::AccountId>
 			+ Balanced<Self::AccountId>;
-
-		/// The type of the unique id for each pool.
-		type PoolId: PartialOrd
-			+ Incrementable
-			+ From<u32>
-			+ FullCodec
-			+ Clone
-			+ Eq
-			+ PartialEq
-			+ sp_std::fmt::Debug
-			+ scale_info::TypeInfo;
 	}
 
 	/// State of pool stakers.
@@ -148,7 +139,7 @@ pub mod pallet {
 	pub type PoolStakers<T: Config> = StorageDoubleMap<
 		_,
 		Blake2_128Concat,
-		T::PoolId,
+		PoolId,
 		Blake2_128Concat,
 		T::AccountId,
 		PoolStakerInfo<T::Balance>,
@@ -159,15 +150,15 @@ pub mod pallet {
 	pub type Pools<T: Config> = StorageMap<
 		_,
 		Blake2_128Concat,
-		T::PoolId,
-		PoolInfo<T::AssetId, T::Balance, BlockNumberFor<T>>,
+		PoolId,
+		PoolInfo<T::AccountId, T::AssetId, T::Balance, BlockNumberFor<T>>,
 	>;
 
 	/// Stores the [`PoolId`] to use for the next pool.
 	///
 	/// Incremented when a new pool is created.
 	#[pallet::storage]
-	pub type NextPoolId<T: Config> = StorageValue<_, T::PoolId>;
+	pub type NextPoolId<T: Config> = StorageValue<_, PoolId>;
 
 	#[pallet::event]
 	#[pallet::generate_deposit(pub(super) fn deposit_event)]
@@ -177,7 +168,7 @@ pub mod pallet {
 			/// The account that staked assets.
 			staker: T::AccountId,
 			/// The pool.
-			pool_id: T::PoolId,
+			pool_id: PoolId,
 			/// The staked asset amount.
 			amount: T::Balance,
 		},
@@ -186,7 +177,7 @@ pub mod pallet {
 			/// The account that unstaked assets.
 			staker: T::AccountId,
 			/// The pool.
-			pool_id: T::PoolId,
+			pool_id: PoolId,
 			/// The unstaked asset amount.
 			amount: T::Balance,
 		},
@@ -195,14 +186,14 @@ pub mod pallet {
 			/// The staker whos rewards were harvested.
 			staker: T::AccountId,
 			/// The pool.
-			pool_id: T::PoolId,
+			pool_id: PoolId,
 			/// The amount of harvested tokens.
 			amount: T::Balance,
 		},
 		/// A new reward pool was created.
 		PoolCreated {
 			/// Unique ID for the new pool.
-			pool_id: T::PoolId,
+			pool_id: PoolId,
 			/// The staking asset.
 			staking_asset_id: T::AssetId,
 			/// The reward asset.
@@ -213,19 +204,19 @@ pub mod pallet {
 		/// A reward pool was deleted.
 		PoolDeleted {
 			/// The deleted pool id.
-			pool_id: T::PoolId,
+			pool_id: PoolId,
 		},
 		/// A pool was modified.
 		PoolModifed {
 			/// The modified pool.
-			pool_id: T::PoolId,
+			pool_id: PoolId,
 			/// The new reward rate.
 			new_reward_rate_per_block: T::Balance,
 		},
 		/// Reward assets were withdrawn from a pool.
 		RewardPoolWithdrawal {
 			/// The affected pool.
-			pool_id: T::PoolId,
+			pool_id: PoolId,
 			/// The acount of reward asset withdrawn.
 			amount: T::Balance,
 		},
@@ -245,6 +236,9 @@ pub mod pallet {
 	}
 
 	/// Pallet's callable functions.
+	///
+	/// Allows optionally specifying an admin account for the pool. By default, the origin is made
+	/// admin.
 	#[pallet::call]
 	impl<T: Config> Pallet<T> {
 		/// Create a new reward pool.
@@ -252,6 +246,7 @@ pub mod pallet {
 			_origin: OriginFor<T>,
 			_staked_asset_id: Box<T::AssetId>,
 			_reward_asset_id: Box<T::AssetId>,
+			_admin: Option<T::AccountId>,
 		) -> DispatchResult {
 			todo!()
 		}
@@ -259,14 +254,14 @@ pub mod pallet {
 		/// Removes an existing reward pool.
 		///
 		/// TODO decide how to manage clean up of stakers from a removed pool.
-		pub fn remove_pool(_origin: OriginFor<T>, _pool_id: T::PoolId) -> DispatchResult {
+		pub fn remove_pool(_origin: OriginFor<T>, _pool_id: PoolId) -> DispatchResult {
 			todo!()
 		}
 
 		/// Stake tokens in a pool.
 		pub fn stake(
 			_origin: OriginFor<T>,
-			_pool_id: T::PoolId,
+			_pool_id: PoolId,
 			_amount: T::Balance,
 		) -> DispatchResult {
 			todo!()
@@ -275,7 +270,7 @@ pub mod pallet {
 		/// Unstake tokens from a pool.
 		pub fn unstake(
 			_origin: OriginFor<T>,
-			_pool_id: T::PoolId,
+			_pool_id: PoolId,
 			_amount: T::Balance,
 		) -> DispatchResult {
 			todo!()
@@ -285,7 +280,7 @@ pub mod pallet {
 		pub fn harvest_rewards(
 			_origin: OriginFor<T>,
 			_staker: T::AccountId,
-			_pool_id: T::PoolId,
+			_pool_id: PoolId,
 		) -> DispatchResult {
 			todo!()
 		}
@@ -293,7 +288,7 @@ pub mod pallet {
 		/// Modify the reward rate of a pool.
 		pub fn modify_pool(
 			_origin: OriginFor<T>,
-			_pool_id: T::PoolId,
+			_pool_id: PoolId,
 			_new_reward_rate: T::Balance,
 		) -> DispatchResult {
 			todo!()
@@ -306,7 +301,7 @@ pub mod pallet {
 		/// account id is not required.
 		pub fn deposit_reward_tokens(
 			_origin: OriginFor<T>,
-			_pool_id: T::PoolId,
+			_pool_id: PoolId,
 			_amount: T::Balance,
 		) -> DispatchResult {
 			todo!()
@@ -315,7 +310,7 @@ pub mod pallet {
 
 	impl<T: Config> Pallet<T> {
 		/// Derive a pool account ID from the pallet's ID.
-		fn pool_account_id(id: &T::PoolId) -> Result<T::AccountId, DispatchError> {
+		fn pool_account_id(id: &PoolId) -> Result<T::AccountId, DispatchError> {
 			if Pools::<T>::contains_key(id) {
 				Ok(T::PalletId::get().into_sub_account_truncating(id))
 			} else {