http://git-wip-us.apache.org/repos/asf/nifi/blob/c955ec16/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
index 25ffed1..3d5f650 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
@@ -16,7 +16,28 @@
  */
 package org.apache.nifi.web;
 
-import com.google.common.collect.Sets;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import javax.ws.rs.WebApplicationException;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.nifi.action.Action;
 import org.apache.nifi.action.Component;
@@ -173,26 +194,7 @@ import org.apache.nifi.web.util.SnippetUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.ws.rs.WebApplicationException;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.UUID;
-import java.util.function.Function;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
+import com.google.common.collect.Sets;
 
 /**
  * Implementation of NiFiServiceFacade that performs revision checking.
@@ -294,7 +296,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         }
 
         @Override
-        public Authorizable getControllerServiceReferencingComponent(String 
controllerSeriveId, String id) {
+        public Authorizable getControllerServiceReferencingComponent(final 
String controllerSeriveId, final String id) {
             final ControllerServiceNode controllerService = 
controllerServiceDAO.getControllerService(controllerSeriveId);
             final ControllerServiceReference referencingComponents = 
controllerService.getReferences();
 
@@ -329,7 +331,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         }
 
         @Override
-        public Authorizable getConnectable(String id) {
+        public Authorizable getConnectable(final String id) {
             final ProcessGroup group = 
processGroupDAO.getProcessGroup(controllerFacade.getRootGroupId());
             return group.findConnectable(id);
         }
@@ -340,49 +342,49 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     // -----------------------------------------
 
     @Override
-    public void authorizeAccess(AuthorizeAccess authorizeAccess) {
+    public void authorizeAccess(final AuthorizeAccess authorizeAccess) {
         authorizeAccess.authorize(authorizableLookup);
     }
 
     @Override
-    public void claimRevision(Revision revision, NiFiUser user) {
+    public void claimRevision(final Revision revision, final NiFiUser user) {
         revisionManager.requestClaim(revision, user);
     }
 
     @Override
-    public void claimRevisions(Set<Revision> revisions, NiFiUser user) {
+    public void claimRevisions(final Set<Revision> revisions, final NiFiUser 
user) {
         revisionManager.requestClaim(revisions, user);
     }
 
     @Override
-    public void cancelRevision(Revision revision) {
+    public void cancelRevision(final Revision revision) {
         revisionManager.cancelClaim(revision);
     }
 
     @Override
-    public void cancelRevisions(Set<Revision> revisions) {
+    public void cancelRevisions(final Set<Revision> revisions) {
         revisionManager.cancelClaims(revisions);
     }
 
     @Override
-    public void releaseRevisionClaim(Revision revision, NiFiUser user) throws 
InvalidRevisionException {
+    public void releaseRevisionClaim(final Revision revision, final NiFiUser 
user) throws InvalidRevisionException {
         revisionManager.releaseClaim(new StandardRevisionClaim(revision), 
user);
     }
 
     @Override
-    public void releaseRevisionClaims(Set<Revision> revisions, NiFiUser user) 
throws InvalidRevisionException {
+    public void releaseRevisionClaims(final Set<Revision> revisions, final 
NiFiUser user) throws InvalidRevisionException {
         revisionManager.releaseClaim(new StandardRevisionClaim(revisions), 
user);
     }
 
     @Override
-    public Set<Revision> getRevisionsFromGroup(String groupId, 
Function<ProcessGroup, Set<String>> getComponents) {
+    public Set<Revision> getRevisionsFromGroup(final String groupId, final 
Function<ProcessGroup, Set<String>> getComponents) {
         final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
         final Set<String> componentIds = 
revisionManager.get(group.getIdentifier(), rev -> getComponents.apply(group));
         return componentIds.stream().map(id -> 
revisionManager.getRevision(id)).collect(Collectors.toSet());
     }
 
     @Override
-    public Set<Revision> getRevisionsFromSnippet(String snippetId) {
+    public Set<Revision> getRevisionsFromSnippet(final String snippetId) {
         final Snippet snippet = snippetDAO.getSnippet(snippetId);
         final Set<String> componentIds = new HashSet<>();
         componentIds.addAll(snippet.getProcessors().keySet());
@@ -401,17 +403,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     // -----------------------------------------
 
     @Override
-    public void verifyListQueue(String connectionId) {
+    public void verifyListQueue(final String connectionId) {
         connectionDAO.verifyList(connectionId);
     }
 
     @Override
-    public void verifyCreateConnection(String groupId, ConnectionDTO 
connectionDTO) {
+    public void verifyCreateConnection(final String groupId, final 
ConnectionDTO connectionDTO) {
         connectionDAO.verifyCreate(groupId, connectionDTO);
     }
 
     @Override
-    public void verifyUpdateConnection(ConnectionDTO connectionDTO) {
+    public void verifyUpdateConnection(final ConnectionDTO connectionDTO) {
         try {
             // if connection does not exist, then the update request is likely 
creating it
             // so we don't verify since it will fail
@@ -427,17 +429,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteConnection(String connectionId) {
+    public void verifyDeleteConnection(final String connectionId) {
         connectionDAO.verifyDelete(connectionId);
     }
 
     @Override
-    public void verifyDeleteFunnel(String funnelId) {
+    public void verifyDeleteFunnel(final String funnelId) {
         funnelDAO.verifyDelete(funnelId);
     }
 
     @Override
-    public void verifyUpdateInputPort(PortDTO inputPortDTO) {
+    public void verifyUpdateInputPort(final PortDTO inputPortDTO) {
         try {
             // if connection does not exist, then the update request is likely 
creating it
             // so we don't verify since it will fail
@@ -451,12 +453,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteInputPort(String inputPortId) {
+    public void verifyDeleteInputPort(final String inputPortId) {
         inputPortDAO.verifyDelete(inputPortId);
     }
 
     @Override
-    public void verifyUpdateOutputPort(PortDTO outputPortDTO) {
+    public void verifyUpdateOutputPort(final PortDTO outputPortDTO) {
         try {
             // if connection does not exist, then the update request is likely 
creating it
             // so we don't verify since it will fail
@@ -470,12 +472,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteOutputPort(String outputPortId) {
+    public void verifyDeleteOutputPort(final String outputPortId) {
         outputPortDAO.verifyDelete(outputPortId);
     }
 
     @Override
-    public void verifyUpdateProcessor(ProcessorDTO processorDTO) {
+    public void verifyUpdateProcessor(final ProcessorDTO processorDTO) {
         try {
             // if group does not exist, then the update request is likely 
creating it
             // so we don't verify since it will fail
@@ -489,12 +491,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteProcessor(String processorId) {
+    public void verifyDeleteProcessor(final String processorId) {
         processorDAO.verifyDelete(processorId);
     }
 
     @Override
-    public void verifyScheduleComponents(String groupId, ScheduledState state, 
Set<String> componentIds) {
+    public void verifyScheduleComponents(final String groupId, final 
ScheduledState state, final Set<String> componentIds) {
         try {
             processGroupDAO.verifyScheduleComponents(groupId, state, 
componentIds);
         } catch (final Exception e) {
@@ -504,12 +506,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteProcessGroup(String groupId) {
+    public void verifyDeleteProcessGroup(final String groupId) {
         processGroupDAO.verifyDelete(groupId);
     }
 
     @Override
-    public void verifyUpdateRemoteProcessGroup(RemoteProcessGroupDTO 
remoteProcessGroupDTO) {
+    public void verifyUpdateRemoteProcessGroup(final RemoteProcessGroupDTO 
remoteProcessGroupDTO) {
         try {
             // if remote group does not exist, then the update request is 
likely creating it
             // so we don't verify since it will fail
@@ -523,7 +525,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyUpdateRemoteProcessGroupInputPort(String 
remoteProcessGroupId, RemoteProcessGroupPortDTO remoteProcessGroupPortDTO) {
+    public void verifyUpdateRemoteProcessGroupInputPort(final String 
remoteProcessGroupId, final RemoteProcessGroupPortDTO 
remoteProcessGroupPortDTO) {
         try {
             remoteProcessGroupDAO.verifyUpdateInputPort(remoteProcessGroupId, 
remoteProcessGroupPortDTO);
         } catch (final Exception e) {
@@ -533,7 +535,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyUpdateRemoteProcessGroupOutputPort(String 
remoteProcessGroupId, RemoteProcessGroupPortDTO remoteProcessGroupPortDTO) {
+    public void verifyUpdateRemoteProcessGroupOutputPort(final String 
remoteProcessGroupId, final RemoteProcessGroupPortDTO 
remoteProcessGroupPortDTO) {
         try {
             remoteProcessGroupDAO.verifyUpdateOutputPort(remoteProcessGroupId, 
remoteProcessGroupPortDTO);
         } catch (final Exception e) {
@@ -543,12 +545,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteRemoteProcessGroup(String remoteProcessGroupId) {
+    public void verifyDeleteRemoteProcessGroup(final String 
remoteProcessGroupId) {
         remoteProcessGroupDAO.verifyDelete(remoteProcessGroupId);
     }
 
     @Override
-    public void verifyUpdateControllerService(ControllerServiceDTO 
controllerServiceDTO) {
+    public void verifyUpdateControllerService(final ControllerServiceDTO 
controllerServiceDTO) {
         try {
             // if service does not exist, then the update request is likely 
creating it
             // so we don't verify since it will fail
@@ -562,7 +564,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyUpdateControllerServiceReferencingComponents(String 
controllerServiceId, ScheduledState scheduledState, ControllerServiceState 
controllerServiceState) {
+    public void verifyUpdateControllerServiceReferencingComponents(final 
String controllerServiceId, final ScheduledState scheduledState, final 
ControllerServiceState controllerServiceState) {
         try {
             
controllerServiceDAO.verifyUpdateReferencingComponents(controllerServiceId, 
scheduledState, controllerServiceState);
         } catch (final Exception e) {
@@ -572,12 +574,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteControllerService(String controllerServiceId) {
+    public void verifyDeleteControllerService(final String 
controllerServiceId) {
         controllerServiceDAO.verifyDelete(controllerServiceId);
     }
 
     @Override
-    public void verifyUpdateReportingTask(ReportingTaskDTO reportingTaskDTO) {
+    public void verifyUpdateReportingTask(final ReportingTaskDTO 
reportingTaskDTO) {
         try {
             // if tasks does not exist, then the update request is likely 
creating it
             // so we don't verify since it will fail
@@ -591,7 +593,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteReportingTask(String reportingTaskId) {
+    public void verifyDeleteReportingTask(final String reportingTaskId) {
         reportingTaskDAO.verifyDelete(reportingTaskId);
     }
 
@@ -713,7 +715,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
 
     @Override
-    public void verifyUpdateSnippet(SnippetDTO snippetDto, final Set<String> 
affectedComponentIds) {
+    public void verifyUpdateSnippet(final SnippetDTO snippetDto, final 
Set<String> affectedComponentIds) {
         try {
             // if snippet does not exist, then the update request is likely 
creating it
             // so we don't verify since it will fail
@@ -752,7 +754,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     return new StandardRevisionUpdate<>(dto, null, 
updatedRevisions);
                 }
             });
-        } catch (ExpiredRevisionClaimException e) {
+        } catch (final ExpiredRevisionClaimException e) {
             throw new InvalidRevisionException("Failed to update Snippet", e);
         }
 
@@ -926,7 +928,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public NodeDTO updateNode(NodeDTO nodeDTO) {
+    public NodeDTO updateNode(final NodeDTO nodeDTO) {
         final NiFiUser user = NiFiUserUtils.getNiFiUser();
         if (user == null) {
             throw new WebApplicationException(new Throwable("Unable to access 
details for current user."));
@@ -950,7 +952,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public CounterDTO updateCounter(String counterId) {
+    public CounterDTO updateCounter(final String counterId) {
         return 
dtoFactory.createCounterDto(controllerFacade.resetCounter(counterId));
     }
 
@@ -1019,7 +1021,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public DropRequestDTO deleteFlowFileDropRequest(String connectionId, 
String dropRequestId) {
+    public DropRequestDTO deleteFlowFileDropRequest(final String connectionId, 
final String dropRequestId) {
         final Connection connection = 
connectionDAO.getConnection(connectionId);
         connection.authorize(authorizer, RequestAction.WRITE);
 
@@ -1027,7 +1029,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ListingRequestDTO deleteFlowFileListingRequest(String connectionId, 
String listingRequestId) {
+    public ListingRequestDTO deleteFlowFileListingRequest(final String 
connectionId, final String listingRequestId) {
         final Connection connection = 
connectionDAO.getConnection(connectionId);
         connection.authorize(authorizer, RequestAction.WRITE);
 
@@ -1108,7 +1110,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void verifyDeleteSnippet(String snippetId, Set<String> 
affectedComponentIds) {
+    public void verifyDeleteSnippet(final String snippetId, final Set<String> 
affectedComponentIds) {
         try {
             snippetDAO.verifyDeleteSnippetComponents(snippetId);
         } catch (final Exception e) {
@@ -1192,7 +1194,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void deleteTemplate(String id) {
+    public void deleteTemplate(final String id) {
         // create the template
         templateDAO.deleteTemplate(id);
     }
@@ -1211,14 +1213,14 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public DropRequestDTO createFlowFileDropRequest(String connectionId, 
String dropRequestId) {
+    public DropRequestDTO createFlowFileDropRequest(final String connectionId, 
final String dropRequestId) {
         final Connection connection = 
connectionDAO.getConnection(connectionId);
         connection.authorize(authorizer, RequestAction.WRITE);
         return 
dtoFactory.createDropRequestDTO(connectionDAO.createFlowFileDropRequest(connectionId,
 dropRequestId));
     }
 
     @Override
-    public ListingRequestDTO createFlowFileListingRequest(String connectionId, 
String listingRequestId) {
+    public ListingRequestDTO createFlowFileListingRequest(final String 
connectionId, final String listingRequestId) {
         final Connection connection = 
connectionDAO.getConnection(connectionId);
         connection.authorize(authorizer, RequestAction.WRITE);
 
@@ -1460,12 +1462,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public TemplateDTO createTemplate(String name, String description, String 
snippetId, String groupId, Optional<String> idGenerationSeed) {
+    public TemplateDTO createTemplate(final String name, final String 
description, final String snippetId, final String groupId, final 
Optional<String> idGenerationSeed) {
         // get the specified snippet
-        Snippet snippet = snippetDAO.getSnippet(snippetId);
+        final Snippet snippet = snippetDAO.getSnippet(snippetId);
 
         // create the template
-        TemplateDTO templateDTO = new TemplateDTO();
+        final TemplateDTO templateDTO = new TemplateDTO();
         templateDTO.setName(name);
         templateDTO.setDescription(description);
         templateDTO.setTimestamp(new Date());
@@ -1477,7 +1479,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         templateDTO.setId(uuid);
 
         // create the template
-        Template template = templateDAO.createTemplate(templateDTO, groupId);
+        final Template template = templateDAO.createTemplate(templateDTO, 
groupId);
 
         // drop the snippet
         snippetDAO.dropSnippet(snippetId);
@@ -1486,7 +1488,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public TemplateDTO importTemplate(TemplateDTO templateDTO, String groupId, 
Optional<String> idGenerationSeed) {
+    public TemplateDTO importTemplate(final TemplateDTO templateDTO, final 
String groupId, final Optional<String> idGenerationSeed) {
         // ensure id is set
         final String uuid = idGenerationSeed.isPresent() ? 
(UUID.nameUUIDFromBytes(idGenerationSeed.get().getBytes(StandardCharsets.UTF_8))).toString()
 : UUID.randomUUID().toString();
         templateDTO.setId(uuid);
@@ -1577,7 +1579,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ProcessGroupEntity createArchive() {
         try {
             controllerFacade.createArchive();
-        } catch (IOException e) {
+        } catch (final IOException e) {
             logger.error("Failed to create an archive", e);
         }
 
@@ -1624,27 +1626,39 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
     @Override
     public ControllerServiceEntity createControllerService(final String 
groupId, final ControllerServiceDTO controllerServiceDTO) {
-        // TODO - update once Controller Services can be scoped by Controller
-        final String normalizedGroupId = groupId == null ? 
controllerFacade.getRootGroupId() : groupId;
-        controllerServiceDTO.setParentGroupId(normalizedGroupId);
+        controllerServiceDTO.setParentGroupId(groupId);
 
-        final RevisionUpdate<ControllerServiceDTO> snapshot = createComponent(
-                controllerServiceDTO,
-                () -> {
-                    // create the controller service
+        final String modifier = NiFiUserUtils.getNiFiUserName();
+
+        // ensure id is set
+        if (StringUtils.isBlank(controllerServiceDTO.getId())) {
+            controllerServiceDTO.setId(UUID.randomUUID().toString());
+        }
+
+        final ControllerServiceDTO updatedService;
+        if (groupId == null) {
+            // Unfortunately, we can not use the createComponent() method here 
because createComponent() wants to obtain the read lock
+            // on the group. The Controller Service may or may not have a 
Process Group (it won't if it's controller-scoped).
+            final ControllerServiceNode controllerService = 
controllerServiceDAO.createControllerService(controllerServiceDTO);
+            updatedService = 
dtoFactory.createControllerServiceDto(controllerService);
+            controllerFacade.save();
+        } else {
+            updatedService = revisionManager.get(groupId, new 
ReadOnlyRevisionCallback<ControllerServiceDTO>() {
+                @Override
+                public ControllerServiceDTO withRevision(final Revision 
groupRevision) {
                     final ControllerServiceNode controllerService = 
controllerServiceDAO.createControllerService(controllerServiceDTO);
+                    controllerFacade.save();
+                    return 
dtoFactory.createControllerServiceDto(controllerService);
+                }
+            });
+        }
 
-                // TODO - this logic should be part of the controllerServiceDAO
-                final ProcessGroup group = 
processGroupDAO.getProcessGroup(normalizedGroupId);
-                group.addControllerService(controllerService);
-                return controllerService;
-            },
-            controllerService -> 
dtoFactory.createControllerServiceDto(controllerService));
+        final FlowModification lastMod = new FlowModification(new Revision(0L, 
null, controllerServiceDTO.getId()), modifier);
 
         final ControllerServiceNode controllerService = 
controllerServiceDAO.getControllerService(controllerServiceDTO.getId());
         final AccessPolicyDTO accessPolicy = 
dtoFactory.createAccessPolicyDto(controllerService);
         final List<BulletinDTO> bulletins = 
dtoFactory.createBulletinDtos(bulletinRepository.findBulletinsForSource(controllerServiceDTO.getId()));
-        return 
entityFactory.createControllerServiceEntity(snapshot.getComponent(), 
dtoFactory.createRevisionDTO(snapshot.getLastModification()), accessPolicy, 
bulletins);
+        return entityFactory.createControllerServiceEntity(updatedService, 
dtoFactory.createRevisionDTO(lastMod), accessPolicy, bulletins);
     }
 
     @Override
@@ -1888,19 +1902,19 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void deleteActions(Date endDate) {
+    public void deleteActions(final Date endDate) {
         // get the user from the request
-        NiFiUser user = NiFiUserUtils.getNiFiUser();
+        final NiFiUser user = NiFiUserUtils.getNiFiUser();
         if (user == null) {
             throw new WebApplicationException(new Throwable("Unable to access 
details for current user."));
         }
 
         // create the purge details
-        FlowChangePurgeDetails details = new FlowChangePurgeDetails();
+        final FlowChangePurgeDetails details = new FlowChangePurgeDetails();
         details.setEndDate(endDate);
 
         // create a purge action to record that records are being removed
-        FlowChangeAction purgeAction = new FlowChangeAction();
+        final FlowChangeAction purgeAction = new FlowChangeAction();
         purgeAction.setUserIdentity(user.getIdentity());
         purgeAction.setUserName(user.getUserName());
         purgeAction.setOperation(Operation.Purge);
@@ -1915,27 +1929,27 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ProvenanceDTO submitProvenance(ProvenanceDTO query) {
+    public ProvenanceDTO submitProvenance(final ProvenanceDTO query) {
         return controllerFacade.submitProvenance(query);
     }
 
     @Override
-    public void deleteProvenance(String queryId) {
+    public void deleteProvenance(final String queryId) {
         controllerFacade.deleteProvenanceQuery(queryId);
     }
 
     @Override
-    public LineageDTO submitLineage(LineageDTO lineage) {
+    public LineageDTO submitLineage(final LineageDTO lineage) {
         return controllerFacade.submitLineage(lineage);
     }
 
     @Override
-    public void deleteLineage(String lineageId) {
+    public void deleteLineage(final String lineageId) {
         controllerFacade.deleteLineage(lineageId);
     }
 
     @Override
-    public ProvenanceEventDTO submitReplay(Long eventId) {
+    public ProvenanceEventDTO submitReplay(final Long eventId) {
         return controllerFacade.submitReplay(eventId);
     }
 
@@ -1944,27 +1958,27 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     // -----------------------------------------
 
     @Override
-    public SearchResultsDTO searchController(String query) {
+    public SearchResultsDTO searchController(final String query) {
         return controllerFacade.search(query);
     }
 
     @Override
-    public DownloadableContent getContent(String connectionId, String 
flowFileUuid, String uri) {
+    public DownloadableContent getContent(final String connectionId, final 
String flowFileUuid, final String uri) {
         return connectionDAO.getContent(connectionId, flowFileUuid, uri);
     }
 
     @Override
-    public DownloadableContent getContent(Long eventId, String uri, 
ContentDirection contentDirection) {
+    public DownloadableContent getContent(final Long eventId, final String 
uri, final ContentDirection contentDirection) {
         return controllerFacade.getContent(eventId, uri, contentDirection);
     }
 
     @Override
-    public ProvenanceDTO getProvenance(String queryId) {
+    public ProvenanceDTO getProvenance(final String queryId) {
         return controllerFacade.getProvenanceQuery(queryId);
     }
 
     @Override
-    public LineageDTO getLineage(String lineageId) {
+    public LineageDTO getLineage(final String lineageId) {
         return controllerFacade.getLineage(lineageId);
     }
 
@@ -1979,7 +1993,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ProcessGroupStatusDTO getProcessGroupStatus(String groupId) {
+    public ProcessGroupStatusDTO getProcessGroupStatus(final String groupId) {
         return 
dtoFactory.createProcessGroupStatusDto(controllerFacade.getProcessGroupStatus(groupId));
     }
 
@@ -1989,10 +2003,10 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ComponentStateDTO getProcessorState(String processorId) {
+    public ComponentStateDTO getProcessorState(final String processorId) {
         return revisionManager.get(processorId, new 
ReadOnlyRevisionCallback<ComponentStateDTO>() {
             @Override
-            public ComponentStateDTO withRevision(Revision revision) {
+            public ComponentStateDTO withRevision(final Revision revision) {
                 final StateMap clusterState = isClustered() ? 
processorDAO.getState(processorId, Scope.CLUSTER) : null;
                 final StateMap localState = processorDAO.getState(processorId, 
Scope.LOCAL);
 
@@ -2004,10 +2018,10 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ComponentStateDTO getControllerServiceState(String 
controllerServiceId) {
+    public ComponentStateDTO getControllerServiceState(final String 
controllerServiceId) {
         return revisionManager.get(controllerServiceId, new 
ReadOnlyRevisionCallback<ComponentStateDTO>() {
             @Override
-            public ComponentStateDTO withRevision(Revision revision) {
+            public ComponentStateDTO withRevision(final Revision revision) {
                 final StateMap clusterState = isClustered() ? 
controllerServiceDAO.getState(controllerServiceId, Scope.CLUSTER) : null;
                 final StateMap localState = 
controllerServiceDAO.getState(controllerServiceId, Scope.LOCAL);
 
@@ -2019,10 +2033,10 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ComponentStateDTO getReportingTaskState(String reportingTaskId) {
+    public ComponentStateDTO getReportingTaskState(final String 
reportingTaskId) {
         return revisionManager.get(reportingTaskId, new 
ReadOnlyRevisionCallback<ComponentStateDTO>() {
             @Override
-            public ComponentStateDTO withRevision(Revision revision) {
+            public ComponentStateDTO withRevision(final Revision revision) {
                 final StateMap clusterState = isClustered() ? 
reportingTaskDAO.getState(reportingTaskId, Scope.CLUSTER) : null;
                 final StateMap localState = 
reportingTaskDAO.getState(reportingTaskId, Scope.LOCAL);
 
@@ -2035,9 +2049,9 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
     @Override
     public CountersDTO getCounters() {
-        List<Counter> counters = controllerFacade.getCounters();
-        Set<CounterDTO> counterDTOs = new LinkedHashSet<>(counters.size());
-        for (Counter counter : counters) {
+        final List<Counter> counters = controllerFacade.getCounters();
+        final Set<CounterDTO> counterDTOs = new 
LinkedHashSet<>(counters.size());
+        for (final Counter counter : counters) {
             counterDTOs.add(dtoFactory.createCounterDto(counter));
         }
 
@@ -2049,7 +2063,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public Set<ConnectionEntity> getConnections(String groupId) {
+    public Set<ConnectionEntity> getConnections(final String groupId) {
         return revisionManager.get(groupId, rev -> {
             final ProcessGroup group = 
processGroupDAO.getProcessGroup(groupId);
             group.authorize(authorizer, RequestAction.READ);
@@ -2070,7 +2084,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ConnectionEntity getConnection(String connectionId) {
+    public ConnectionEntity getConnection(final String connectionId) {
         return revisionManager.get(connectionId, rev -> {
             final Connection connection = 
connectionDAO.getConnection(connectionId);
             connection.authorize(authorizer, RequestAction.READ);
@@ -2083,14 +2097,14 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public DropRequestDTO getFlowFileDropRequest(String connectionId, String 
dropRequestId) {
+    public DropRequestDTO getFlowFileDropRequest(final String connectionId, 
final String dropRequestId) {
         final Connection connection = 
connectionDAO.getConnection(connectionId);
         connection.authorize(authorizer, RequestAction.WRITE);
         return 
dtoFactory.createDropRequestDTO(connectionDAO.getFlowFileDropRequest(connectionId,
 dropRequestId));
     }
 
     @Override
-    public ListingRequestDTO getFlowFileListingRequest(String connectionId, 
String listingRequestId) {
+    public ListingRequestDTO getFlowFileListingRequest(final String 
connectionId, final String listingRequestId) {
         final Connection connection = 
connectionDAO.getConnection(connectionId);
         connection.authorize(authorizer, RequestAction.WRITE);
 
@@ -2108,22 +2122,22 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public FlowFileDTO getFlowFile(String connectionId, String flowFileUuid) {
+    public FlowFileDTO getFlowFile(final String connectionId, final String 
flowFileUuid) {
         return 
dtoFactory.createFlowFileDTO(connectionDAO.getFlowFile(connectionId, 
flowFileUuid));
     }
 
     @Override
-    public ConnectionStatusDTO getConnectionStatus(String connectionId) {
+    public ConnectionStatusDTO getConnectionStatus(final String connectionId) {
         return revisionManager.get(connectionId, rev -> 
dtoFactory.createConnectionStatusDto(controllerFacade.getConnectionStatus(connectionId)));
     }
 
     @Override
-    public StatusHistoryDTO getConnectionStatusHistory(String connectionId) {
+    public StatusHistoryDTO getConnectionStatusHistory(final String 
connectionId) {
         return revisionManager.get(connectionId, rev -> 
controllerFacade.getConnectionStatusHistory(connectionId));
     }
 
     @Override
-    public Set<ProcessorEntity> getProcessors(String groupId) {
+    public Set<ProcessorEntity> getProcessors(final String groupId) {
         final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
         group.authorize(authorizer, RequestAction.READ);
 
@@ -2144,24 +2158,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public TemplateDTO exportTemplate(String id) {
-        Template template = templateDAO.getTemplate(id);
-        TemplateDTO templateDetails = template.getDetails();
+    public TemplateDTO exportTemplate(final String id) {
+        final Template template = templateDAO.getTemplate(id);
+        final TemplateDTO templateDetails = template.getDetails();
 
-        TemplateDTO templateDTO = dtoFactory.createTemplateDTO(template);
+        final TemplateDTO templateDTO = dtoFactory.createTemplateDTO(template);
         
templateDTO.setSnippet(dtoFactory.copySnippetContents(templateDetails.getSnippet()));
         return templateDTO;
     }
 
     @Override
-    public TemplateDTO getTemplate(String id) {
+    public TemplateDTO getTemplate(final String id) {
         return dtoFactory.createTemplateDTO(templateDAO.getTemplate(id));
     }
 
     @Override
     public Set<TemplateDTO> getTemplates() {
-        Set<TemplateDTO> templateDtos = new LinkedHashSet<>();
-        for (Template template : templateDAO.getTemplates()) {
+        final Set<TemplateDTO> templateDtos = new LinkedHashSet<>();
+        for (final Template template : templateDAO.getTemplates()) {
             templateDtos.add(dtoFactory.createTemplateDTO(template));
         }
         return templateDtos;
@@ -2188,7 +2202,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ProcessorEntity getProcessor(String id) {
+    public ProcessorEntity getProcessor(final String id) {
         return revisionManager.get(id, rev -> {
             final ProcessorNode processor = processorDAO.getProcessor(id);
             processor.authorize(authorizer, RequestAction.READ);
@@ -2201,7 +2215,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public PropertyDescriptorDTO getProcessorPropertyDescriptor(String id, 
String property) {
+    public PropertyDescriptorDTO getProcessorPropertyDescriptor(final String 
id, final String property) {
         final ProcessorNode processor = processorDAO.getProcessor(id);
         PropertyDescriptor descriptor = 
processor.getPropertyDescriptor(property);
 
@@ -2214,17 +2228,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ProcessorStatusDTO getProcessorStatus(String id) {
+    public ProcessorStatusDTO getProcessorStatus(final String id) {
         return revisionManager.get(id, rev -> 
dtoFactory.createProcessorStatusDto(controllerFacade.getProcessorStatus(id)));
     }
 
     @Override
-    public StatusHistoryDTO getProcessorStatusHistory(String id) {
+    public StatusHistoryDTO getProcessorStatusHistory(final String id) {
         return controllerFacade.getProcessorStatusHistory(id);
     }
 
     @Override
-    public BulletinBoardDTO getBulletinBoard(BulletinQueryDTO query) {
+    public BulletinBoardDTO getBulletinBoard(final BulletinQueryDTO query) {
         // build the query
         final BulletinQuery.Builder queryBuilder = new BulletinQuery.Builder()
                 .groupIdMatches(query.getGroupId())
@@ -2246,7 +2260,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         }
 
         // create the bulletin board
-        BulletinBoardDTO bulletinBoard = new BulletinBoardDTO();
+        final BulletinBoardDTO bulletinBoard = new BulletinBoardDTO();
         bulletinBoard.setBulletins(bulletins);
         bulletinBoard.setGenerated(new Date());
         return bulletinBoard;
@@ -2299,7 +2313,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         final Set<RootGroupPort> inputPorts = controllerFacade.getInputPorts();
         final Set<String> inputPortIds = inputPorts.stream().map(port -> 
port.getIdentifier()).collect(Collectors.toSet());
         revisionManager.get(inputPortIds, () -> {
-            for (RootGroupPort inputPort : inputPorts) {
+            for (final RootGroupPort inputPort : inputPorts) {
                 if (isUserAuthorized(user, inputPort)) {
                     final PortDTO dto = new PortDTO();
                     dto.setId(inputPort.getIdentifier());
@@ -2317,7 +2331,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         final Set<RootGroupPort> outputPorts = 
controllerFacade.getOutputPorts();
         final Set<String> outputPortIds = outputPorts.stream().map(port -> 
port.getIdentifier()).collect(Collectors.toSet());
         revisionManager.get(outputPortIds, () -> {
-            for (RootGroupPort outputPort : controllerFacade.getOutputPorts()) 
{
+            for (final RootGroupPort outputPort : 
controllerFacade.getOutputPorts()) {
                 if (isUserAuthorized(user, outputPort)) {
                     final PortDTO dto = new PortDTO();
                     dto.setId(outputPort.getIdentifier());
@@ -2376,7 +2390,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public Set<LabelEntity> getLabels(String groupId) {
+    public Set<LabelEntity> getLabels(final String groupId) {
         final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
         group.authorize(authorizer, RequestAction.READ);
 
@@ -2394,7 +2408,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public LabelEntity getLabel(String labelId) {
+    public LabelEntity getLabel(final String labelId) {
         return revisionManager.get(labelId, rev -> {
             final Label label = labelDAO.getLabel(labelId);
             label.authorize(authorizer, RequestAction.READ);
@@ -2406,7 +2420,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public Set<FunnelEntity> getFunnels(String groupId) {
+    public Set<FunnelEntity> getFunnels(final String groupId) {
         final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
         group.authorize(authorizer, RequestAction.READ);
 
@@ -2424,7 +2438,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public FunnelEntity getFunnel(String funnelId) {
+    public FunnelEntity getFunnel(final String funnelId) {
         return revisionManager.get(funnelId, rev -> {
             final Funnel funnel = funnelDAO.getFunnel(funnelId);
             funnel.authorize(authorizer, RequestAction.READ);
@@ -2436,7 +2450,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public Set<PortEntity> getInputPorts(String groupId) {
+    public Set<PortEntity> getInputPorts(final String groupId) {
         final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
         group.authorize(authorizer, RequestAction.READ);
 
@@ -2456,7 +2470,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public Set<PortEntity> getOutputPorts(String groupId) {
+    public Set<PortEntity> getOutputPorts(final String groupId) {
         final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
         group.authorize(authorizer, RequestAction.READ);
 
@@ -2477,7 +2491,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public Set<ProcessGroupEntity> getProcessGroups(String parentGroupId) {
+    public Set<ProcessGroupEntity> getProcessGroups(final String 
parentGroupId) {
         final ProcessGroup parentGroup = 
processGroupDAO.getProcessGroup(parentGroupId);
         parentGroup.authorize(authorizer, RequestAction.READ);
 
@@ -2497,7 +2511,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public Set<RemoteProcessGroupEntity> getRemoteProcessGroups(String 
groupId) {
+    public Set<RemoteProcessGroupEntity> getRemoteProcessGroups(final String 
groupId) {
         final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
         group.authorize(authorizer, RequestAction.READ);
 
@@ -2518,7 +2532,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public PortEntity getInputPort(String inputPortId) {
+    public PortEntity getInputPort(final String inputPortId) {
         return revisionManager.get(inputPortId, rev -> {
             final Port port = inputPortDAO.getPort(inputPortId);
             port.authorize(authorizer, RequestAction.READ);
@@ -2532,12 +2546,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public PortStatusDTO getInputPortStatus(String inputPortId) {
+    public PortStatusDTO getInputPortStatus(final String inputPortId) {
         return revisionManager.get(inputPortId, rev -> 
dtoFactory.createPortStatusDto(controllerFacade.getInputPortStatus(inputPortId)));
     }
 
     @Override
-    public PortEntity getOutputPort(String outputPortId) {
+    public PortEntity getOutputPort(final String outputPortId) {
         return revisionManager.get(outputPortId, rev -> {
             final Port port = outputPortDAO.getPort(outputPortId);
             port.authorize(authorizer, RequestAction.READ);
@@ -2551,12 +2565,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public PortStatusDTO getOutputPortStatus(String outputPortId) {
+    public PortStatusDTO getOutputPortStatus(final String outputPortId) {
         return revisionManager.get(outputPortId, rev -> 
dtoFactory.createPortStatusDto(controllerFacade.getInputPortStatus(outputPortId)));
     }
 
     @Override
-    public RemoteProcessGroupEntity getRemoteProcessGroup(String 
remoteProcessGroupId) {
+    public RemoteProcessGroupEntity getRemoteProcessGroup(final String 
remoteProcessGroupId) {
         return revisionManager.get(remoteProcessGroupId, rev -> {
             final RemoteProcessGroup rpg = 
remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupId);
             rpg.authorize(authorizer, RequestAction.READ);
@@ -2570,17 +2584,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public RemoteProcessGroupStatusDTO getRemoteProcessGroupStatus(String id) {
+    public RemoteProcessGroupStatusDTO getRemoteProcessGroupStatus(final 
String id) {
         return revisionManager.get(id, rev -> 
dtoFactory.createRemoteProcessGroupStatusDto(controllerFacade.getRemoteProcessGroupStatus(id)));
     }
 
     @Override
-    public StatusHistoryDTO getRemoteProcessGroupStatusHistory(String id) {
+    public StatusHistoryDTO getRemoteProcessGroupStatusHistory(final String 
id) {
         return controllerFacade.getRemoteProcessGroupStatusHistory(id);
     }
 
     @Override
-    public ProcessGroupFlowEntity getProcessGroupFlow(String groupId, boolean 
recurse) {
+    public ProcessGroupFlowEntity getProcessGroupFlow(final String groupId, 
final boolean recurse) {
         return revisionManager.get(groupId,
                 rev -> {
                     // get all identifiers for every child component
@@ -2624,7 +2638,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ProcessGroupEntity getProcessGroup(String groupId) {
+    public ProcessGroupEntity getProcessGroup(final String groupId) {
         return revisionManager.get(groupId, rev -> {
             final ProcessGroup processGroup = 
processGroupDAO.getProcessGroup(groupId);
             processGroup.authorize(authorizer, RequestAction.READ);
@@ -2638,21 +2652,9 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public Set<ControllerServiceEntity> getControllerServices(String groupId) {
-        // TODO - move this logic into the ControllerServiceDAO
-
-        final Set<ControllerServiceNode> serviceNodes;
-        final Set<String> serviceIds;
-        if (groupId == null) {
-            // TODO - update when controller services are scoped by the 
controller
-            final ProcessGroup group = 
processGroupDAO.getProcessGroup(controllerFacade.getRootGroupId());
-            serviceNodes = group.getControllerServices(true);
-            serviceIds = serviceNodes.stream().map(service -> 
service.getIdentifier()).collect(Collectors.toSet());
-        } else {
-            final ProcessGroup group = 
processGroupDAO.getProcessGroup(groupId);
-            serviceNodes = group.getControllerServices(true);
-            serviceIds = serviceNodes.stream().map(service -> 
service.getIdentifier()).collect(Collectors.toSet());
-        }
+    public Set<ControllerServiceEntity> getControllerServices(final String 
groupId) {
+        final Set<ControllerServiceNode> serviceNodes = 
controllerServiceDAO.getControllerServices(groupId);
+        final Set<String> serviceIds = serviceNodes.stream().map(service -> 
service.getIdentifier()).collect(Collectors.toSet());
 
         return revisionManager.get(serviceIds, () -> {
             return serviceNodes.stream()
@@ -2673,7 +2675,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ControllerServiceEntity getControllerService(String 
controllerServiceId) {
+    public ControllerServiceEntity getControllerService(final String 
controllerServiceId) {
         return revisionManager.get(controllerServiceId, rev -> {
             final ControllerServiceNode controllerService = 
controllerServiceDAO.getControllerService(controllerServiceId);
             controllerService.authorize(authorizer, RequestAction.READ);
@@ -2693,7 +2695,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public PropertyDescriptorDTO getControllerServicePropertyDescriptor(String 
id, String property) {
+    public PropertyDescriptorDTO getControllerServicePropertyDescriptor(final 
String id, final String property) {
         return revisionManager.get(id, rev -> {
             final ControllerServiceNode controllerService = 
controllerServiceDAO.getControllerService(id);
             PropertyDescriptor descriptor = 
controllerService.getControllerServiceImplementation().getPropertyDescriptor(property);
@@ -2708,7 +2710,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ControllerServiceReferencingComponentsEntity 
getControllerServiceReferencingComponents(String controllerServiceId) {
+    public ControllerServiceReferencingComponentsEntity 
getControllerServiceReferencingComponents(final String controllerServiceId) {
         return revisionManager.get(controllerServiceId, rev -> {
             final ControllerServiceNode service = 
controllerServiceDAO.getControllerService(controllerServiceId);
             final ControllerServiceReference ref = service.getReferences();
@@ -2734,7 +2736,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ReportingTaskEntity getReportingTask(String reportingTaskId) {
+    public ReportingTaskEntity getReportingTask(final String reportingTaskId) {
         return revisionManager.get(reportingTaskId, rev -> {
             final ReportingTaskNode reportingTask = 
reportingTaskDAO.getReportingTask(reportingTaskId);
             reportingTask.authorize(authorizer, RequestAction.READ);
@@ -2747,7 +2749,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public PropertyDescriptorDTO getReportingTaskPropertyDescriptor(String id, 
String property) {
+    public PropertyDescriptorDTO getReportingTaskPropertyDescriptor(final 
String id, final String property) {
         final ReportingTaskNode reportingTask = 
reportingTaskDAO.getReportingTask(id);
         PropertyDescriptor descriptor = 
reportingTask.getReportingTask().getPropertyDescriptor(property);
 
@@ -2760,14 +2762,14 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public StatusHistoryDTO getProcessGroupStatusHistory(String groupId) {
+    public StatusHistoryDTO getProcessGroupStatusHistory(final String groupId) 
{
         return controllerFacade.getProcessGroupStatusHistory(groupId);
     }
 
     @Override
-    public HistoryDTO getActions(HistoryQueryDTO historyQueryDto) {
+    public HistoryDTO getActions(final HistoryQueryDTO historyQueryDto) {
         // extract the query criteria
-        HistoryQuery historyQuery = new HistoryQuery();
+        final HistoryQuery historyQuery = new HistoryQuery();
         historyQuery.setStartDate(historyQueryDto.getStartDate());
         historyQuery.setEndDate(historyQueryDto.getEndDate());
         historyQuery.setSourceId(historyQueryDto.getSourceId());
@@ -2778,16 +2780,16 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         historyQuery.setSortOrder(historyQueryDto.getSortOrder());
 
         // perform the query
-        History history = auditService.getActions(historyQuery);
+        final History history = auditService.getActions(historyQuery);
 
         // create the response
         return dtoFactory.createHistoryDto(history);
     }
 
     @Override
-    public ActionDTO getAction(Integer actionId) {
+    public ActionDTO getAction(final Integer actionId) {
         // get the action
-        Action action = auditService.getAction(actionId);
+        final Action action = auditService.getAction(actionId);
 
         // ensure the action was found
         if (action == null) {
@@ -2799,7 +2801,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public ComponentHistoryDTO getComponentHistory(String componentId) {
+    public ComponentHistoryDTO getComponentHistory(final String componentId) {
         final Map<String, PropertyHistoryDTO> propertyHistoryDtos = new 
LinkedHashMap<>();
         final Map<String, List<PreviousValue>> propertyHistory = 
auditService.getPreviousValues(componentId);
 
@@ -2871,12 +2873,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public NodeDTO getNode(String nodeId) {
+    public NodeDTO getNode(final String nodeId) {
         final NodeIdentifier nodeIdentifier = 
clusterCoordinator.getNodeIdentifier(nodeId);
         return getNode(nodeIdentifier);
     }
 
-    private NodeDTO getNode(NodeIdentifier nodeId) {
+    private NodeDTO getNode(final NodeIdentifier nodeId) {
         final NodeConnectionStatus nodeStatus = 
clusterCoordinator.getConnectionStatus(nodeId);
         final List<NodeEvent> events = 
clusterCoordinator.getNodeEvents(nodeId);
         final boolean primary = 
nodeId.equals(clusterCoordinator.getPrimaryNode());
@@ -2885,7 +2887,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     @Override
-    public void deleteNode(String nodeId) {
+    public void deleteNode(final String nodeId) {
         final NiFiUser user = NiFiUserUtils.getNiFiUser();
         if (user == null) {
             throw new WebApplicationException(new Throwable("Unable to access 
details for current user."));
@@ -2902,95 +2904,95 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     }
 
     /* setters */
