diff --git a/api/bbsim/bbsim.yaml b/api/bbsim/bbsim.yaml
new file mode 100644
index 0000000..484ad3c
--- /dev/null
+++ b/api/bbsim/bbsim.yaml
@@ -0,0 +1,30 @@
+# Copyright 2018-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+type: google.api.Service
+config_version: 3
+
+http:
+  rules:
+  - selector: bbsim.BBSim.Version
+    get: "/v1/version"
+  - selector: bbsim.BBSim.GetOlt
+    get: "/v1/olt"
+    additional_bindings:
+      - get: "/v1/olt/status"
+  - selector: bbsim.BBSim.GetONUs
+    get: "/v1/olt/onus"
+  - selector: bbsim.BBSim.GetONU
+    get: "/v1/olt/onus/{SerialNumber}"
+
diff --git a/api/legacy/bbsim.proto b/api/legacy/bbsim.proto
new file mode 100644
index 0000000..fee9bec
--- /dev/null
+++ b/api/legacy/bbsim.proto
@@ -0,0 +1,232 @@
+// Copyright (c) 2018 Open Networking Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at:
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+package legacy;
+
+import "google/api/annotations.proto";
+import "protoc-gen-swagger/options/annotations.proto";
+import "voltha_protos/openolt.proto";
+import "voltha_protos/tech_profile.proto";
+
+option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = {
+	info: {
+	title: "BBSim API";
+	version: "1.0";
+	contact: {
+		url: "http://opencord.org";
+		};
+	};
+	schemes: HTTP;
+	consumes: "application/json";
+	produces: "application/json";
+	responses: {
+	key: "404";
+	value: {
+		description: "Returned when the resource does not exist.";
+		schema: {
+			json_schema: {
+			  type: STRING;
+		}
+		}
+	}
+	}
+};
+
+// OLT information
+message OLTInfo {
+	option deprecated = true;
+	int64   olt_id = 1;
+	string  olt_serial = 2;
+	string  olt_ip = 3;
+	string  olt_state = 4;
+	string  olt_vendor = 5;
+}
+
+// ONU information
+message ONUInfo {
+    uint32 onu_id = 1;
+    uint32 pon_port_id = 2;
+    // ONU serial number
+    string onu_serial = 3;
+    // ONU oper state
+    string oper_state = 4;
+    // ONU internal state
+    string onu_state = 5;
+    repeated uint32 gemports = 6;
+    Tconts tconts = 7;
+}
+
+// Bulk ONU operations
+message ONUs {
+	repeated ONUInfo onus = 1;
+}
+
+message ONURequest {
+	ONUInfo onu = 1;
+	ONUs onus_batch = 2;
+}
+
+// Port information
+message PortInfo {
+	string port_type = 1;
+	uint32 port_id = 2;
+	uint32 pon_port_max_onus = 3;
+	uint32 pon_port_active_onus = 4;
+	string port_state = 5;
+	string alarm_state = 6;
+}
+
+// Bulk port information
+message Ports {
+	repeated PortInfo ports = 1;
+}
+
+// BBSim status
+message OLTStatusResponse {
+	OLTInfo olt = 1;
+	repeated PortInfo ports = 2;
+}
+
+// BBSim response message
+message BBSimResponse {
+	string status_msg = 1;
+}
+
+// ONU alarm request
+message ONUAlarmRequest {
+	// ONU serial number
+	string onu_serial = 1;
+	// Alarm types are:
+	//   "signaldegrade"
+	//   "lossofomcichannel"
+	//   "lossofploam"
+	string alarm_type = 2;
+	// "on"/"off" indicates raised or cleared alarm
+	string status = 3;                 }
+
+// OLT alarm request
+message OLTAlarmRequest {
+	uint32 port_id = 1;
+	string port_type = 2;
+	string status = 3;
+}
+
+// Device action
+message DeviceAction {
+	string device_type = 1;             // ONU or OLT
+	string serial_number = 2;    // Device serial number
+	string action = 3;           // soft or hard reboot
+}
+
+message Tconts {
+    fixed32 uni_id = 4;
+	fixed32 port_no = 5;
+	repeated tech_profile.TrafficScheduler tconts = 3;
+}
+
+message Flows {
+    repeated openolt.Flow flows = 1;
+}
+
+message Empty {}
+
+service BBSimService {
+
+	// Get current status of OLT
+	rpc OLTStatus(Empty) returns (OLTStatusResponse) {
+		option deprecated = true;
+		option (google.api.http) = {
+			get : "/v0/olt"
+			additional_bindings {get : "/v0/olt/status"}
+		};
+	}
+
+	// Get status of a PON/NNI port
+	rpc PortStatus(PortInfo) returns (Ports) {
+		option deprecated = true;
+		option (google.api.http) = {
+			get : "/v0/olt/ports/{port_type}/{port_id}/status"
+		};
+	}
+
+	// Get status of all or specific ONUs
+	rpc ONUStatus(ONURequest) returns (ONUs) {
+		option deprecated = true;
+		option (google.api.http) = {
+			get : "/v0/olt/onus"
+			additional_bindings { get : "/v0/olt/onus/{onu.onu_serial}" }
+			additional_bindings { get : "/v0/olt/ports/{onu.pon_port_id}/onus/{onu.onu_id}" }
+			additional_bindings { get : "/v0/olt/ports/{onu.pon_port_id}/onus" }
+		};
+	}
+
+	// Single/bulk activate ONU(s) for specific PON port(s)
+	rpc ONUActivate(ONURequest) returns (BBSimResponse) {
+		option deprecated = true;
+		option (google.api.http) = {
+			post : "/v0/olt/onus"
+			body: "onus_batch"
+			additional_bindings { post : "/v0/olt/ports/{onu.pon_port_id}/onus" }
+			additional_bindings { post : "/v0/olt/ports/{onu.pon_port_id}/onus/{onu.onu_serial}" }
+		};
+	}
+
+	// Deactivate ONU(s) for specific PON port(s) specified by
+	// a given onu_serial, onu_id, or pon_port_id
+	rpc ONUDeactivate(ONURequest) returns (BBSimResponse) {
+		option deprecated = true;
+		option (google.api.http) = {
+			delete : "/v0/olt/onus"
+			body: "onus_batch"
+			additional_bindings { delete: "/v0/olt/onus/{onu.onu_serial}" }
+			additional_bindings { delete: "/v0/olt/ports/{onu.pon_port_id}/onus" }
+			additional_bindings { delete: "/v0/olt/ports/{onu.pon_port_id}/onus/{onu.onu_id}" }
+		};
+	}
+
+	// Generate ONU related alarms
+	rpc GenerateONUAlarm(ONUAlarmRequest) returns (BBSimResponse) {
+		option deprecated = true;
+		option (google.api.http) = {
+			post : "/v0/olt/onus/{onu_serial}/alarms/{alarm_type}/{status}"
+		};
+	}
+
+	// Generate OLT related alarms
+	rpc GenerateOLTAlarm(OLTAlarmRequest) returns (BBSimResponse) {
+		option deprecated = true;
+		option (google.api.http) = {
+			post : "/v0/olt/ports/{port_type}/{port_id}/alarms/los/{status}"
+		};
+	}
+
+	// Perform actions on OLT/ONU devices (e.g. reboot)
+	rpc PerformDeviceAction(DeviceAction) returns (BBSimResponse) {
+		option deprecated = true;
+		option (google.api.http) = {
+			patch: "/v0/{device_type}/action/{action}"
+			additional_bindings { patch : "/v0/olt/{device_type}/{serial_number}/action/{action}"}
+		};
+	}
+
+	// Get flows
+	rpc GetFlows(ONUInfo) returns(Flows) {
+		option deprecated = true;
+	    option (google.api.http) = {
+	        get: "/v0/olt/flows"
+	        additional_bindings {get: "/v0/olt/onu/{onu_serial}/flows"}
+	    };
+	}
+}
