Initial commit
diff --git a/includes/payment-methods/class-wc-stripe-upe-payment-method-link.php b/includes/payment-methods/class-wc-stripe-upe-payment-method-link.php
new file mode 100644
index 0000000..a088c46
--- /dev/null
+++ b/includes/payment-methods/class-wc-stripe-upe-payment-method-link.php
@@ -0,0 +1,88 @@
+<?php
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * Link Payment Method class extending UPE base class
+ */
+class WC_Stripe_UPE_Payment_Method_Link extends WC_Stripe_UPE_Payment_Method {
+
+	const STRIPE_ID = 'link';
+
+	/**
+	 * Constructor for Link payment method
+	 */
+	public function __construct() {
+		parent::__construct();
+		$this->stripe_id            = self::STRIPE_ID;
+		$this->title                = __( 'Pay with Link', 'woocommerce-gateway-stripe' );
+		$this->is_reusable          = true;
+		$this->supported_currencies = [ 'USD' ];
+		$this->label                = __( 'Stripe Link', 'woocommerce-gateway-stripe' );
+		$this->description          = __(
+			'Link is a payment method that allows customers to save payment information  and use the payment details
+			for further payments.',
+			'woocommerce-gateway-stripe'
+		);
+	}
+
+	/**
+	 * Return if Stripe Link is enabled
+	 *
+	 * @return bool
+	 */
+	public static function is_link_enabled() {
+
+		// Assume Link is disabled if UPE is disabled.
+		if ( ! WC_Stripe_Feature_Flags::is_upe_checkout_enabled() ) {
+			return false;
+		}
+
+		return in_array(
+			self::STRIPE_ID,
+			woocommerce_gateway_stripe()->get_main_stripe_gateway()->get_upe_enabled_payment_method_ids(),
+			true
+		);
+	}
+
+	/**
+	 * Returns string representing payment method type
+	 * to query to retrieve saved payment methods from Stripe.
+	 */
+	public function get_retrievable_type() {
+		return $this->get_id();
+	}
+
+	/**
+	 * Create new WC payment token and add to user.
+	 *
+	 * @param int $user_id        WP_User ID
+	 * @param object $payment_method Stripe payment method object
+	 *
+	 * @return WC_Payment_Token_Link
+	 */
+	public function create_payment_token_for_user( $user_id, $payment_method ) {
+		$token = new WC_Payment_Token_Link();
+		$token->set_email( $payment_method->link->email );
+		$token->set_gateway_id( WC_Stripe_UPE_Payment_Gateway::ID );
+		$token->set_token( $payment_method->id );
+		$token->set_payment_method_type( $this->get_id() );
+		$token->set_user_id( $user_id );
+		$token->save();
+		return $token;
+	}
+
+	/**
+	 * Returns true if the UPE method is available.
+	 *
+	 * @return bool
+	 */
+	public function is_available() {
+		//if merchant is outside US, Link payment method should not be available
+		$cached_account_data = WC_Stripe::get_instance()->account->get_cached_account_data();
+		$account_country     = $cached_account_data['country'] ?? null;
+
+		return 'US' === $account_country && parent::is_available();
+	}
+}