diff --git a/vnfs/VES5.0/evel/evel-library/code/evel_library/evel.h b/vnfs/VES5.0/evel/evel-library/code/evel_library/evel.h
index 0ae1713..be3ae6c 100644
--- a/vnfs/VES5.0/evel/evel-library/code/evel_library/evel.h
+++ b/vnfs/VES5.0/evel/evel-library/code/evel_library/evel.h
@@ -1715,13 +1715,14 @@ void evel_fault_type_set(EVENT_FAULT * fault, const char * const type);
  * @param   measurement_interval
  * @param event_name    Unique Event Name
  * @param event_id    A universal identifier of the event for analysis etc
+ * @param event_source_name  Optional override of the source name
  *
  * @returns pointer to the newly manufactured ::EVENT_MEASUREMENT.  If the
  *          event is not used (i.e. posted) it must be released using
  *          ::evel_free_event.
  * @retval  NULL  Failed to create the event.
  *****************************************************************************/
-EVENT_MEASUREMENT * evel_new_measurement(double measurement_interval,const char* ev_name, const char *ev_id);
+EVENT_MEASUREMENT * evel_new_measurement(double measurement_interval,const char* ev_name, const char *ev_id, const char *ev_source_name);
 
 /**************************************************************************//**
  * Free a Measurement.
diff --git a/vnfs/VES5.0/evel/evel-library/code/evel_library/evel_event.c b/vnfs/VES5.0/evel/evel-library/code/evel_library/evel_event.c
index 4de49bc..de6b362 100644
--- a/vnfs/VES5.0/evel/evel-library/code/evel_library/evel_event.c
+++ b/vnfs/VES5.0/evel/evel-library/code/evel_library/evel_event.c
@@ -167,7 +167,8 @@ void evel_init_header(EVENT_HEADER * const header,const char *const eventname)
   header->last_epoch_microsec = tv.tv_usec + 1000000 * tv.tv_sec;
   header->priority = EVEL_PRIORITY_NORMAL;
   header->reporting_entity_name = strdup(openstack_vm_name());
-  header->source_name = strdup(openstack_vm_name());
+  /* header->source_name = strdup(openstack_vm_name()); */
+  header->source_name = strdup(openstack_vnf_id()); /* vCPE quick hack */
   header->sequence = event_sequence;
   header->start_epoch_microsec = header->last_epoch_microsec;
   header->major_version = EVEL_HEADER_MAJOR_VERSION;
@@ -181,7 +182,8 @@ void evel_init_header(EVENT_HEADER * const header,const char *const eventname)
   evel_init_option_string(&header->nfcnaming_code);
   evel_init_option_string(&header->nfnaming_code);
   evel_force_option_string(&header->reporting_entity_id, openstack_vm_uuid());
-  evel_force_option_string(&header->source_id, openstack_vm_uuid());
+  /* evel_force_option_string(&header->source_id, openstack_vm_uuid()); */
+  evel_force_option_string(&header->source_id, openstack_vnf_id()); /* vCPE quick hack */
   evel_init_option_intheader(&header->internal_field);
 
   EVEL_EXIT();
