adding order redirect entity and action proto samples
diff --git a/.gitignore b/.gitignore
index 0f245e8..edb9f61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,9 @@
 target
 bazel-*
 generated
+target
+dist
+vendor
+build
+go.mod
+go.sum
\ No newline at end of file
diff --git a/order-redirect/go/action/action.go b/order-redirect/go/action/action.go
new file mode 100644
index 0000000..e60cefd
--- /dev/null
+++ b/order-redirect/go/action/action.go
@@ -0,0 +1,76 @@
+/**
+Example Action feed for Google Order Redirect.
+**/
+
+package main
+
+import (
+	pb "feed/app/generated/google/madden/ingestion"
+	"fmt"
+
+	"google.golang.org/protobuf/encoding/protojson"
+)
+
+func main() {
+	feedJSON := createFeed()
+	fmt.Println(feedJSON)
+}
+
+func createFeed() string {
+	// Create ActionDetail
+	// Example using one link for both delivery and takeout
+	merchantNameCombined := "merchant-1"
+	linkIDCombined := "merchant-1-takeout-delivery-action"
+	urlCombined := "http://provider.com/merchant-1"
+	actionCombined := &pb.ActionDetail{
+		EntityId: &merchantNameCombined,
+		LinkId:   &linkIDCombined,
+		Url:      &urlCombined,
+		Actions: []*pb.Action{{
+			ActionInfo: &pb.Action_FoodOrderingInfo{
+				FoodOrderingInfo: &pb.FoodOrderingInfo{
+					ServiceType: pb.FoodOrderingInfo_DELIVERY,
+				},
+			}}, {
+			ActionInfo: &pb.Action_FoodOrderingInfo{
+				FoodOrderingInfo: &pb.FoodOrderingInfo{
+					ServiceType: pb.FoodOrderingInfo_TAKEOUT,
+				},
+			}},
+		},
+	}
+
+	// Example using a separate link for delivery
+	merchantNameDelivery := "merchant-2"
+	linkIDDelivery := "merchant-2-delivery-action"
+	urlDelivery := "http://provider.com/merchant-2/delivery"
+	actionDelivery := &pb.ActionDetail{
+		EntityId: &merchantNameDelivery,
+		LinkId:   &linkIDDelivery,
+		Url:      &urlDelivery,
+		Actions: []*pb.Action{{
+			ActionInfo: &pb.Action_FoodOrderingInfo{
+				FoodOrderingInfo: &pb.FoodOrderingInfo{
+					ServiceType: pb.FoodOrderingInfo_DELIVERY,
+				},
+			}},
+		},
+	}
+
+	// Create ActionFeed
+	feed := &pb.ActionFeed{
+		Data: []*pb.ActionDetail{
+			actionCombined,
+			actionDelivery,
+		},
+	}
+
+	// Serialize to JSON string
+	marshalOptions := protojson.MarshalOptions{
+		UseProtoNames: true,
+	}
+	jsonBytes, _ := marshalOptions.Marshal(feed)
+	return string(jsonBytes)
+}
+
+// [END create_feed]
diff --git a/order-redirect/go/entity/entity.go b/order-redirect/go/entity/entity.go
new file mode 100644
index 0000000..035394b
--- /dev/null
+++ b/order-redirect/go/entity/entity.go
@@ -0,0 +1,55 @@
+/**
+Example Entity feed for Google Order Redirect.
+**/
+
+package main
+
+import (
+	pb "feed/app/generated/google/madden/ingestion"
+	"fmt"
+
+	"google.golang.org/protobuf/encoding/protojson"
+)
+
+func main() {
+	feedJSON := createFeed()
+	fmt.Println(feedJSON)
+}
+
+func createFeed() string {
+
+	// Create Entity
+	entity := &pb.Entity{
+		EntityId:  "merchant-id",
+		Name:      "Mo's Dinner",
+		Telephone: "+14567891234",
+		Url:       "http://moesdinner.com",
+		Location: &pb.GeoCoordinates{
+			Latitude:  41.525588,
+			Longitude: -90.507067,
+			Addresses: &pb.GeoCoordinates_Address{
+				Address: &pb.PostalAddress{
+					Country:       "US",
+					Locality:      "Mountain View",
+					Region:        "CA",
+					PostalCode:    "94043",
+					StreetAddress: "1600 Amphitheatre Pkwy",
+				},
+			},
+		},
+	}
+
+	// Create EntityFeed
+	feed := &pb.EntityFeed{
+		Data: []*pb.Entity{
+			entity,
+		},
+	}
+
+	// Serialize to JSON string
+	marshalOptions := protojson.MarshalOptions{
+		UseProtoNames: true,
+	}
+	jsonBytes, _ := marshalOptions.Marshal(feed)
+	return string(jsonBytes)
+}
diff --git a/order-redirect/java/pom.xml b/order-redirect/java/pom.xml
new file mode 100644
index 0000000..fdca852
--- /dev/null
+++ b/order-redirect/java/pom.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.example.order_redirect</groupId>
+    <artifactId>feed</artifactId>
+    <version>1.0.0</version>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>11.0</java.version>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <protobuf.version>3.22.0</protobuf.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+            <version>4.12</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>${protobuf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>${protobuf.version}</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>3.2.2</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
+                        <phase>package</phase> <!-- bind to the packaging phase -->
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/order-redirect/java/src/main/java/com/example/order_redirect/ActionFeedExample.java b/order-redirect/java/src/main/java/com/example/order_redirect/ActionFeedExample.java
new file mode 100644
index 0000000..ee1e697
--- /dev/null
+++ b/order-redirect/java/src/main/java/com/example/order_redirect/ActionFeedExample.java
@@ -0,0 +1,74 @@
+/**
+Example Action feed for Google Order Redirect.
+**/
+
+package com.example.order_redirect;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.util.JsonFormat;
+import com.google.madden.ingestion.ActionFeed;
+import com.google.madden.ingestion.Action;
+import com.google.madden.ingestion.ActionDetail;
+import com.google.madden.ingestion.FoodOrderingInfo;
+
+
+public class ActionFeedExample {
+
+  public static void main(String[] args) throws InvalidProtocolBufferException {
+    ActionFeedExample feed = new ActionFeedExample();
+    String feedJSON = feed.createActionFeed();
+    System.out.println(feedJSON);
+  }
+
+  public String createActionFeed() throws InvalidProtocolBufferException {
+  
+    // Create ActionFeed
+    ActionFeed.Builder actionFeed = ActionFeed.newBuilder();
+
+    // Create ActionDetail using one link for both takeout and delivery
+    ActionDetail actionDetailDeliveryTakeout = ActionDetail.newBuilder()
+      .setEntityId("merchant-1")
+      .setLinkId("merchant-1-takeout-delivery-action")
+      .setUrl("http://provider.com/merchant-1")
+      .addActions(
+        Action.newBuilder().setFoodOrderingInfo(
+          FoodOrderingInfo.newBuilder().setServiceType(
+              FoodOrderingInfo.ServiceType.DELIVERY
+          )
+        )
+      )
+      .addActions(
+        Action.newBuilder().setFoodOrderingInfo(
+          FoodOrderingInfo.newBuilder().setServiceType(
+              FoodOrderingInfo.ServiceType.TAKEOUT
+          )
+        )
+      ).build();
+
+    // Add to feed data
+    actionFeed.addData(actionDetailDeliveryTakeout);
+
+    // Create ActionDetail using a separate link for delivery
+    ActionDetail actionDetailDelivery = ActionDetail.newBuilder()
+      .setEntityId("merchant-2")
+      .setLinkId("merchant-2-delivery-action")
+      .setUrl("http://provider.com/merchant-2/delivery")
+      .addActions(
+        Action.newBuilder().setFoodOrderingInfo(
+            FoodOrderingInfo.newBuilder().setServiceType(
+                FoodOrderingInfo.ServiceType.DELIVERY
+            )
+        )
+      ).build();
+
+    // Add to feed data
+    actionFeed.addData(actionDetailDelivery);
+
+    // Serialize feed to JSON string
+    return JsonFormat.printer()
+        .omittingInsignificantWhitespace()
+        .preservingProtoFieldNames()
+        .print(actionFeed);
+  }
+
+}
\ No newline at end of file
diff --git a/order-redirect/java/src/main/java/com/example/order_redirect/EntityFeedExample.java b/order-redirect/java/src/main/java/com/example/order_redirect/EntityFeedExample.java
new file mode 100644
index 0000000..085b4b3
--- /dev/null
+++ b/order-redirect/java/src/main/java/com/example/order_redirect/EntityFeedExample.java
@@ -0,0 +1,56 @@
+/**
+Example Entity feed for Google Order Redirect.
+**/
+
+package com.example.order_redirect;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.util.JsonFormat;
+import com.google.madden.ingestion.EntityFeed;
+import com.google.madden.ingestion.Entity;
+import com.google.madden.ingestion.PostalAddress;
+import com.google.madden.ingestion.GeoCoordinates;
+
+public class EntityFeedExample {
+
+  public static void main(String[] args) throws InvalidProtocolBufferException {
+    EntityFeedExample feed = new EntityFeedExample();
+    String feedJSON = feed.createEntityFeed();
+    System.out.println(feedJSON);
+  }
+
+  public String createEntityFeed() throws InvalidProtocolBufferException {
+  
+    // Create Entity
+    Entity entity = Entity.newBuilder()
+      .setEntityId("merchant-1")
+      .setName("Mo's Dinner")
+      .setTelephone("+14567891234")
+      .setUrl("http://moesdinner.com")
+      .setLocation(
+        GeoCoordinates.newBuilder()
+          .setLatitude(41.525588)
+          .setLongitude(-90.507067)
+          .setAddress(
+              PostalAddress.newBuilder()
+                .setCountry("US")
+                .setLocality("Mountain View")
+                .setRegion("CA")
+                .setPostalCode("94043")
+                .setStreetAddress("1600 Amphitheatre Pkwy")
+                .build()
+          )
+      ).build();
+
+
+    // Add to feed data
+    EntityFeed entityFeed = EntityFeed.newBuilder().addData(entity).build();
+
+    // Serialize feed to JSON string
+    return JsonFormat.printer()
+            .omittingInsignificantWhitespace()
+            .preservingProtoFieldNames()
+            .print(entityFeed);
+  }
+  
+}
\ No newline at end of file
diff --git a/order-redirect/java/src/test/java/com/example/order_redirect/ActionFeedExampleTest.java b/order-redirect/java/src/test/java/com/example/order_redirect/ActionFeedExampleTest.java
new file mode 100644
index 0000000..cbe0574
--- /dev/null
+++ b/order-redirect/java/src/test/java/com/example/order_redirect/ActionFeedExampleTest.java
@@ -0,0 +1,21 @@
+/**
+Example Action feed for Google Order Redirect.
+**/
+
+package com.example.order_redirect;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+
+import com.example.order_redirect.ActionFeedExample;
+import com.google.protobuf.InvalidProtocolBufferException;
+
+public class ActionFeedExampleTest {
+
+  @Test
+  public void testCreateActionFeed() throws InvalidProtocolBufferException {
+    ActionFeedExample actionFeedExample = new ActionFeedExample();
+    assertEquals(actionFeedExample.createActionFeed(),"{\"data\":[{\"actions\":[{\"food_ordering_info\":{\"service_type\":\"DELIVERY\"}},{\"food_ordering_info\":{\"service_type\":\"TAKEOUT\"}}],\"entity_id\":\"merchant-1\",\"link_id\":\"merchant-1-takeout-delivery-action\",\"url\":\"http://provider.com/merchant-1\"},{\"actions\":[{\"food_ordering_info\":{\"service_type\":\"DELIVERY\"}}],\"entity_id\":\"merchant-2\",\"link_id\":\"merchant-2-delivery-action\",\"url\":\"http://provider.com/merchant-2/delivery\"}]}");
+  }
+  
+}
\ No newline at end of file
diff --git a/order-redirect/php/ActionFeedExample.php b/order-redirect/php/ActionFeedExample.php
new file mode 100644
index 0000000..83558d2
--- /dev/null
+++ b/order-redirect/php/ActionFeedExample.php
@@ -0,0 +1,59 @@
+<?php
+/*
+Example Action feed for Google Order Redirect.
+*/
+
+require dirname(__FILE__).'/vendor/autoload.php';
+
+use Madden\Ingestion\ActionFeed;
+use Madden\Ingestion\ActionDetail;
+use Madden\Ingestion\Action;
+use Madden\Ingestion\FoodOrderingInfo;
+use Madden\Ingestion\FoodOrderingInfo\ServiceType;
+
+function createFeed() {
+    // Create ActionDetail by passing the fields to the constructor
+    $actions = array(
+        // Example using one link for both takeout and delivery
+        new ActionDetail([
+            'entity_id' => 'merchant-1',
+            'link_id' => 'merchant-1-takeout-delivery-action',
+            'actions' =>  array(
+                new Action([
+                    'food_ordering_info' => new FoodOrderingInfo([
+                        'service_type' => ServiceType::DELIVERY
+                    ])
+                ]),
+                new Action([
+                    'food_ordering_info' => new FoodOrderingInfo([
+                        'service_type' => ServiceType::TAKEOUT
+                    ])
+                ])
+            ),
+            'url' => 'http://provider.com/merchant-1'
+        ]),
+        // Example using a separate link for delivery
+        new ActionDetail([
+            'entity_id' => 'merchant-2',
+            'link_id' => 'merchant-2-delivery-action',
+            'actions' =>  array(
+                new Action([
+                    'food_ordering_info' => new FoodOrderingInfo([
+                        'service_type' => ServiceType::DELIVERY
+                    ])
+                ])
+            ),
+            'url' => 'http://provider.com/merchant-2/delivery'
+        ])
+    );
+
+    // Add ActionDetail array to feed data
+    $feed = new ActionFeed();
+    $feed->setData($actions);
+
+    // Serialize to JSON
+    return $feed->serializeToJsonString();
+}
+
+$feedJSON = createFeed();
+echo $feedJSON;
diff --git a/order-redirect/php/EntityFeedExample.php b/order-redirect/php/EntityFeedExample.php
new file mode 100644
index 0000000..f6ac3c8
--- /dev/null
+++ b/order-redirect/php/EntityFeedExample.php
@@ -0,0 +1,43 @@
+<?php
+/*
+Example Entity feed for Google Order Redirect.
+*/
+
+require dirname(__FILE__).'/vendor/autoload.php';
+
+use Madden\Ingestion\EntityFeed;
+use Madden\Ingestion\Entity;
+use Madden\Ingestion\GeoCoordinates;
+use Madden\Ingestion\PostalAddress;
+
+
+function createFeed() {
+    // Create Entity by using setter methods
+    $entity = new Entity();
+    $entity->setEntityId("merchant-1");
+    $entity->setName("Mo's Dinner");
+    $entity->setTelephone("+14567891234");
+    $entity->setUrl("http://moesdinner.com");
+    $entityLocation = new GeoCoordinates();
+    $entityLocation->setLatitude(41.525588);
+    $entityLocation->setLongitude(-90.507067);
+    $entity->setLocation($entityLocation);
+    $entityAddress = new PostalAddress();
+    $entityAddress->setCountry("US");
+    $entityAddress->setLocality("Mountain View");
+    $entityAddress->setRegion("CA");
+    $entityAddress->setPostalCode("94043");
+    $entityAddress->setStreetAddress("1600 Amphitheatre Pkwy");
+    $entityLocation->setAddress($entityAddress);
+
+    # Add Entity to feed data
+    $feed = new EntityFeed();
+    $feed->setData(array($entity));
+
+    # Serialize to JSON
+    return $feed->serializeToJsonString();
+}
+
+$feedJSON = createFeed();
+echo $feedJSON;
+
diff --git a/order-redirect/php/composer.json b/order-redirect/php/composer.json
new file mode 100644
index 0000000..8798557
--- /dev/null
+++ b/order-redirect/php/composer.json
@@ -0,0 +1,15 @@
+{
+    "name": "google-order-redirect/php-demo",
+    "description": "proto example for PHP",
+    "require": {
+      "google/protobuf": "^v3.12.2"
+    },
+    "autoload": {
+      "psr-4": {
+        "Madden\\": "build/gen/Madden",
+        "GPBMetadata\\": "build/gen/GPBMetadata/",
+        "Food\\": "build/gen/Food",
+        "Google\\": "build/gen/Google"
+      }
+    }
+  }
\ No newline at end of file
diff --git a/order-redirect/php/composer.lock b/order-redirect/php/composer.lock
new file mode 100644
index 0000000..0eba1e6
--- /dev/null
+++ b/order-redirect/php/composer.lock
@@ -0,0 +1,63 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "724b35a1604b000b76542b5f31d8cb69",
+    "packages": [
+        {
+            "name": "google/protobuf",
+            "version": "v3.25.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/protocolbuffers/protobuf-php.git",
+                "reference": "1fb247e72df401c863ed239c1660f981644af5db"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/1fb247e72df401c863ed239c1660f981644af5db",
+                "reference": "1fb247e72df401c863ed239c1660f981644af5db",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": ">=5.0.0"
+            },
+            "suggest": {
+                "ext-bcmath": "Need to support JSON deserialization"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Google\\Protobuf\\": "src/Google/Protobuf",
+                    "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "description": "proto library for PHP",
+            "homepage": "https://developers.google.com/protocol-buffers/",
+            "keywords": [
+                "proto"
+            ],
+            "support": {
+                "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.25.1"
+            },
+            "time": "2023-11-15T21:36:03+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": [],
+    "plugin-api-version": "2.6.0"
+}
diff --git a/order-redirect/proto/action.proto b/order-redirect/proto/action.proto
index 3ba4a59..b26cee7 100644
--- a/order-redirect/proto/action.proto
+++ b/order-redirect/proto/action.proto
@@ -4,6 +4,10 @@
 
 package madden.ingestion;
 
+option java_multiple_files = true;
+option java_package = "com.google.madden.ingestion";
+option go_package = "google/madden/ingestion";
+
 message ActionFeed {
   repeated ActionDetail data = 1;
 }
@@ -11,7 +15,6 @@
 message ActionDetail {
   // Reference to entity id
   optional string entity_id = 2;
-  // Link id for action detail
   optional string link_id = 3;
   // Deep link for action detail
   optional string url = 4;
@@ -42,4 +45,3 @@
   }
   ServiceType service_type = 1;
 }
-
diff --git a/order-redirect/proto/entity.proto b/order-redirect/proto/entity.proto
index 6df538f..451c639 100644
--- a/order-redirect/proto/entity.proto
+++ b/order-redirect/proto/entity.proto
@@ -1,9 +1,12 @@
-
 // Feeds declaration
 syntax = "proto3";
 
 package madden.ingestion;
 
+option java_multiple_files = true;
+option java_package = "com.google.madden.ingestion";
+option go_package = "google/madden/ingestion";
+
 message EntityFeed {
   repeated Entity data = 1;
 }
@@ -65,5 +68,4 @@
   string postal_code = 4;
   // The street address, e.g. "1600 Amphitheatre Pkwy". (required)
   string street_address = 5;
-}
-
+}
\ No newline at end of file
diff --git a/order-redirect/proto/food-service.proto b/order-redirect/proto/food-service.proto
index 047cea2..e5151c9 100644
--- a/order-redirect/proto/food-service.proto
+++ b/order-redirect/proto/food-service.proto
@@ -6,13 +6,14 @@
 
 option go_package = "google/food/ordering/services/v1";
 option java_package = "com.google.food.ordering.services.v1";