-    public void setProperties(NiFiProperties properties) {
+    public void setProperties(final NiFiProperties properties) {
         this.properties = properties;
     }
 
-    public void setControllerFacade(ControllerFacade controllerFacade) {
+    public void setControllerFacade(final ControllerFacade controllerFacade) {
         this.controllerFacade = controllerFacade;
     }
 
-    public void setRemoteProcessGroupDAO(RemoteProcessGroupDAO 
remoteProcessGroupDAO) {
+    public void setRemoteProcessGroupDAO(final RemoteProcessGroupDAO 
remoteProcessGroupDAO) {
         this.remoteProcessGroupDAO = remoteProcessGroupDAO;
     }
 
-    public void setLabelDAO(LabelDAO labelDAO) {
+    public void setLabelDAO(final LabelDAO labelDAO) {
         this.labelDAO = labelDAO;
     }
 
-    public void setFunnelDAO(FunnelDAO funnelDAO) {
+    public void setFunnelDAO(final FunnelDAO funnelDAO) {
         this.funnelDAO = funnelDAO;
     }
 
-    public void setSnippetDAO(SnippetDAO snippetDAO) {
+    public void setSnippetDAO(final SnippetDAO snippetDAO) {
         this.snippetDAO = snippetDAO;
     }
 
-    public void setProcessorDAO(ProcessorDAO processorDAO) {
+    public void setProcessorDAO(final ProcessorDAO processorDAO) {
         this.processorDAO = processorDAO;
     }
 
-    public void setConnectionDAO(ConnectionDAO connectionDAO) {
+    public void setConnectionDAO(final ConnectionDAO connectionDAO) {
         this.connectionDAO = connectionDAO;
     }
 
-    public void setAuditService(AuditService auditService) {
+    public void setAuditService(final AuditService auditService) {
         this.auditService = auditService;
     }
 
-    public void setKeyService(KeyService keyService) {
+    public void setKeyService(final KeyService keyService) {
         this.keyService = keyService;
     }
 
-    public void setRevisionManager(RevisionManager revisionManager) {
+    public void setRevisionManager(final RevisionManager revisionManager) {
         this.revisionManager = revisionManager;
     }
 
-    public void setDtoFactory(DtoFactory dtoFactory) {
+    public void setDtoFactory(final DtoFactory dtoFactory) {
         this.dtoFactory = dtoFactory;
     }
 
-    public void setEntityFactory(EntityFactory entityFactory) {
+    public void setEntityFactory(final EntityFactory entityFactory) {
         this.entityFactory = entityFactory;
     }
 
-    public void setInputPortDAO(PortDAO inputPortDAO) {
+    public void setInputPortDAO(final PortDAO inputPortDAO) {
         this.inputPortDAO = inputPortDAO;
     }
 
-    public void setOutputPortDAO(PortDAO outputPortDAO) {
+    public void setOutputPortDAO(final PortDAO outputPortDAO) {
         this.outputPortDAO = outputPortDAO;
     }
 
-    public void setProcessGroupDAO(ProcessGroupDAO processGroupDAO) {
+    public void setProcessGroupDAO(final ProcessGroupDAO processGroupDAO) {
         this.processGroupDAO = processGroupDAO;
     }
 
-    public void setControllerServiceDAO(ControllerServiceDAO 
controllerServiceDAO) {
+    public void setControllerServiceDAO(final ControllerServiceDAO 
controllerServiceDAO) {
         this.controllerServiceDAO = controllerServiceDAO;
     }
 
-    public void setReportingTaskDAO(ReportingTaskDAO reportingTaskDAO) {
+    public void setReportingTaskDAO(final ReportingTaskDAO reportingTaskDAO) {
         this.reportingTaskDAO = reportingTaskDAO;
     }
 
-    public void setTemplateDAO(TemplateDAO templateDAO) {
+    public void setTemplateDAO(final TemplateDAO templateDAO) {
         this.templateDAO = templateDAO;
     }
 
-    public void setSnippetUtils(SnippetUtils snippetUtils) {
+    public void setSnippetUtils(final SnippetUtils snippetUtils) {
         this.snippetUtils = snippetUtils;
     }
 
-    public void setAuthorizer(Authorizer authorizer) {
+    public void setAuthorizer(final Authorizer authorizer) {
         this.authorizer = authorizer;
     }
 
-    public void setClusterCoordinator(ClusterCoordinator coordinator) {
+    public void setClusterCoordinator(final ClusterCoordinator coordinator) {
         this.clusterCoordinator = coordinator;
     }
 
-    public void setHeartbeatMonitor(HeartbeatMonitor heartbeatMonitor) {
+    public void setHeartbeatMonitor(final HeartbeatMonitor heartbeatMonitor) {
         this.heartbeatMonitor = heartbeatMonitor;
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/c955ec16/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
index d396b35..6bcdf61 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
@@ -16,22 +16,7 @@
  */
 package org.apache.nifi.web;
 
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Objects;
-
-import javax.ws.rs.HttpMethod;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-
+import com.sun.jersey.core.util.MultivaluedMapImpl;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.nifi.action.Action;
 import org.apache.nifi.action.Component;
@@ -56,8 +41,8 @@ import 
org.apache.nifi.cluster.coordination.http.replication.RequestReplicator;
 import org.apache.nifi.cluster.manager.NodeResponse;
 import org.apache.nifi.cluster.manager.exception.IllegalClusterStateException;
 import org.apache.nifi.controller.ControllerService;
-import org.apache.nifi.controller.ControllerServiceLookup;
 import org.apache.nifi.controller.reporting.ReportingTaskProvider;
+import org.apache.nifi.controller.service.ControllerServiceProvider;
 import org.apache.nifi.util.NiFiProperties;
 import org.apache.nifi.web.api.dto.ControllerServiceDTO;
 import org.apache.nifi.web.api.dto.ProcessorConfigDTO;
@@ -74,7 +59,20 @@ import org.slf4j.LoggerFactory;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 
-import com.sun.jersey.core.util.MultivaluedMapImpl;
+import javax.ws.rs.HttpMethod;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * Implements the NiFiWebConfigurationContext interface to support a context 
in both standalone and clustered environments.
@@ -88,7 +86,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
     private NiFiServiceFacade serviceFacade;
     private ClusterCoordinator clusterCoordinator;
     private RequestReplicator requestReplicator;
-    private ControllerServiceLookup controllerServiceLookup;
+    private ControllerServiceProvider controllerServiceProvider;
     private ReportingTaskProvider reportingTaskProvider;
     private AuditService auditService;
     private Authorizer authorizer;
@@ -113,10 +111,10 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
     }
 
     @Override
-    public ControllerService getControllerService(String serviceIdentifier) {
+    public ControllerService getControllerService(final String 
serviceIdentifier, final String componentId) {
         final NiFiUser user = NiFiUserUtils.getNiFiUser();
         authorizeFlowAccess(user);
-        return controllerServiceLookup.getControllerService(serviceIdentifier);
+        return 
controllerServiceProvider.getControllerServiceForComponent(serviceIdentifier, 
componentId);
     }
 
     @Override
@@ -193,7 +191,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
             try {
                 // record the operations
                 auditService.addActions(actions);
-            } catch (Throwable t) {
+            } catch (final Throwable t) {
                 logger.warn("Unable to record actions: " + t.getMessage());
                 if (logger.isDebugEnabled()) {
                     logger.warn(StringUtils.EMPTY, t);
@@ -329,21 +327,21 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 // create the request URL
                 URI requestUrl;
                 try {
-                    String path = "/nifi-api/processors/" + 
URLEncoder.encode(id, "UTF-8");
+                    final String path = "/nifi-api/processors/" + 
URLEncoder.encode(id, "UTF-8");
                     requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
                 } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
                     throw new ClusterRequestException(use);
                 }
 
                 // set the request parameters
-                MultivaluedMap<String, String> parameters = new 
MultivaluedMapImpl();
+                final MultivaluedMap<String, String> parameters = new 
MultivaluedMapImpl();
                 parameters.add(VERBOSE_PARAM, "true");
 
                 // replicate request
                 NodeResponse nodeResponse;
                 try {
                     nodeResponse = requestReplicator.replicate(HttpMethod.GET, 
requestUrl, parameters, getHeaders(requestContext)).awaitMergedResponse();
-                } catch (InterruptedException e) {
+                } catch (final InterruptedException e) {
                     throw new IllegalClusterStateException("Request was 
interrupted while waiting for response from node");
                 }
 
@@ -381,28 +379,28 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 // create the request URL
                 URI requestUrl;
                 try {
-                    String path = "/nifi-api/processors/" + 
URLEncoder.encode(id, "UTF-8");
+                    final String path = "/nifi-api/processors/" + 
URLEncoder.encode(id, "UTF-8");
                     requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
                 } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
                     throw new ClusterRequestException(use);
                 }
 
                 // create the revision
-                RevisionDTO revisionDto = new RevisionDTO();
+                final RevisionDTO revisionDto = new RevisionDTO();
                 revisionDto.setClientId(revision.getClientId());
                 revisionDto.setVersion(revision.getVersion());
 
                 // create the processor entity
-                ProcessorEntity processorEntity = new ProcessorEntity();
+                final ProcessorEntity processorEntity = new ProcessorEntity();
                 processorEntity.setRevision(revisionDto);
 
                 // create the processor dto
-                ProcessorDTO processorDto = new ProcessorDTO();
+                final ProcessorDTO processorDto = new ProcessorDTO();
                 processorEntity.setComponent(processorDto);
                 processorDto.setId(id);
 
                 // create the processor configuration with the given 
annotation data
-                ProcessorConfigDTO configDto = new ProcessorConfigDTO();
+                final ProcessorConfigDTO configDto = new ProcessorConfigDTO();
                 processorDto.setConfig(configDto);
                 configDto.setAnnotationData(annotationData);
 
@@ -414,7 +412,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
                 NodeResponse nodeResponse;
                 try {
                     nodeResponse = requestReplicator.replicate(HttpMethod.PUT, 
requestUrl, processorEntity, headers).awaitMergedResponse();
-                } catch (InterruptedException e) {
+                } catch (final InterruptedException e) {
                     throw new IllegalClusterStateException("Request was 
interrupted while waiting for response from node");
                 }
 
@@ -474,7 +472,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
 
             // if the lookup has the service that means we are either a node or
             // the ncm and the service is available there only
-            if (controllerServiceLookup.getControllerService(id) != null) {
+            if (controllerServiceProvider.getControllerService(id) != null) {
                 controllerService = 
serviceFacade.getControllerService(id).getComponent();
             } else {
                 // if this is a standalone instance the service should have 
been found above... there should
@@ -486,20 +484,20 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 // create the request URL
                 URI requestUrl;
                 try {
-                    String path = "/nifi-api/controller-services/node/" + 
URLEncoder.encode(id, "UTF-8");
+                    final String path = "/nifi-api/controller-services/node/" 
+ URLEncoder.encode(id, "UTF-8");
                     requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
                 } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
                     throw new ClusterRequestException(use);
                 }
 
                 // set the request parameters
-                MultivaluedMap<String, String> parameters = new 
MultivaluedMapImpl();
+                final MultivaluedMap<String, String> parameters = new 
MultivaluedMapImpl();
 
                 // replicate request
                 NodeResponse nodeResponse;
                 try {
                     nodeResponse = requestReplicator.replicate(HttpMethod.GET, 
requestUrl, parameters, getHeaders(requestContext)).awaitMergedResponse();
-                } catch (InterruptedException e) {
+                } catch (final InterruptedException e) {
                     throw new IllegalClusterStateException("Request was 
interrupted while waiting for response from node");
                 }
 
@@ -531,7 +529,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
             });
 
             final ControllerServiceDTO controllerService;
-            if (controllerServiceLookup.getControllerService(id) != null) {
+            if (controllerServiceProvider.getControllerService(id) != null) {
                 final ControllerServiceDTO controllerServiceDto = new 
ControllerServiceDTO();
                 controllerServiceDto.setId(id);
                 controllerServiceDto.setAnnotationData(annotationData);
@@ -562,23 +560,23 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 // create the request URL
                 URI requestUrl;
                 try {
-                    String path = "/nifi-api/controller-services/node/" + 
URLEncoder.encode(id, "UTF-8");
+                    final String path = "/nifi-api/controller-services/node/" 
+ URLEncoder.encode(id, "UTF-8");
                     requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
                 } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
                     throw new ClusterRequestException(use);
                 }
 
                 // create the revision
-                RevisionDTO revisionDto = new RevisionDTO();
+                final RevisionDTO revisionDto = new RevisionDTO();
                 revisionDto.setClientId(revision.getClientId());
                 revisionDto.setVersion(revision.getVersion());
 
                 // create the controller service entity
-                ControllerServiceEntity controllerServiceEntity = new 
ControllerServiceEntity();
+                final ControllerServiceEntity controllerServiceEntity = new 
ControllerServiceEntity();
                 controllerServiceEntity.setRevision(revisionDto);
 
                 // create the controller service dto
-                ControllerServiceDTO controllerServiceDto = new 
ControllerServiceDTO();
+                final ControllerServiceDTO controllerServiceDto = new 
ControllerServiceDTO();
                 controllerServiceEntity.setComponent(controllerServiceDto);
                 controllerServiceDto.setId(id);
                 controllerServiceDto.setAnnotationData(annotationData);
@@ -591,7 +589,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
                 NodeResponse nodeResponse;
                 try {
                     nodeResponse = requestReplicator.replicate(HttpMethod.PUT, 
requestUrl, controllerServiceEntity, headers).awaitMergedResponse();
-                } catch (InterruptedException e) {
+                } catch (final InterruptedException e) {
                     throw new IllegalClusterStateException("Request was 
interrupted while waiting for response from node");
                 }
 
@@ -652,20 +650,20 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 // create the request URL
                 URI requestUrl;
                 try {
-                    String path = "/nifi-api/reporting-tasks/node/" + 
URLEncoder.encode(id, "UTF-8");
+                    final String path = "/nifi-api/reporting-tasks/node/" + 
URLEncoder.encode(id, "UTF-8");
                     requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
                 } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
                     throw new ClusterRequestException(use);
                 }
 
                 // set the request parameters
-                MultivaluedMap<String, String> parameters = new 
MultivaluedMapImpl();
+                final MultivaluedMap<String, String> parameters = new 
MultivaluedMapImpl();
 
                 // replicate request
                 NodeResponse nodeResponse;
                 try {
                     nodeResponse = requestReplicator.replicate(HttpMethod.GET, 
requestUrl, parameters, getHeaders(requestContext)).awaitMergedResponse();
-                } catch (InterruptedException e) {
+                } catch (final InterruptedException e) {
                     throw new IllegalClusterStateException("Request was 
interrupted while waiting for response from node");
                 }
 
@@ -727,23 +725,23 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 // create the request URL
                 URI requestUrl;
                 try {
-                    String path = "/nifi-api/reporting-tasks/node/" + 
URLEncoder.encode(id, "UTF-8");
+                    final String path = "/nifi-api/reporting-tasks/node/" + 
URLEncoder.encode(id, "UTF-8");
                     requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
                 } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
                     throw new ClusterRequestException(use);
                 }
 
                 // create the revision
-                RevisionDTO revisionDto = new RevisionDTO();
+                final RevisionDTO revisionDto = new RevisionDTO();
                 revisionDto.setClientId(revision.getClientId());
                 revisionDto.setVersion(revision.getVersion());
 
                 // create the reporting task entity
-                ReportingTaskEntity reportingTaskEntity = new 
ReportingTaskEntity();
+                final ReportingTaskEntity reportingTaskEntity = new 
ReportingTaskEntity();
                 reportingTaskEntity.setRevision(revisionDto);
 
                 // create the reporting task dto
-                ReportingTaskDTO reportingTaskDto = new ReportingTaskDTO();
+                final ReportingTaskDTO reportingTaskDto = new 
ReportingTaskDTO();
                 reportingTaskEntity.setComponent(reportingTaskDto);
                 reportingTaskDto.setId(id);
                 reportingTaskDto.setAnnotationData(annotationData);
@@ -756,7 +754,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
                 NodeResponse nodeResponse;
                 try {
                     nodeResponse = requestReplicator.replicate(HttpMethod.PUT, 
requestUrl, reportingTaskEntity, headers).awaitMergedResponse();
-                } catch (InterruptedException e) {
+                } catch (final InterruptedException e) {
                     throw new IllegalClusterStateException("Request was 
interrupted while waiting for response from node");
                 }
 
@@ -831,35 +829,35 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
         }
     }
 
-    public void setClusterCoordinator(ClusterCoordinator clusterCoordinator) {
+    public void setClusterCoordinator(final ClusterCoordinator 
clusterCoordinator) {
         this.clusterCoordinator = clusterCoordinator;
     }
 
-    public void setRequestReplicator(RequestReplicator requestReplicator) {
+    public void setRequestReplicator(final RequestReplicator 
requestReplicator) {
         this.requestReplicator = requestReplicator;
     }
 
-    public void setProperties(NiFiProperties properties) {
+    public void setProperties(final NiFiProperties properties) {
         this.properties = properties;
     }
 
-    public void setServiceFacade(NiFiServiceFacade serviceFacade) {
+    public void setServiceFacade(final NiFiServiceFacade serviceFacade) {
         this.serviceFacade = serviceFacade;
     }
 
-    public void setAuditService(AuditService auditService) {
+    public void setAuditService(final AuditService auditService) {
         this.auditService = auditService;
     }
 
-    public void setControllerServiceLookup(ControllerServiceLookup 
controllerServiceLookup) {
-        this.controllerServiceLookup = controllerServiceLookup;
+    public void setControllerServiceProvider(final ControllerServiceProvider 
controllerServiceProvider) {
+        this.controllerServiceProvider = controllerServiceProvider;
     }
 
-    public void setReportingTaskProvider(ReportingTaskProvider 
reportingTaskProvider) {
+    public void setReportingTaskProvider(final ReportingTaskProvider 
reportingTaskProvider) {
         this.reportingTaskProvider = reportingTaskProvider;
     }
 
-    public void setAuthorizer(Authorizer authorizer) {
+    public void setAuthorizer(final Authorizer authorizer) {
         this.authorizer = authorizer;
     }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/c955ec16/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
index 6dd3ecc..c99f98c 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
@@ -169,7 +169,7 @@ public final class DtoFactory {
     @SuppressWarnings("rawtypes")
     private final static Comparator<Class> CLASS_NAME_COMPARATOR = new 
Comparator<Class>() {
         @Override
-        public int compare(Class class1, Class class2) {
+        public int compare(final Class class1, final Class class2) {
             return 
Collator.getInstance(Locale.US).compare(class1.getSimpleName(), 
class2.getSimpleName());
         }
     };
@@ -297,8 +297,8 @@ public final class DtoFactory {
         historyDto.setLastRefreshed(history.getLastRefreshed());
 
         if (history.getActions() != null) {
-            List<ActionDTO> actionDtos = new ArrayList<>();
-            for (Action action : history.getActions()) {
+            final List<ActionDTO> actionDtos = new ArrayList<>();
+            for (final Action action : history.getActions()) {
                 actionDtos.add(createActionDto(action));
             }
             historyDto.setActions(actionDtos);
@@ -998,7 +998,7 @@ public final class DtoFactory {
      * @param originalSnippet snippet
      * @return dto
      */
-    public FlowSnippetDTO copySnippetContents(FlowSnippetDTO originalSnippet) {
+    public FlowSnippetDTO copySnippetContents(final FlowSnippetDTO 
originalSnippet) {
         final FlowSnippetDTO copySnippet = new FlowSnippetDTO();
 
         if (originalSnippet.getConnections() != null) {
@@ -1113,7 +1113,7 @@ public final class DtoFactory {
         // sort a copy of the properties
         final Map<PropertyDescriptor, String> sortedProperties = new 
TreeMap<>(new Comparator<PropertyDescriptor>() {
             @Override
-            public int compare(PropertyDescriptor o1, PropertyDescriptor o2) {
+            public int compare(final PropertyDescriptor o1, final 
PropertyDescriptor o2) {
                 return Collator.getInstance(Locale.US).compare(o1.getName(), 
o2.getName());
             }
         });
@@ -1124,7 +1124,7 @@ public final class DtoFactory {
         final Map<PropertyDescriptor, String> orderedProperties = new 
LinkedHashMap<>();
         final List<PropertyDescriptor> descriptors = 
reportingTask.getPropertyDescriptors();
         if (descriptors != null && !descriptors.isEmpty()) {
-            for (PropertyDescriptor descriptor : descriptors) {
+            for (final PropertyDescriptor descriptor : descriptors) {
                 orderedProperties.put(descriptor, null);
             }
         }
@@ -1137,7 +1137,7 @@ public final class DtoFactory {
             final PropertyDescriptor descriptor = entry.getKey();
 
             // store the property descriptor
-            dto.getDescriptors().put(descriptor.getName(), 
createPropertyDescriptorDto(descriptor, "root"));
+            dto.getDescriptors().put(descriptor.getName(), 
createPropertyDescriptorDto(descriptor, null));
 
             // determine the property value - don't include sensitive 
properties
             String propertyValue = entry.getValue();
@@ -1177,7 +1177,7 @@ public final class DtoFactory {
         // sort a copy of the properties
         final Map<PropertyDescriptor, String> sortedProperties = new 
TreeMap<>(new Comparator<PropertyDescriptor>() {
             @Override
-            public int compare(PropertyDescriptor o1, PropertyDescriptor o2) {
+            public int compare(final PropertyDescriptor o1, final 
PropertyDescriptor o2) {
                 return Collator.getInstance(Locale.US).compare(o1.getName(), 
o2.getName());
             }
         });
@@ -1188,7 +1188,7 @@ public final class DtoFactory {
         final Map<PropertyDescriptor, String> orderedProperties = new 
LinkedHashMap<>();
         final List<PropertyDescriptor> descriptors = 
controllerService.getPropertyDescriptors();
         if (descriptors != null && !descriptors.isEmpty()) {
-            for (PropertyDescriptor descriptor : descriptors) {
+            for (final PropertyDescriptor descriptor : descriptors) {
                 orderedProperties.put(descriptor, null);
             }
         }
@@ -1201,7 +1201,8 @@ public final class DtoFactory {
             final PropertyDescriptor descriptor = entry.getKey();
 
             // store the property descriptor
-            dto.getDescriptors().put(descriptor.getName(), 
createPropertyDescriptorDto(descriptor, 
controllerServiceNode.getProcessGroup().getIdentifier()));
+            final String groupId = controllerServiceNode.getProcessGroup() == 
null ? null : controllerServiceNode.getProcessGroup().getIdentifier();
+            dto.getDescriptors().put(descriptor.getName(), 
createPropertyDescriptorDto(descriptor, groupId));
 
             // determine the property value - don't include sensitive 
properties
             String propertyValue = entry.getValue();
@@ -1254,7 +1255,7 @@ public final class DtoFactory {
 
             propertyDescriptors = 
node.getControllerServiceImplementation().getPropertyDescriptors();
             validationErrors = node.getValidationErrors();
-            processGroupId = node.getProcessGroup().getIdentifier();
+            processGroupId = node.getProcessGroup() == null ? null : 
node.getProcessGroup().getIdentifier();
         } else if (component instanceof ReportingTaskNode) {
             final ReportingTaskNode node = ((ReportingTaskNode) component);
             dto.setState(node.getScheduledState().name());
@@ -1264,20 +1265,20 @@ public final class DtoFactory {
 
             propertyDescriptors = 
node.getReportingTask().getPropertyDescriptors();
             validationErrors = node.getValidationErrors();
-            processGroupId = "root";
+            processGroupId = null;
         }
 
         if (propertyDescriptors != null && !propertyDescriptors.isEmpty()) {
             final Map<PropertyDescriptor, String> sortedProperties = new 
TreeMap<>(new Comparator<PropertyDescriptor>() {
                 @Override
-                public int compare(PropertyDescriptor o1, PropertyDescriptor 
o2) {
+                public int compare(final PropertyDescriptor o1, final 
PropertyDescriptor o2) {
                     return 
Collator.getInstance(Locale.US).compare(o1.getName(), o2.getName());
                 }
             });
             sortedProperties.putAll(component.getProperties());
 
             final Map<PropertyDescriptor, String> orderedProperties = new 
LinkedHashMap<>();
-            for (PropertyDescriptor descriptor : propertyDescriptors) {
+            for (final PropertyDescriptor descriptor : propertyDescriptors) {
                 orderedProperties.put(descriptor, null);
             }
             orderedProperties.putAll(sortedProperties);
@@ -1717,7 +1718,7 @@ public final class DtoFactory {
         dto.setComments(group.getComments());
         dto.setName(group.getName());
 
-        ProcessGroup parentGroup = group.getParent();
+        final ProcessGroup parentGroup = group.getParent();
         if (parentGroup != null) {
             dto.setParentGroupId(parentGroup.getIdentifier());
         }
@@ -1886,7 +1887,7 @@ public final class DtoFactory {
         // sort the relationships
         Collections.sort(relationships, new Comparator<RelationshipDTO>() {
             @Override
-            public int compare(RelationshipDTO r1, RelationshipDTO r2) {
+            public int compare(final RelationshipDTO r1, final RelationshipDTO 
r2) {
                 return Collator.getInstance(Locale.US).compare(r1.getName(), 
r2.getName());
             }
         });
@@ -1923,7 +1924,7 @@ public final class DtoFactory {
         // sort the bulletins
         Collections.sort(bulletins, new Comparator<BulletinDTO>() {
             @Override
-            public int compare(BulletinDTO bulletin1, BulletinDTO bulletin2) {
+            public int compare(final BulletinDTO bulletin1, final BulletinDTO 
bulletin2) {
                 if (bulletin1 == null && bulletin2 == null) {
                     return 0;
                 } else if (bulletin1 == null) {
@@ -2260,7 +2261,7 @@ public final class DtoFactory {
         // sort a copy of the properties
         final Map<PropertyDescriptor, String> sortedProperties = new 
TreeMap<>(new Comparator<PropertyDescriptor>() {
             @Override
-            public int compare(PropertyDescriptor o1, PropertyDescriptor o2) {
+            public int compare(final PropertyDescriptor o1, final 
PropertyDescriptor o2) {
                 return Collator.getInstance(Locale.US).compare(o1.getName(), 
o2.getName());
             }
         });
@@ -2271,7 +2272,7 @@ public final class DtoFactory {
         final Map<PropertyDescriptor, String> orderedProperties = new 
LinkedHashMap<>();
         final List<PropertyDescriptor> descriptors = 
processor.getPropertyDescriptors();
         if (descriptors != null && !descriptors.isEmpty()) {
-            for (PropertyDescriptor descriptor : descriptors) {
+            for (final PropertyDescriptor descriptor : descriptors) {
                 orderedProperties.put(descriptor, null);
             }
         }
@@ -2798,7 +2799,7 @@ public final class DtoFactory {
      * @param lastMod mod
      * @return dto
      */
-    public RevisionDTO createRevisionDTO(FlowModification lastMod) {
+    public RevisionDTO createRevisionDTO(final FlowModification lastMod) {
         final Revision revision = lastMod.getRevision();
 
         // create the dto
@@ -2817,7 +2818,7 @@ public final class DtoFactory {
         return dto;
     }
 
-    public NodeDTO createNodeDTO(NodeIdentifier nodeId, NodeConnectionStatus 
status, NodeHeartbeat nodeHeartbeat, List<NodeEvent> events, boolean primary) {
+    public NodeDTO createNodeDTO(final NodeIdentifier nodeId, final 
NodeConnectionStatus status, final NodeHeartbeat nodeHeartbeat, final 
List<NodeEvent> events, final boolean primary) {
         final NodeDTO nodeDto = new NodeDTO();
 
         // populate node dto
@@ -2844,7 +2845,7 @@ public final class DtoFactory {
         final List<NodeEvent> nodeEvents = new ArrayList<>(events);
         Collections.sort(nodeEvents, new Comparator<NodeEvent>() {
             @Override
-            public int compare(NodeEvent event1, NodeEvent event2) {
+            public int compare(final NodeEvent event1, final NodeEvent event2) 
{
                 return new Date(event2.getTimestamp()).compareTo(new 
Date(event1.getTimestamp()));
             }
         });
@@ -2868,15 +2869,15 @@ public final class DtoFactory {
 
 
     /* setters */
-    public void setControllerServiceProvider(ControllerServiceProvider 
controllerServiceProvider) {
+    public void setControllerServiceProvider(final ControllerServiceProvider 
controllerServiceProvider) {
         this.controllerServiceProvider = controllerServiceProvider;
     }
 
-    public void setAuthorizer(Authorizer authorizer) {
+    public void setAuthorizer(final Authorizer authorizer) {
         this.authorizer = authorizer;
     }
 
-    public void setEntityFactory(EntityFactory entityFactory) {
+    public void setEntityFactory(final EntityFactory entityFactory) {
         this.entityFactory = entityFactory;
     }
 

Reply via email to