@@ -216,7 +218,8 @@ void evel_init_header_nameid(EVENT_HEADER * const header,const char *const event
   header->last_epoch_microsec = tv.tv_usec + 1000000 * tv.tv_sec;
   header->priority = EVEL_PRIORITY_NORMAL;
   header->reporting_entity_name = strdup(openstack_vm_name());
-  header->source_name = strdup(openstack_vm_name());
+  /* header->source_name = strdup(openstack_vm_name()); */
+  header->source_name = strdup(openstack_vnf_id()); /* vCPE quick hack */
   header->sequence = event_sequence;
   header->start_epoch_microsec = header->last_epoch_microsec;
   header->major_version = EVEL_HEADER_MAJOR_VERSION;
@@ -230,7 +233,63 @@ void evel_init_header_nameid(EVENT_HEADER * const header,const char *const event
   evel_init_option_string(&header->nfcnaming_code);
   evel_init_option_string(&header->nfnaming_code);
   evel_force_option_string(&header->reporting_entity_id, openstack_vm_uuid());
-  evel_force_option_string(&header->source_id, openstack_vm_uuid());
+  /* evel_force_option_string(&header->source_id, openstack_vm_uuid()); */
+  evel_force_option_string(&header->source_id, openstack_vnf_id()); /* vCPE quick hack */
+  evel_init_option_intheader(&header->internal_field);
+
+  EVEL_EXIT();
+}
+
+/**************************************************************************//**
+ * Initialize a newly created event header.
+ *
+ * @param header  Pointer to the header being initialized.
+ *****************************************************************************/
+void evel_init_header_source_name(EVENT_HEADER * const header,const char *const eventname, const char *eventid, const char *eventsrcname)
+{
+  struct timeval tv;
+
+  EVEL_ENTER();
+
+  assert(header != NULL);
+  assert(eventname != NULL);
+  assert(eventid != NULL);
+
+  gettimeofday(&tv, NULL);
+
+  /***************************************************************************/
+  /* Initialize the header.  Get a new event sequence number.  Note that if  */
+  /* any memory allocation fails in here we will fail gracefully because     */
+  /* everything downstream can cope with NULLs.                              */
+  /***************************************************************************/
+  header->event_domain = EVEL_DOMAIN_HEARTBEAT;
+  header->event_id = strdup(eventid);
+  header->event_name = strdup(eventname);
+  header->last_epoch_microsec = tv.tv_usec + 1000000 * tv.tv_sec;
+  header->priority = EVEL_PRIORITY_NORMAL;
+  header->reporting_entity_name = strdup(openstack_vm_name());
+  /* header->source_name = strdup(openstack_vm_name()); */
+  /* vCPE quck hack */
+  if (strlen(eventsrcname)) {
+    header->source_name = strdup(eventsrcname);
+  } else {
+    header->source_name = strdup(openstack_vnf_id());
+  }
+  header->sequence = event_sequence;
+  header->start_epoch_microsec = header->last_epoch_microsec;
+  header->major_version = EVEL_HEADER_MAJOR_VERSION;
+  header->minor_version = EVEL_HEADER_MINOR_VERSION;
+  event_sequence++;
+
+  /***************************************************************************/
+  /* Optional parameters.                                                    */
+  /***************************************************************************/
+  evel_init_option_string(&header->event_type);
+  evel_init_option_string(&header->nfcnaming_code);
+  evel_init_option_string(&header->nfnaming_code);
+  evel_force_option_string(&header->reporting_entity_id, openstack_vm_uuid());
+  /* evel_force_option_string(&header->source_id, openstack_vm_uuid()); */
+  evel_force_option_string(&header->source_id, openstack_vnf_id()); /* vCPE quick hack */
   evel_init_option_intheader(&header->internal_field);
 
   EVEL_EXIT();
diff --git a/vnfs/VES5.0/evel/evel-library/code/evel_library/evel_scaling_measurement.c b/vnfs/VES5.0/evel/evel-library/code/evel_library/evel_scaling_measurement.c
index b73eb97..2446e02 100644
--- a/vnfs/VES5.0/evel/evel-library/code/evel_library/evel_scaling_measurement.c
+++ b/vnfs/VES5.0/evel/evel-library/code/evel_library/evel_scaling_measurement.c
@@ -40,13 +40,14 @@
  * @param   measurement_interval
  * @param event_name  Unique Event Name confirming Domain AsdcModel Description
  * @param event_id    A universal identifier of the event for: troubleshooting correlation, analysis, etc
+ * @param event_source_name  Optional override of the source name
  *
  * @returns pointer to the newly manufactured ::EVENT_MEASUREMENT.  If the
  *          event is not used (i.e. posted) it must be released using
  *          ::evel_free_event.
  * @retval  NULL  Failed to create the event.
  *****************************************************************************/
-EVENT_MEASUREMENT * evel_new_measurement(double measurement_interval, const char* ev_name, const char *ev_id)
+EVENT_MEASUREMENT * evel_new_measurement(double measurement_interval, const char* ev_name, const char *ev_id, const char *ev_source_name)
 {
   EVENT_MEASUREMENT * measurement = NULL;
 
@@ -72,7 +73,7 @@ EVENT_MEASUREMENT * evel_new_measurement(double measurement_interval, const char
   /***************************************************************************/
   /* Initialize the header & the measurement fields.                         */
   /***************************************************************************/
-  evel_init_header_nameid(&measurement->header,ev_name,ev_id);
+  evel_init_header_source_name(&measurement->header,ev_name,ev_id,ev_source_name);
   measurement->header.event_domain = EVEL_DOMAIN_MEASUREMENT;
   measurement->measurement_interval = measurement_interval;
   dlist_initialize(&measurement->additional_info);
diff --git a/vnfs/VES5.0/evel/evel-library/code/evel_library/metadata.c b/vnfs/VES5.0/evel/evel-library/code/evel_library/metadata.c
index 62ea6b5..6c322db 100644
--- a/vnfs/VES5.0/evel/evel-library/code/evel_library/metadata.c
+++ b/vnfs/VES5.0/evel/evel-library/code/evel_library/metadata.c
@@ -60,6 +60,11 @@ static char vm_uuid[MAX_METADATA_STRING+1] = {0};
 static char vm_name[MAX_METADATA_STRING+1] = {0};
 
 /**************************************************************************//**
+ * ID of the VNF extracted from the OpenStack metadata service.
+ *****************************************************************************/
+static char vnf_id[MAX_METADATA_STRING+1] = {0};
+
+/**************************************************************************//**
  * How many metadata elements we allow for in the retrieved JSON.
  *****************************************************************************/
 static const int MAX_METADATA_TOKENS = 128;
@@ -290,6 +295,19 @@ EVEL_ERR_CODES openstack_metadata(int verbosity)
     {
       EVEL_DEBUG("VM Name: %s", vm_name);
     }
+    if (json_get_string(rx_chunk.memory,
+                                  tokens,
+                                  json_token_count,
+                                  "vnf_id",
+                                  vnf_id) != EVEL_SUCCESS)
+    {
+      rc = EVEL_BAD_METADATA;
+      EVEL_ERROR("Failed to extract VNF ID from OpenStack metadata");
+    }
+    else
+    {
+      EVEL_DEBUG("VNF Id: %s", vnf_id);
+    }
   }
 
 exit_label:
@@ -319,6 +337,9 @@ void openstack_metadata_initialize()
   strncpy(vm_name,
           "Dummy VM name - No Metadata available",
           MAX_METADATA_STRING);
+  strncpy(vnf_id,
+          "Dummy VNF ID - No Metadata available",
+          MAX_METADATA_STRING);
 }
 
 /**************************************************************************//**
@@ -591,3 +612,13 @@ const char *openstack_vm_uuid()
 {
   return vm_uuid;
 }
+
+/**************************************************************************//**
+ * Get the VM UUID provided by the metadata service.
+ *
+ * @returns VM UUID
+ *****************************************************************************/
+const char *openstack_vnf_id()
+{
+  return vnf_id;
+}
diff --git a/vnfs/VES5.0/evel/evel-library/code/evel_library/metadata.h b/vnfs/VES5.0/evel/evel-library/code/evel_library/metadata.h
index 1ee4409..b9ed21c 100644
--- a/vnfs/VES5.0/evel/evel-library/code/evel_library/metadata.h
+++ b/vnfs/VES5.0/evel/evel-library/code/evel_library/metadata.h
@@ -55,4 +55,11 @@ const char *openstack_vm_name();
  *****************************************************************************/
 const char *openstack_vm_uuid();
 
+/**************************************************************************//**
+ * Get the VNF ID provided by the metadata service.
+ *
+ * @returns VNF ID
+ *****************************************************************************/
+const char *openstack_vnf_id();
+
 #endif