+option java_multiple_files = true;
 
 import "google/protobuf/duration.proto";
 import "google/protobuf/timestamp.proto";
-import "timeofday.proto";
-import "latlng.proto";
-import "money.proto";
-import "dayofweek.proto";
+import "google/type/timeofday.proto";
+import "google/type/latlng.proto";
+import "google/type/money.proto";
+import "google/type/dayofweek.proto";
 
 // Food Ordering Team's EPA Service Feeds Spec.
 message FoodServiceFeed {
@@ -168,7 +169,7 @@
 
   // When advance ordering services, this is the time windows the orders can be
   // placed.
-  // Optional. Required when advance_hour is given.
+  // Required when advance_hour is given. Invalid when asap_hour is given.
   repeated TimeOfDayWindow orderable_time = 5
       ;
 
@@ -310,4 +311,3 @@
   repeated string area_ids = 7
       ;
 }
-
diff --git a/order-redirect/proto/dayofweek.proto b/order-redirect/proto/google/type/dayofweek.proto
similarity index 100%
rename from order-redirect/proto/dayofweek.proto
rename to order-redirect/proto/google/type/dayofweek.proto
diff --git a/order-redirect/proto/latlng.proto b/order-redirect/proto/google/type/latlng.proto
similarity index 100%
rename from order-redirect/proto/latlng.proto
rename to order-redirect/proto/google/type/latlng.proto
diff --git a/order-redirect/proto/money.proto b/order-redirect/proto/google/type/money.proto
similarity index 100%
rename from order-redirect/proto/money.proto
rename to order-redirect/proto/google/type/money.proto
diff --git a/order-redirect/proto/timeofday.proto b/order-redirect/proto/google/type/timeofday.proto
similarity index 100%
rename from order-redirect/proto/timeofday.proto
rename to order-redirect/proto/google/type/timeofday.proto
diff --git a/order-redirect/python/action_feed.py b/order-redirect/python/action_feed.py
deleted file mode 100644
index c2f19ea..0000000
--- a/order-redirect/python/action_feed.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import json
-from generated import action_pb2
-from google.protobuf.json_format import MessageToDict
-
-#create feed
-feed = action_pb2.ActionFeed()
-
-#create action
-action = feed.data.add()
-action.entity_id = 'merchant-1'
-action.link_id = 'merchant-1-takeout-delivery-action'
-action.actions.extend([
-     action_pb2.Action(
-      food_ordering_info=action_pb2.FoodOrderingInfo(
-          service_type=action_pb2.FoodOrderingInfo.ServiceType.DELIVERY
-      )
-     ),
-     action_pb2.Action(
-      food_ordering_info=action_pb2.FoodOrderingInfo(
-          service_type=action_pb2.FoodOrderingInfo.ServiceType.TAKEOUT
-      )
-    )
-])
-action.url = "http://provider.com/merchant-1"
-
-feedJSON = json.dumps(MessageToDict(feed, preserving_proto_field_name=True))
-print(feedJSON)
-
diff --git a/order-redirect/python/action_feed_example.py b/order-redirect/python/action_feed_example.py
new file mode 100644
index 0000000..8e3027e
--- /dev/null
+++ b/order-redirect/python/action_feed_example.py
@@ -0,0 +1,58 @@
+'''
+Example Action feed for Google Order Redirect.
+'''
+
+import json
+from generated import action_pb2
+from google.protobuf.json_format import MessageToDict
+
+def create_feed() -> str:
+    # Create ActionFeed
+    feed = action_pb2.ActionFeed()
+
+    # Create ActionDetail by passing fields to the constructor
+    # Example using the same link for delivery and takeout
+    action_detail_combined = action_pb2.ActionDetail(
+        entity_id='merchant-1',
+        link_id='merchant-1-takeout-delivery-action',
+        url='http://provider.com/merchant-1',
+        actions=[
+            action_pb2.Action(
+                food_ordering_info=action_pb2.FoodOrderingInfo(
+                    service_type=action_pb2.FoodOrderingInfo.ServiceType.DELIVERY
+                )
+            ),
+            action_pb2.Action(
+                food_ordering_info=action_pb2.FoodOrderingInfo(
+                    service_type=action_pb2.FoodOrderingInfo.ServiceType.TAKEOUT
+                )
+            )
+        ]
+    )
+
+    # Add ActionDetail to data
+    feed.data.append(action_detail_combined)
+
+    # Example using separate link for delivery
+    action_detail_delivery = action_pb2.ActionDetail(
+        entity_id='merchant-2',
+        link_id='merchant-2-delivery-action',
+        url='http://provider.com/merchant-2/delivery',
+        actions=[
+            action_pb2.Action(
+                food_ordering_info=action_pb2.FoodOrderingInfo(
+                    service_type=action_pb2.FoodOrderingInfo.ServiceType.DELIVERY
+                )
+            )
+        ]
+    )
+
+    # Add ActionDetail to feed data
+    feed.data.append(action_detail_delivery)
+
+    # Serialize feed to JSON string
+    return json.dumps(MessageToDict(feed, preserving_proto_field_name=True))
+
+feedJSON = create_feed()
+print(feedJSON)
+
diff --git a/order-redirect/python/entity_feed.py b/order-redirect/python/entity_feed.py
deleted file mode 100644
index 044247a..0000000
--- a/order-redirect/python/entity_feed.py
+++ /dev/null
@@ -1,30 +0,0 @@
-import json
-from generated import entity_pb2
-from google.protobuf.json_format import MessageToDict
-
-#create feed
-feed = entity_pb2.EntityFeed()
-
-#create entity
-entity = feed.data.add()
-entity.entity_id = 'merchant-1'
-entity.name = "Mo's Dinner"
-entity.telephone = '+14567891234'
-entity.url = 'http://moesdinner.com'
-
-#create location
-location = entity.location
-location.latitude = 41.525588
-location.longitude = -90.507067
-
-#create address
-address = location.address
-address.country = 'US'
-address.locality = 'Mountain View'
-address.region = 'CA'
-address.postal_code = '94043'
-address.street_address = '1600 Amphitheatre Pkwy'
-
-feedJSON = json.dumps(MessageToDict(feed, preserving_proto_field_name=True))
-print(feedJSON)
-
diff --git a/order-redirect/python/entity_feed_example.py b/order-redirect/python/entity_feed_example.py
new file mode 100644
index 0000000..a67f775
--- /dev/null
+++ b/order-redirect/python/entity_feed_example.py
@@ -0,0 +1,38 @@
+'''
+Example Action feed for Google Order Redirect.
+'''
+
+import json
+from generated import entity_pb2
+from google.protobuf.json_format import MessageToDict
+
+def create_feed() -> str:
+    # Create feeds
+    feed = entity_pb2.EntityFeed()
+
+    # Create entity and add to feed data
+    entity = feed.data.add()
+    entity.entity_id = 'merchant-1'
+    entity.name = "Mo's Dinner"
+    entity.telephone = '+14567891234'
+    entity.url = 'http://moesdinner.com'
+
+    # Create location
+    location = entity.location
+    location.latitude = 41.525588
+    location.longitude = -90.507067
+
+    # Create address
+    address = location.address
+    address.country = 'US'
+    address.locality = 'Mountain View'
+    address.region = 'CA'
+    address.postal_code = '94043'
+    address.street_address = '1600 Amphitheatre Pkwy'
+
+    # Serialize feed to JSON string
+    return json.dumps(MessageToDict(feed, preserving_proto_field_name=True))
+
+feedJSON = create_feed()
+print(feedJSON)
+
diff --git a/order-redirect/python/service_feed.py b/order-redirect/python/service_feed.py
deleted file mode 100644
index 98aaf1c..0000000
--- a/order-redirect/python/service_feed.py
+++ /dev/null
@@ -1,90 +0,0 @@
-import json
-from generated import food_service_pb2
-from generated import timeofday_pb2
-from google.protobuf.json_format import MessageToDict
-
-#create feed
-feed = food_service_pb2.FoodServiceFeed()
-
-#create food_service
-service_data = feed.data.add()
-service_data.service.service_id = 'merchant-1-service-delivery'
-service_data.service.service_type = food_service_pb2.FoodOrderingService.ServiceType.DELIVERY
-service_data.service.parent_entity_id = 'merchant-1'
-service_data.service.lead_time.min_lead_time_duration.seconds = 1200
-service_data.service.action_link_id = 'merchant-1-takeout-delivery-action'
-
-#create fee
-fee_data = feed.data.add()
-fee_data.fee.fee_id = 'merchant-1-fee-delivery'
-fee_data.fee.fee_type = food_service_pb2.Fee.FeeType.DELIVERY
-fee_data.fee.fixed_amount.currency_code = 'USD'
-fee_data.fee.fixed_amount.units = 2
-fee_data.fee.service_ids.append('merchant-1-service-delivery')
-
-#create asap service hours
-asap_hours_data = feed.data.add()
-asap_hours_data.service_hours.hours_id = 'merchant-1-asap-hours-delivery'
-asap_hours_data.service_hours.service_ids.append('merchant-1-service-delivery')
-asap_hours = asap_hours_data.service_hours.asap_hours.add()
-asap_hours.time_windows.MergeFrom(food_service_pb2.TimeOfDayWindow(
-        time_windows=food_service_pb2.TimeOfDayRange(
-            open_time=timeofday_pb2.TimeOfDay(
-                hours=11,
-                minutes=00
-            ),
-            close_time=timeofday_pb2.TimeOfDay(
-                hours=22,
-                minutes=30
-            )
-        )
-    )
-)
-asap_hours.lead_time.min_lead_time_duration.seconds = 2400
-
-#create advance service hours
-advance_hours_data = feed.data.add()
-advance_hours_data.service_hours.hours_id = 'merchant-1-advance-hours-delivery'
-advance_hours_data.service_hours.service_ids.append('merchant-1-service-delivery')
-advance_hours = advance_hours_data.service_hours.advance_hours.add()
-advance_hours.time_windows.MergeFrom(food_service_pb2.TimeOfDayWindow(
-        time_windows=food_service_pb2.TimeOfDayRange(
-            open_time=timeofday_pb2.TimeOfDay(
-                hours=11,
-                minutes=00
-            ),
-            close_time=timeofday_pb2.TimeOfDay(
-                hours=22,
-                minutes=00
-            )
-        )
-    )
-)
-advance_hours.advance_booking_interval.min_offset.seconds = 60*60
-advance_hours.advance_booking_interval.max_offset.seconds = 60*60*24*3
-
-orderable_time = advance_hours_data.service_hours.orderable_time.append(
-    food_service_pb2.TimeOfDayWindow(
-        time_windows=food_service_pb2.TimeOfDayRange(
-            open_time=timeofday_pb2.TimeOfDay(
-                hours=00,
-                minutes=00
-            ),
-            close_time=timeofday_pb2.TimeOfDay(
-                hours=23,
-                minutes=59
-            )
-        )
-    )
-)
-
-#create service area
-service_area_data = feed.data.add()
-service_area_data.service_area.area_id = 'merchant-1-area-delivery'
-service_area_data.service_area.service_ids.append('merchant-1-service-delivery')
-service_area_data.service_area.circle.center.latitude = 37.4215576
-service_area_data.service_area.circle.center.longitude = -122.0951056
-service_area_data.service_area.circle.radius = 5000
-
-feedJSON = json.dumps(MessageToDict(feed, preserving_proto_field_name=True))
-print(feedJSON)
\ No newline at end of file
diff --git a/order-redirect/python/service_feed_example.py b/order-redirect/python/service_feed_example.py
new file mode 100644
index 0000000..32f92d6
--- /dev/null
+++ b/order-redirect/python/service_feed_example.py
@@ -0,0 +1,99 @@
+'''
+Example Service feed for Google Order Redirect.
+'''
+
+import json
+from generated import food_service_pb2
+from generated.google.type import timeofday_pb2
+from google.protobuf.json_format import MessageToDict
+
+def create_feed() -> str:
+    # Create feed
+    feed = food_service_pb2.FoodServiceFeed()
+
+    # Create delivery service
+    delivery_service_data = feed.data.add()
+    delivery_service_data.service.service_id = 'merchant-1-service-delivery'
+    delivery_service_data.service.service_type = food_service_pb2.FoodOrderingService.ServiceType.DELIVERY
+    delivery_service_data.service.parent_entity_id = 'merchant-1'
+    delivery_service_data.service.lead_time.min_lead_time_duration.seconds = 60*20
+    delivery_service_data.service.lead_time.min_lead_time_duration.seconds = 60*30
+    delivery_service_data.service.action_link_id = 'merchant-1-takeout-delivery-action'
+
+    # Create fee
+    fee_data = feed.data.add()
+    fee_data.fee.fee_id = 'merchant-1-fee-delivery'
+    fee_data.fee.fee_type = food_service_pb2.Fee.FeeType.DELIVERY
+    fee_data.fee.fixed_amount.currency_code = 'USD'
+    fee_data.fee.fixed_amount.units = 2
+    fee_data.fee.service_ids.append('merchant-1-service-delivery')
+
+    # Create asap service hours
+    asap_hours_data = feed.data.add()
+    asap_hours_data.service_hours.hours_id = 'merchant-1-asap-hours-delivery'
+    asap_hours_data.service_hours.service_ids.append('merchant-1-service-delivery')
+    asap_hours = asap_hours_data.service_hours.asap_hours.add()
+    asap_hours.time_windows.CopyFrom(food_service_pb2.TimeOfDayWindow(
+            time_windows=food_service_pb2.TimeOfDayRange(
+                open_time=timeofday_pb2.TimeOfDay(
+                    hours=11,
+                    minutes=0
+                ),
+                close_time=timeofday_pb2.TimeOfDay(
+                    hours=22,
+                    minutes=30
+                )
+            )
+        )
+    )
+    asap_hours.lead_time.min_lead_time_duration.seconds = 2400
+
+    # Create advance service hours
+    advance_hours_data = feed.data.add()
+    advance_hours_data.service_hours.hours_id = 'merchant-1-advance-hours-delivery'
+    advance_hours_data.service_hours.service_ids.append('merchant-1-service-delivery')
+    advance_hours = advance_hours_data.service_hours.advance_hours.add()
+    advance_hours.time_windows.CopyFrom(food_service_pb2.TimeOfDayWindow(
+            time_windows=food_service_pb2.TimeOfDayRange(
+                open_time=timeofday_pb2.TimeOfDay(
+                    hours=11,
+                    minutes=0
+                ),
+                close_time=timeofday_pb2.TimeOfDay(
+                    hours=22,
+                    minutes=0
+                )
+            )
+        )
+    )
+    advance_hours.advance_booking_interval.min_offset.seconds = 60*60
+    advance_hours.advance_booking_interval.max_offset.seconds = 60*60*24*3
+    # Create advance hour orderable time
+    orderable_time = advance_hours_data.service_hours.orderable_time.append(
+        food_service_pb2.TimeOfDayWindow(
+            time_windows=food_service_pb2.TimeOfDayRange(
+                open_time=timeofday_pb2.TimeOfDay(
+                    hours=0,
+                    minutes=0
+                ),
+                close_time=timeofday_pb2.TimeOfDay(
+                    hours=23,
+                    minutes=59
+                )
+            )
+        )
+    )
+
+    # Create service area
+    service_area_data = feed.data.add()
+    service_area_data.service_area.area_id = 'merchant-1-area-delivery'
+    service_area_data.service_area.service_ids.append('merchant-1-service-delivery')
+    service_area_data.service_area.circle.center.latitude = 37.4215576
+    service_area_data.service_area.circle.center.longitude = -122.0951056
+    service_area_data.service_area.circle.radius = 5000
+
+    # Serialize to JSON string
+    return json.dumps(MessageToDict(feed, preserving_proto_field_name=True))
+
+feedJSON = create_feed()
+print(feedJSON)
\ No newline at end of file
diff --git a/order-redirect/typescript/package-lock.json b/order-redirect/typescript/package-lock.json
new file mode 100644
index 0000000..769773f
--- /dev/null
+++ b/order-redirect/typescript/package-lock.json
@@ -0,0 +1,333 @@
+{
+  "name": "typescript",
+  "version": "1.0.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "typescript",
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "ts-proto": "^1.165.0"
+      },
+      "devDependencies": {
+        "typescript": "^5.3.2"
+      }
+    },
+    "node_modules/@protobufjs/aspromise": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+      "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+    },
+    "node_modules/@protobufjs/base64": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+    },
+    "node_modules/@protobufjs/codegen": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+    },
+    "node_modules/@protobufjs/eventemitter": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+      "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+    },
+    "node_modules/@protobufjs/fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+      "dependencies": {
+        "@protobufjs/aspromise": "^1.1.1",
+        "@protobufjs/inquire": "^1.1.0"
+      }
+    },
+    "node_modules/@protobufjs/float": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+      "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+    },
+    "node_modules/@protobufjs/inquire": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+      "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+    },
+    "node_modules/@protobufjs/path": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+      "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+    },
+    "node_modules/@protobufjs/pool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+      "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+    },
+    "node_modules/@protobufjs/utf8": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+      "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+    },
+    "node_modules/@types/node": {
+      "version": "20.10.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz",
+      "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/case-anything": {
+      "version": "2.1.13",
+      "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz",
+      "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==",
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+      "bin": {
+        "detect-libc": "bin/detect-libc.js"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/dprint-node": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz",
+      "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==",
+      "dependencies": {
+        "detect-libc": "^1.0.3"
+      }
+    },
+    "node_modules/long": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+      "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
+    },
+    "node_modules/protobufjs": {
+      "version": "7.2.5",
+      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz",
+      "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@protobufjs/aspromise": "^1.1.2",
+        "@protobufjs/base64": "^1.1.2",
+        "@protobufjs/codegen": "^2.0.4",
+        "@protobufjs/eventemitter": "^1.1.0",
+        "@protobufjs/fetch": "^1.1.0",
+        "@protobufjs/float": "^1.0.2",
+        "@protobufjs/inquire": "^1.1.0",
+        "@protobufjs/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.0",
+        "@types/node": ">=13.7.0",
+        "long": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/ts-poet": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.6.0.tgz",
+      "integrity": "sha512-4vEH/wkhcjRPFOdBwIh9ItO6jOoumVLRF4aABDX5JSNEubSqwOulihxQPqai+OkuygJm3WYMInxXQX4QwVNMuw==",
+      "dependencies": {
+        "dprint-node": "^1.0.7"
+      }
+    },
+    "node_modules/ts-proto": {
+      "version": "1.165.0",
+      "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.165.0.tgz",
+      "integrity": "sha512-s7+RR/hcCXq8E4jDzwsaq0RXyVpu2pQ4XkT7meBA19xRrHWC32gfwMupcQrnpzoaR7n/F69AvK6FUyW7R+jYZQ==",
+      "dependencies": {
+        "case-anything": "^2.1.13",
+        "protobufjs": "^7.2.4",
+        "ts-poet": "^6.5.0",
+        "ts-proto-descriptors": "1.15.0"
+      },
+      "bin": {
+        "protoc-gen-ts_proto": "protoc-gen-ts_proto"
+      }
+    },
+    "node_modules/ts-proto-descriptors": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.15.0.tgz",
+      "integrity": "sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==",
+      "dependencies": {
+        "long": "^5.2.3",
+        "protobufjs": "^7.2.4"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz",
+      "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==",
+      "dev": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+    }
+  },
+  "dependencies": {
+    "@protobufjs/aspromise": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+      "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+    },
+    "@protobufjs/base64": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+    },
+    "@protobufjs/codegen": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+    },
+    "@protobufjs/eventemitter": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+      "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+    },
+    "@protobufjs/fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.1",
+        "@protobufjs/inquire": "^1.1.0"
+      }
+    },
+    "@protobufjs/float": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+      "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+    },
+    "@protobufjs/inquire": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+      "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+    },
+    "@protobufjs/path": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+      "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+    },
+    "@protobufjs/pool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+      "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+    },
+    "@protobufjs/utf8": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+      "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+    },
+    "@types/node": {
+      "version": "20.10.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz",
+      "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==",
+      "requires": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "case-anything": {
+      "version": "2.1.13",
+      "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz",
+      "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng=="
+    },
+    "detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="
+    },
+    "dprint-node": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz",
+      "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==",
+      "requires": {
+        "detect-libc": "^1.0.3"
+      }
+    },
+    "long": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+      "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
+    },
+    "protobufjs": {
+      "version": "7.2.5",
+      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz",
+      "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==",
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.2",
+        "@protobufjs/base64": "^1.1.2",
+        "@protobufjs/codegen": "^2.0.4",
+        "@protobufjs/eventemitter": "^1.1.0",
+        "@protobufjs/fetch": "^1.1.0",
+        "@protobufjs/float": "^1.0.2",
+        "@protobufjs/inquire": "^1.1.0",
+        "@protobufjs/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.0",
+        "@types/node": ">=13.7.0",
+        "long": "^5.0.0"
+      }
+    },
+    "ts-poet": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.6.0.tgz",
+      "integrity": "sha512-4vEH/wkhcjRPFOdBwIh9ItO6jOoumVLRF4aABDX5JSNEubSqwOulihxQPqai+OkuygJm3WYMInxXQX4QwVNMuw==",
+      "requires": {
+        "dprint-node": "^1.0.7"
+      }
+    },
+    "ts-proto": {
+      "version": "1.165.0",
+      "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.165.0.tgz",
+      "integrity": "sha512-s7+RR/hcCXq8E4jDzwsaq0RXyVpu2pQ4XkT7meBA19xRrHWC32gfwMupcQrnpzoaR7n/F69AvK6FUyW7R+jYZQ==",
+      "requires": {
+        "case-anything": "^2.1.13",
+        "protobufjs": "^7.2.4",
+        "ts-poet": "^6.5.0",
+        "ts-proto-descriptors": "1.15.0"
+      }
+    },
+    "ts-proto-descriptors": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.15.0.tgz",
+      "integrity": "sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==",
+      "requires": {
+        "long": "^5.2.3",
+        "protobufjs": "^7.2.4"
+      }
+    },
+    "typescript": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz",
+      "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==",
+      "dev": true
+    },
+    "undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+    }
+  }
+}
diff --git a/order-redirect/typescript/package.json b/order-redirect/typescript/package.json
new file mode 100644
index 0000000..354d635
--- /dev/null
+++ b/order-redirect/typescript/package.json
@@ -0,0 +1,18 @@
+{
+  "name": "google-order-redirect-typescript-demo",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "build": "tsc --build",
+    "clean": "tsc --build --clean"
+  },
+  "author": "",
+  "license": "ISC",
+  "devDependencies": {
+    "typescript": "^5.3.2"
+  },
+  "dependencies": {
+    "ts-proto": "^1.165.0"
+  }
+}
diff --git a/order-redirect/typescript/src/action_feed_example.ts b/order-redirect/typescript/src/action_feed_example.ts
new file mode 100644
index 0000000..7526eaa
--- /dev/null
+++ b/order-redirect/typescript/src/action_feed_example.ts
@@ -0,0 +1,53 @@
+/*
+Example Action feed for Google Order Redirect.
+*/
+
+import {
+    ActionFeed, ActionDetail, FoodOrderingInfo_ServiceType
+} from './generated/action';
+
+function createFeed() : string {
+    // Create ActionDetail using one link for both delivery and takeout
+    const actionDetailCombined: ActionDetail = {
+        entity_id: 'merchant-1',
+        link_id: 'merchant-1-takeout-delivery-action',
+        actions: [
+            {
+                food_ordering_info: {
+                    service_type: FoodOrderingInfo_ServiceType.DELIVERY
+                }
+            },
+            {
+                food_ordering_info: {
+                    service_type: FoodOrderingInfo_ServiceType.TAKEOUT
+                }
+            }
+        ],
+        url: 'http://provider.com/merchant-1'
+    };
+
+    // Create ActionDetail using a separate link for delivery
+    const actionDetailDelivery: ActionDetail = {
+        entity_id: 'merchant-2',
+        link_id: 'merchant-2-delivery-action',
+        actions: [
+            {
+                food_ordering_info: {
+                    service_type: FoodOrderingInfo_ServiceType.DELIVERY
+                }
+            }
+        ],
+        url: 'http://provider.com/merchant-2/delivery'
+    };
+
+    // Add ActionDetail to feed data array
+    const feed: ActionFeed = {
+        data:[actionDetailCombined, actionDetailDelivery]
+    };
+
+    // Serialize feed to JSON
+    return JSON.stringify(feed);
+}
+
+const feedJSON = createFeed();
+console.log(feedJSON);
diff --git a/order-redirect/typescript/src/entity_feed_example.ts b/order-redirect/typescript/src/entity_feed_example.ts
new file mode 100644
index 0000000..0c043a9
--- /dev/null
+++ b/order-redirect/typescript/src/entity_feed_example.ts
@@ -0,0 +1,39 @@
+/*
+Example Entity feed for Google Order Redirect.
+*/
+
+import {
+    EntityFeed, Entity
+} from './generated/entity';
+
+function createFeed() : string {
+    // Create Entity
+    const entity: Entity = {
+        entity_id: 'merchant-1',
+        name: "Mo's Dinner",
+        telephone: '+14567891234',
+        url: 'http://moesdinner.com',
+        location: {
+            latitude: 41.525588,
+            longitude: -90.507067,
+            address: {
+                country: 'US',
+                locality: 'Mountain View',
+                region: 'CA',
+                postal_code: '94043',
+                street_address: '1600 Amphitheatre Pkwy'
+            }
+        }
+    };
+
+    // Add Entity to feed data array
+    const feed: EntityFeed = {
+        data: [entity]
+    };
+
+    // Serialize feed to JSON
+    return JSON.stringify(feed);
+}
+
+const feedJSON = createFeed();
+console.log(feedJSON);
diff --git a/order-redirect/typescript/tsconfig.json b/order-redirect/typescript/tsconfig.json
new file mode 100644
index 0000000..b9cbb66
--- /dev/null
+++ b/order-redirect/typescript/tsconfig.json
@@ -0,0 +1,15 @@
+{
+  "include": ["src/**/*"],
+  "compilerOptions": {
+    "outDir": "dist",
+    "rootDir": "src",
+    "allowJs": true,
+    "target": "ES2020",
+    "module": "commonjs",
+    "declaration": false,
+    "sourceMap": true,
+    "strict": true,
+    "esModuleInterop": true,
+    "forceConsistentCasingInFileNames": true
+  }
+}
\ No newline at end of file