diff --git a/proto/telemetry_frontend.proto b/proto/telemetry_frontend.proto
new file mode 100644
index 0000000000000000000000000000000000000000..93213628e07e7c6346d80051e0f9224a261d1841
--- /dev/null
+++ b/proto/telemetry_frontend.proto
@@ -0,0 +1,42 @@
+syntax = "proto3";
+package device;
+
+import "context.proto";
+import "kpi_manager.proto";
+import "kpi_sample_types.proto";
+
+service TelemetryFrontendService {
+  rpc StartCollector  (Collector      ) returns (CollectorId  ) {}
+  rpc StopCollector   (CollectorId    ) returns (context.Empty) {}
+  rpc SelectCollectors(CollectorFilter) returns (CollectorList) {}
+}
+
+message CollectorId {
+  context.Uuid collector_id = 1;
+}
+
+message Collector {
+  CollectorId collector_id = 1; // The Collector ID
+  kpi_manager.KpiId kpi_id = 2; // The KPI Id to be associated to the collected samples
+  float duration_s         = 3; // Terminate data collection after duration[seconds]; duration==0 means indefinitely
+  float interval_s         = 4; // Interval between collected samples
+}
+
+message CollectorFilter {
+  // Collector that fulfill the filter are those that match ALL the following fields.
+  // An empty list means: any value is accepted.
+  // All fields empty means: list all Collectors
+  repeated CollectorId                    collector_id    = 1;
+  repeated kpi_manager.KpiId              kpi_id          = 2;
+  repeated kpi_sample_types.KpiSampleType kpi_sample_type = 3;
+  repeated context.DeviceId               device_id       = 4;
+  repeated context.EndPointId             endpoint_id     = 5;
+  repeated context.ServiceId              service_id      = 6;
+  repeated context.SliceId                slice_id        = 7;
+  repeated context.ConnectionId           connection_id   = 8;
+  repeated context.LinkId                 link_id         = 9;
+}
+
+message CollectorList {
+  repeated Collector collector_list = 1;
+}